From b7d6160b80f417137bc480137b946c91f3272bf5 Mon Sep 17 00:00:00 2001 From: Curtis J Bezault Date: Wed, 12 Jun 2019 14:18:43 -0700 Subject: [icu] Enable parallel builds (#6695) * Add VCPKG_NUM_LOGICAL_CORES * break out logic that retries running a command several times into its own function * Parallelize icu --- toolsrc/include/vcpkg/base/system.h | 2 ++ toolsrc/src/vcpkg/base/system.cpp | 5 +++++ toolsrc/src/vcpkg/build.cpp | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg/base/system.h b/toolsrc/include/vcpkg/base/system.h index 0245b684a..907a692a2 100644 --- a/toolsrc/include/vcpkg/base/system.h +++ b/toolsrc/include/vcpkg/base/system.h @@ -28,4 +28,6 @@ namespace vcpkg::System const Optional& get_program_files_32_bit(); const Optional& get_program_files_platform_bitness(); + + int get_num_logical_cores(); } diff --git a/toolsrc/src/vcpkg/base/system.cpp b/toolsrc/src/vcpkg/base/system.cpp index 48a701bfa..a11853524 100644 --- a/toolsrc/src/vcpkg/base/system.cpp +++ b/toolsrc/src/vcpkg/base/system.cpp @@ -596,6 +596,11 @@ namespace vcpkg #else void System::register_console_ctrl_handler() {} #endif + + int System::get_num_logical_cores() + { + return std::thread::hardware_concurrency(); + } } namespace vcpkg::Debug diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp index 7bd6f467b..0a7c854b5 100644 --- a/toolsrc/src/vcpkg/build.cpp +++ b/toolsrc/src/vcpkg/build.cpp @@ -334,6 +334,23 @@ namespace vcpkg::Build return ret; } + static int get_concurrency() + { + static int concurrency = []{ + auto user_defined_concurrency = System::get_environment_variable("VCPKG_MAX_CONCURRENCY"); + if (user_defined_concurrency) + { + return std::stoi(user_defined_concurrency.value_or_exit(VCPKG_LINE_INFO)); + } + else + { + return System::get_num_logical_cores() + 1; + } + }(); + + return concurrency; + } + static ExtendedBuildResult do_build_package(const VcpkgPaths& paths, const PreBuildInfo& pre_build_info, const PackageSpec& spec, @@ -372,6 +389,7 @@ namespace vcpkg::Build {"_VCPKG_DOWNLOAD_TOOL", to_string(config.build_package_options.download_tool)}, {"FEATURES", Strings::join(";", config.feature_list)}, {"ALL_FEATURES", all_features}, + {"VCPKG_CONCURRENCY", std::to_string(get_concurrency())}, }; if (!System::get_environment_variable("VCPKG_FORCE_SYSTEM_BINARIES").has_value()) -- cgit v1.2.3 From 8c49e565c0eb565fd76df76144dd78d70a211d6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20D=C3=B6nmez?= Date: Thu, 13 Jun 2019 01:30:03 +0200 Subject: Protect #pragma comment(lib, "foo") with _WIN32 checks (#6867) lld on Linux can now process #pragma comment(lib, "foo") macros which results in build failures on Linux when lld is used. Fix this by protecting these macros with _WIN32 checks. --- toolsrc/src/tests.arguments.cpp | 4 +++- toolsrc/src/tests.dependencies.cpp | 2 ++ toolsrc/src/tests.packagespec.cpp | 2 ++ toolsrc/src/tests.paragraph.cpp | 2 ++ toolsrc/src/vcpkg.cpp | 2 ++ toolsrc/src/vcpkg/base/system.cpp | 2 ++ toolsrc/src/vcpkg/metrics.cpp | 2 ++ 7 files changed, 15 insertions(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/src/tests.arguments.cpp b/toolsrc/src/tests.arguments.cpp index 72bdbdb65..51ababd3d 100644 --- a/toolsrc/src/tests.arguments.cpp +++ b/toolsrc/src/tests.arguments.cpp @@ -1,7 +1,9 @@ #include "tests.pch.h" +#if defined(_WIN32) #pragma comment(lib, "version") #pragma comment(lib, "winhttp") +#endif using namespace Microsoft::VisualStudio::CppUnitTestFramework; @@ -61,4 +63,4 @@ namespace UnitTest1 Assert::AreEqual(size_t{0}, v.command_arguments.size()); } }; -} \ No newline at end of file +} diff --git a/toolsrc/src/tests.dependencies.cpp b/toolsrc/src/tests.dependencies.cpp index f82fad4e4..7d8283ed6 100644 --- a/toolsrc/src/tests.dependencies.cpp +++ b/toolsrc/src/tests.dependencies.cpp @@ -1,7 +1,9 @@ #include "tests.pch.h" +#if defined(_WIN32) #pragma comment(lib, "version") #pragma comment(lib, "winhttp") +#endif using namespace Microsoft::VisualStudio::CppUnitTestFramework; diff --git a/toolsrc/src/tests.packagespec.cpp b/toolsrc/src/tests.packagespec.cpp index 32ad81227..d3bc18c79 100644 --- a/toolsrc/src/tests.packagespec.cpp +++ b/toolsrc/src/tests.packagespec.cpp @@ -2,8 +2,10 @@ #include +#if defined(_WIN32) #pragma comment(lib, "version") #pragma comment(lib, "winhttp") +#endif using namespace Microsoft::VisualStudio::CppUnitTestFramework; diff --git a/toolsrc/src/tests.paragraph.cpp b/toolsrc/src/tests.paragraph.cpp index 9a56ad9ee..e99d07694 100644 --- a/toolsrc/src/tests.paragraph.cpp +++ b/toolsrc/src/tests.paragraph.cpp @@ -1,7 +1,9 @@ #include "tests.pch.h" +#if defined(_WIN32) #pragma comment(lib, "version") #pragma comment(lib, "winhttp") +#endif using namespace Microsoft::VisualStudio::CppUnitTestFramework; diff --git a/toolsrc/src/vcpkg.cpp b/toolsrc/src/vcpkg.cpp index ab7586eeb..e02bdc71f 100644 --- a/toolsrc/src/vcpkg.cpp +++ b/toolsrc/src/vcpkg.cpp @@ -40,8 +40,10 @@ #include #include +#if defined(_WIN32) #pragma comment(lib, "ole32") #pragma comment(lib, "shell32") +#endif using namespace vcpkg; diff --git a/toolsrc/src/vcpkg/base/system.cpp b/toolsrc/src/vcpkg/base/system.cpp index a11853524..3d89d2fd4 100644 --- a/toolsrc/src/vcpkg/base/system.cpp +++ b/toolsrc/src/vcpkg/base/system.cpp @@ -16,7 +16,9 @@ #include #endif +#if defined(_WIN32) #pragma comment(lib, "Advapi32") +#endif using namespace vcpkg::System; diff --git a/toolsrc/src/vcpkg/metrics.cpp b/toolsrc/src/vcpkg/metrics.cpp index 5ca2b056a..9dd520ed6 100644 --- a/toolsrc/src/vcpkg/metrics.cpp +++ b/toolsrc/src/vcpkg/metrics.cpp @@ -9,8 +9,10 @@ #include #include +#if defined(_WIN32) #pragma comment(lib, "version") #pragma comment(lib, "winhttp") +#endif namespace vcpkg::Metrics { -- cgit v1.2.3 From e5b92a39116791cfd4e1f4931221c9f69125bae3 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Wed, 19 Jun 2019 11:49:57 -0700 Subject: [vcpkg] Improve vcpkg::Files::Filesystem error handling (#6919) * [vcpkg] Modify Filesystem::remove and Filesystem::rename to not throw. * [.gitignore] Ignore new VS2019 CMake integration default location * [.gitignore] Ignore CMakeSettings.json in toolsrc * [vcpkg] Time external processes called with System::cmd_execute * [vcpkg] Work around VS2019 CMake bug * [vcpkg] Fix several unused variable warnings. * [vcpkg] Improve error handling in vcpkg::Files::Filesystem Always require either std::error_code or LineInfo to print better errors. * [vcpkg] Fixup missing return value. Drive by fix: silence warnings in tests. * [vcpkg] Fix exiting in error_code overload Drive by fixes for /analyze with VS2019 --- toolsrc/CMakeLists.txt | 2 +- toolsrc/include/tests.utils.h | 8 ++--- toolsrc/include/vcpkg/base/files.h | 14 ++++---- toolsrc/include/vcpkg/base/graphs.h | 4 +-- toolsrc/include/vcpkg/base/optional.h | 23 +++++++++--- toolsrc/include/vcpkg/base/strings.h | 2 +- toolsrc/src/vcpkg/base/downloads.cpp | 16 +++------ toolsrc/src/vcpkg/base/files.cpp | 61 ++++++++++++++++++++++++++------ toolsrc/src/vcpkg/base/strings.cpp | 2 +- toolsrc/src/vcpkg/base/system.cpp | 13 +++++-- toolsrc/src/vcpkg/build.cpp | 24 ++++++------- toolsrc/src/vcpkg/commands.ci.cpp | 4 +-- toolsrc/src/vcpkg/commands.exportifw.cpp | 24 ++++++++----- toolsrc/src/vcpkg/commands.import.cpp | 2 +- toolsrc/src/vcpkg/commands.integrate.cpp | 22 ++++++------ toolsrc/src/vcpkg/dependencies.cpp | 11 +++--- toolsrc/src/vcpkg/export.cpp | 4 +-- toolsrc/src/vcpkg/help.cpp | 2 +- toolsrc/src/vcpkg/install.cpp | 15 +++++--- toolsrc/src/vcpkg/remove.cpp | 2 +- toolsrc/src/vcpkg/tools.cpp | 6 +++- toolsrc/src/vcpkg/update.cpp | 2 +- toolsrc/src/vcpkg/vcpkglib.cpp | 16 ++++----- 23 files changed, 178 insertions(+), 101 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/CMakeLists.txt b/toolsrc/CMakeLists.txt index b3ec4d15d..fccf2b7ad 100644 --- a/toolsrc/CMakeLists.txt +++ b/toolsrc/CMakeLists.txt @@ -20,7 +20,7 @@ If you would like to try anyway, pass --allowAppleClang to bootstrap.sh.") elseif(CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang") set(CLANG 1) elseif(MSVC) - add_compile_options(/std:c++17) + add_compile_options(/std:c++17 /FC) else() message(FATAL_ERROR "Unknown compiler: ${CMAKE_CXX_COMPILER_ID}") endif() diff --git a/toolsrc/include/tests.utils.h b/toolsrc/include/tests.utils.h index 7f7ec9e88..3e8514e67 100644 --- a/toolsrc/include/tests.utils.h +++ b/toolsrc/include/tests.utils.h @@ -13,7 +13,7 @@ namespace Microsoft::VisualStudio::CppUnitTestFramework { template<> - std::wstring ToString(const vcpkg::Dependencies::InstallPlanType& t) + inline std::wstring ToString(const vcpkg::Dependencies::InstallPlanType& t) { switch (t) { @@ -26,7 +26,7 @@ namespace Microsoft::VisualStudio::CppUnitTestFramework } template<> - std::wstring ToString(const vcpkg::Dependencies::RequestType& t) + inline std::wstring ToString(const vcpkg::Dependencies::RequestType& t) { switch (t) { @@ -38,13 +38,13 @@ namespace Microsoft::VisualStudio::CppUnitTestFramework } template<> - std::wstring ToString(const vcpkg::PackageSpecParseResult& t) + inline std::wstring ToString(const vcpkg::PackageSpecParseResult& t) { return ToString(static_cast(t)); } template<> - std::wstring ToString(const vcpkg::PackageSpec& t) + inline std::wstring ToString(const vcpkg::PackageSpec& t) { return ToString(t.to_string()); } diff --git a/toolsrc/include/vcpkg/base/files.h b/toolsrc/include/vcpkg/base/files.h index b07ff25b3..02e2b8db8 100644 --- a/toolsrc/include/vcpkg/base/files.h +++ b/toolsrc/include/vcpkg/base/files.h @@ -27,21 +27,25 @@ namespace vcpkg::Files { struct Filesystem { + std::string read_contents(const fs::path& file_path, LineInfo linfo) const; virtual Expected read_contents(const fs::path& file_path) const = 0; virtual Expected> read_lines(const fs::path& file_path) const = 0; virtual fs::path find_file_recursively_up(const fs::path& starting_dir, const std::string& filename) const = 0; virtual std::vector get_files_recursive(const fs::path& dir) const = 0; virtual std::vector get_files_non_recursive(const fs::path& dir) const = 0; - - virtual void write_lines(const fs::path& file_path, const std::vector& lines) = 0; + void write_lines(const fs::path& file_path, const std::vector& lines, LineInfo linfo); + virtual void write_lines(const fs::path& file_path, + const std::vector& lines, + std::error_code& ec) = 0; + void write_contents(const fs::path& path, const std::string& data, LineInfo linfo); virtual void write_contents(const fs::path& file_path, const std::string& data, std::error_code& ec) = 0; - virtual void rename(const fs::path& oldpath, const fs::path& newpath) = 0; + void rename(const fs::path& oldpath, const fs::path& newpath, LineInfo linfo); virtual void rename(const fs::path& oldpath, const fs::path& newpath, std::error_code& ec) = 0; virtual void rename_or_copy(const fs::path& oldpath, const fs::path& newpath, StringLiteral temp_suffix, std::error_code& ec) = 0; - virtual bool remove(const fs::path& path) = 0; + bool remove(const fs::path& path, LineInfo linfo); virtual bool remove(const fs::path& path, std::error_code& ec) = 0; virtual std::uintmax_t remove_all(const fs::path& path, std::error_code& ec) = 0; virtual bool exists(const fs::path& path) const = 0; @@ -60,8 +64,6 @@ namespace vcpkg::Files virtual fs::file_status symlink_status(const fs::path& path, std::error_code& ec) const = 0; virtual std::vector find_from_PATH(const std::string& name) const = 0; - - void write_contents(const fs::path& file_path, const std::string& data); }; Filesystem& get_real_filesystem(); diff --git a/toolsrc/include/vcpkg/base/graphs.h b/toolsrc/include/vcpkg/base/graphs.h index 46831a911..9901a49a0 100644 --- a/toolsrc/include/vcpkg/base/graphs.h +++ b/toolsrc/include/vcpkg/base/graphs.h @@ -44,9 +44,9 @@ namespace vcpkg::Graphs void shuffle(Container& c, Randomizer* r) { if (!r) return; - for (int i = static_cast(c.size()); i > 1; --i) + for (auto i = c.size(); i > 1; --i) { - auto j = r->random(i); + auto j = r->random(static_cast(i)); if (j != i - 1) { std::swap(c[i - 1], c[j]); diff --git a/toolsrc/include/vcpkg/base/optional.h b/toolsrc/include/vcpkg/base/optional.h index 4d386a961..2d8c126c6 100644 --- a/toolsrc/include/vcpkg/base/optional.h +++ b/toolsrc/include/vcpkg/base/optional.h @@ -19,6 +19,9 @@ namespace vcpkg template::value> struct OptionalStorage { +#if defined(_WIN32) +#pragma warning(suppress : 26495) +#endif constexpr OptionalStorage() noexcept : m_is_present(false), m_inactive() {} constexpr OptionalStorage(const T& t) : m_is_present(true), m_t(t) {} constexpr OptionalStorage(T&& t) : m_is_present(true), m_t(std::move(t)) {} @@ -28,12 +31,18 @@ namespace vcpkg if (m_is_present) m_t.~T(); } +#if defined(_WIN32) +#pragma warning(suppress : 26495) +#endif OptionalStorage(const OptionalStorage& o) : m_is_present(o.m_is_present), m_inactive() { if (m_is_present) new (&m_t) T(o.m_t); } - OptionalStorage(OptionalStorage&& o) : m_is_present(o.m_is_present), m_inactive() +#if defined(_WIN32) +#pragma warning(suppress : 26495) +#endif + OptionalStorage(OptionalStorage&& o) noexcept : m_is_present(o.m_is_present), m_inactive() { if (m_is_present) { @@ -59,7 +68,7 @@ namespace vcpkg return *this; } - OptionalStorage& operator=(OptionalStorage&& o) + OptionalStorage& operator=(OptionalStorage&& o) noexcept { if (m_is_present && o.m_is_present) { @@ -100,6 +109,9 @@ namespace vcpkg template struct OptionalStorage { +#if defined(_WIN32) +#pragma warning(suppress : 26495) +#endif constexpr OptionalStorage() noexcept : m_is_present(false), m_inactive() {} constexpr OptionalStorage(T&& t) : m_is_present(true), m_t(std::move(t)) {} @@ -108,7 +120,10 @@ namespace vcpkg if (m_is_present) m_t.~T(); } - OptionalStorage(OptionalStorage&& o) : m_is_present(o.m_is_present), m_inactive() +#if defined(_WIN32) +#pragma warning(suppress : 26495) +#endif + OptionalStorage(OptionalStorage&& o) noexcept : m_is_present(o.m_is_present), m_inactive() { if (m_is_present) { @@ -116,7 +131,7 @@ namespace vcpkg } } - OptionalStorage& operator=(OptionalStorage&& o) + OptionalStorage& operator=(OptionalStorage&& o) noexcept { if (m_is_present && o.m_is_present) { diff --git a/toolsrc/include/vcpkg/base/strings.h b/toolsrc/include/vcpkg/base/strings.h index 3a9de97df..d553d1d41 100644 --- a/toolsrc/include/vcpkg/base/strings.h +++ b/toolsrc/include/vcpkg/base/strings.h @@ -163,7 +163,7 @@ namespace vcpkg::Strings std::vector split(const std::string& s, const std::string& delimiter); - std::vector split(const std::string& s, const std::string& delimiter, int max_count); + std::vector split(const std::string& s, const std::string& delimiter, size_t max_count); std::vector find_all_enclosed(StringView input, StringView left_delim, StringView right_delim); diff --git a/toolsrc/src/vcpkg/base/downloads.cpp b/toolsrc/src/vcpkg/base/downloads.cpp index 218ff86b3..4bb2178e5 100644 --- a/toolsrc/src/vcpkg/base/downloads.cpp +++ b/toolsrc/src/vcpkg/base/downloads.cpp @@ -105,7 +105,7 @@ namespace vcpkg::Downloads bResults = WinHttpQueryDataAvailable(hRequest, &dwSize); Checks::check_exit(VCPKG_LINE_INFO, bResults, "WinHttpQueryDataAvailable() failed: %d", GetLastError()); - if (buf.size() < dwSize) buf.resize(dwSize * 2); + if (buf.size() < dwSize) buf.resize(static_cast(dwSize) * 2); bResults = WinHttpReadData(hRequest, (LPVOID)buf.data(), dwSize, &downloaded_size); Checks::check_exit(VCPKG_LINE_INFO, bResults, "WinHttpReadData() failed: %d", GetLastError()); @@ -157,9 +157,10 @@ namespace vcpkg::Downloads const std::string& sha512) { const std::string download_path_part = download_path.u8string() + ".part"; + auto download_path_part_path = fs::u8path(download_path_part); std::error_code ec; fs.remove(download_path, ec); - fs.remove(download_path_part, ec); + fs.remove(download_path_part_path, ec); #if defined(_WIN32) auto url_no_proto = url.substr(8); // drop https:// auto path_begin = Util::find(url_no_proto, '/'); @@ -173,14 +174,7 @@ namespace vcpkg::Downloads Checks::check_exit(VCPKG_LINE_INFO, code == 0, "Could not download %s", url); #endif - verify_downloaded_file_hash(fs, url, download_path_part, sha512); - fs.rename(download_path_part, download_path, ec); - Checks::check_exit(VCPKG_LINE_INFO, - !ec, - "Failed to do post-download rename-in-place.\n" - "fs.rename(%s, %s, %s)", - download_path_part, - download_path.u8string(), - ec.message()); + verify_downloaded_file_hash(fs, url, download_path_part_path, sha512); + fs.rename(download_path_part_path, download_path, VCPKG_LINE_INFO); } } diff --git a/toolsrc/src/vcpkg/base/files.cpp b/toolsrc/src/vcpkg/base/files.cpp index 0396a2415..5099795e9 100644 --- a/toolsrc/src/vcpkg/base/files.cpp +++ b/toolsrc/src/vcpkg/base/files.cpp @@ -24,12 +24,43 @@ namespace vcpkg::Files { static const std::regex FILESYSTEM_INVALID_CHARACTERS_REGEX = std::regex(R"([\/:*?"<>|])"); - void Filesystem::write_contents(const fs::path& file_path, const std::string& data) + std::string Filesystem::read_contents(const fs::path& path, LineInfo linfo) const + { + auto maybe_contents = this->read_contents(path); + if (auto p = maybe_contents.get()) + return std::move(*p); + else + Checks::exit_with_message( + linfo, "error reading file: %s: %s", path.u8string(), maybe_contents.error().message()); + } + void Filesystem::write_contents(const fs::path& path, const std::string& data, LineInfo linfo) + { + std::error_code ec; + this->write_contents(path, data, ec); + if (ec) Checks::exit_with_message(linfo, "error writing file: %s: %s", path.u8string(), ec.message()); + } + void Filesystem::rename(const fs::path& oldpath, const fs::path& newpath, LineInfo linfo) + { + std::error_code ec; + this->rename(oldpath, newpath, ec); + if (ec) + Checks::exit_with_message( + linfo, "error renaming file: %s: %s: %s", oldpath.u8string(), newpath.u8string(), ec.message()); + } + + bool Filesystem::remove(const fs::path& path, LineInfo linfo) { std::error_code ec; - write_contents(file_path, data, ec); - Checks::check_exit( - VCPKG_LINE_INFO, !ec, "error while writing file: %s: %s", file_path.u8string(), ec.message()); + auto r = this->remove(path, ec); + if (ec) Checks::exit_with_message(linfo, "error removing file: %s: %s", path.u8string(), ec.message()); + return r; + } + + void Filesystem::write_lines(const fs::path& path, const std::vector& lines, LineInfo linfo) + { + std::error_code ec; + this->write_lines(path, lines, ec); + if (ec) Checks::exit_with_message(linfo, "error writing lines: %s: %s", path.u8string(), ec.message()); } struct RealFilesystem final : Filesystem @@ -147,30 +178,39 @@ namespace vcpkg::Files return ret; } - virtual void write_lines(const fs::path& file_path, const std::vector& lines) override + virtual void write_lines(const fs::path& file_path, + const std::vector& lines, + std::error_code& ec) override { std::fstream output(file_path, std::ios_base::out | std::ios_base::binary | std::ios_base::trunc); + if (!output) + { + ec.assign(errno, std::generic_category()); + return; + } for (const std::string& line : lines) { output << line << "\n"; + if (!output) + { + output.close(); + ec.assign(errno, std::generic_category()); + return; + } } output.close(); } - virtual void rename(const fs::path& oldpath, const fs::path& newpath, std::error_code& ec) override { fs::stdfs::rename(oldpath, newpath, ec); } - virtual void rename(const fs::path& oldpath, const fs::path& newpath) override - { - fs::stdfs::rename(oldpath, newpath); - } virtual void rename_or_copy(const fs::path& oldpath, const fs::path& newpath, StringLiteral temp_suffix, std::error_code& ec) override { this->rename(oldpath, newpath, ec); + Util::unused(temp_suffix); #if defined(__linux__) || defined(__APPLE__) if (ec) { @@ -213,7 +253,6 @@ namespace vcpkg::Files } #endif } - virtual bool remove(const fs::path& path) override { return fs::stdfs::remove(path); } virtual bool remove(const fs::path& path, std::error_code& ec) override { return fs::stdfs::remove(path, ec); } virtual std::uintmax_t remove_all(const fs::path& path, std::error_code& ec) override { diff --git a/toolsrc/src/vcpkg/base/strings.cpp b/toolsrc/src/vcpkg/base/strings.cpp index ce634a227..54a74a7a1 100644 --- a/toolsrc/src/vcpkg/base/strings.cpp +++ b/toolsrc/src/vcpkg/base/strings.cpp @@ -185,7 +185,7 @@ std::vector Strings::split(const std::string& s, const std::string& return output; } -std::vector Strings::split(const std::string& s, const std::string& delimiter, int max_count) +std::vector Strings::split(const std::string& s, const std::string& delimiter, size_t max_count) { std::vector output; diff --git a/toolsrc/src/vcpkg/base/system.cpp b/toolsrc/src/vcpkg/base/system.cpp index 3d89d2fd4..c5ff050f0 100644 --- a/toolsrc/src/vcpkg/base/system.cpp +++ b/toolsrc/src/vcpkg/base/system.cpp @@ -388,6 +388,7 @@ namespace vcpkg // Flush stdout before launching external process fflush(nullptr); + auto timer = Chrono::ElapsedTimer::create_started(); #if defined(_WIN32) // We are wrap the command line in quotes to cause cmd.exe to correctly process it auto actual_cmd_line = Strings::concat('"', cmd_line, '"'); @@ -395,11 +396,19 @@ namespace vcpkg g_ctrl_c_state.transition_to_spawn_process(); const int exit_code = _wsystem(Strings::to_utf16(actual_cmd_line).c_str()); g_ctrl_c_state.transition_from_spawn_process(); - Debug::print("_wsystem() returned ", exit_code, '\n'); + Debug::print("_wsystem() returned ", + exit_code, + " after ", + Strings::format("%8d", static_cast(timer.microseconds())), + " us\n"); #else Debug::print("_system(", cmd_line, ")\n"); const int exit_code = system(cmd_line.c_str()); - Debug::print("_system() returned ", exit_code, '\n'); + Debug::print("_system() returned ", + exit_code, + " after ", + Strings::format("%8d", static_cast(timer.microseconds())), + " us\n"); #endif return exit_code; } diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp index 0a7c854b5..daff7e6c8 100644 --- a/toolsrc/src/vcpkg/build.cpp +++ b/toolsrc/src/vcpkg/build.cpp @@ -280,7 +280,7 @@ namespace vcpkg::Build start += "\n" + Strings::serialize(feature); } const fs::path binary_control_file = paths.packages / bcf.core_paragraph.dir() / "CONTROL"; - paths.get_filesystem().write_contents(binary_control_file, start); + paths.get_filesystem().write_contents(binary_control_file, start, VCPKG_LINE_INFO); } static std::vector compute_required_feature_specs(const BuildPackageConfig& config, @@ -336,16 +336,16 @@ namespace vcpkg::Build static int get_concurrency() { - static int concurrency = []{ - auto user_defined_concurrency = System::get_environment_variable("VCPKG_MAX_CONCURRENCY"); - if (user_defined_concurrency) - { - return std::stoi(user_defined_concurrency.value_or_exit(VCPKG_LINE_INFO)); - } - else - { - return System::get_num_logical_cores() + 1; - } + static int concurrency = [] { + auto user_defined_concurrency = System::get_environment_variable("VCPKG_MAX_CONCURRENCY"); + if (user_defined_concurrency) + { + return std::stoi(user_defined_concurrency.value_or_exit(VCPKG_LINE_INFO)); + } + else + { + return System::get_num_logical_cores() + 1; + } }(); return concurrency; @@ -565,7 +565,7 @@ namespace vcpkg::Build std::error_code ec; fs.create_directories(paths.buildtrees / name, ec); const auto abi_file_path = paths.buildtrees / name / (triplet.canonical_name() + ".vcpkg_abi_info.txt"); - fs.write_contents(abi_file_path, full_abi_info); + fs.write_contents(abi_file_path, full_abi_info, VCPKG_LINE_INFO); return AbiTagAndFile{Hash::get_file_hash(fs, abi_file_path, "SHA1"), abi_file_path}; } diff --git a/toolsrc/src/vcpkg/commands.ci.cpp b/toolsrc/src/vcpkg/commands.ci.cpp index ff7e7a134..de66d917b 100644 --- a/toolsrc/src/vcpkg/commands.ci.cpp +++ b/toolsrc/src/vcpkg/commands.ci.cpp @@ -485,11 +485,11 @@ namespace vcpkg::Commands::CI System::print2("Total elapsed time: ", result.summary.total_elapsed_time, "\n"); result.summary.print(); } - + auto& fs = paths.get_filesystem(); auto it_xunit = options.settings.find(OPTION_XUNIT); if (it_xunit != options.settings.end()) { - paths.get_filesystem().write_contents(fs::u8path(it_xunit->second), xunitTestResults.build_xml()); + fs.write_contents(fs::u8path(it_xunit->second), xunitTestResults.build_xml(), VCPKG_LINE_INFO); } Checks::exit_success(VCPKG_LINE_INFO); diff --git a/toolsrc/src/vcpkg/commands.exportifw.cpp b/toolsrc/src/vcpkg/commands.exportifw.cpp index ba9e28233..f0946110c 100644 --- a/toolsrc/src/vcpkg/commands.exportifw.cpp +++ b/toolsrc/src/vcpkg/commands.exportifw.cpp @@ -106,7 +106,8 @@ namespace vcpkg::Export::IFW create_release_date(), action.spec.name(), action.spec.triplet().canonical_name(), - deps)); + deps), + VCPKG_LINE_INFO); // Return dir path for export package data return ifw_packages_dir_path / @@ -138,7 +139,8 @@ namespace vcpkg::Export::IFW %s )###", - create_release_date())); + create_release_date()), + VCPKG_LINE_INFO); for (const auto& unique_package : unique_packages) { @@ -167,7 +169,8 @@ namespace vcpkg::Export::IFW action.spec.name(), safe_rich_from_plain_text(binary_paragraph.description), binary_paragraph.version, - create_release_date())); + create_release_date()), + VCPKG_LINE_INFO); } } @@ -195,7 +198,8 @@ namespace vcpkg::Export::IFW %s )###", - create_release_date())); + create_release_date()), + VCPKG_LINE_INFO); for (const std::string& triplet : unique_triplets) { @@ -217,7 +221,8 @@ namespace vcpkg::Export::IFW )###", triplet, - create_release_date())); + create_release_date()), + VCPKG_LINE_INFO); } } @@ -243,7 +248,8 @@ namespace vcpkg::Export::IFW %s )###", - create_release_date())); + create_release_date()), + VCPKG_LINE_INFO); } void export_config(const std::string& export_id, const Options& ifw_options, const VcpkgPaths& paths) @@ -283,7 +289,8 @@ namespace vcpkg::Export::IFW @RootDir@/src/vcpkg%s )###", - formatted_repo_url)); + formatted_repo_url), + VCPKG_LINE_INFO); } void export_maintenance_tool(const fs::path& ifw_packages_dir_path, const VcpkgPaths& paths) @@ -325,7 +332,8 @@ namespace vcpkg::Export::IFW true )###", - create_release_date())); + create_release_date()), + VCPKG_LINE_INFO); const fs::path script_source = paths.root / "scripts" / "ifw" / "maintenance.qs"; const fs::path script_destination = ifw_packages_dir_path / "maintenance" / "meta" / "maintenance.qs"; fs.copy_file(script_source, script_destination, fs::copy_options::overwrite_existing, ec); diff --git a/toolsrc/src/vcpkg/commands.import.cpp b/toolsrc/src/vcpkg/commands.import.cpp index f03140fbd..40f5a434c 100644 --- a/toolsrc/src/vcpkg/commands.import.cpp +++ b/toolsrc/src/vcpkg/commands.import.cpp @@ -89,7 +89,7 @@ namespace vcpkg::Commands::Import place_library_files_in(paths.get_filesystem(), include_directory, project_directory, library_destination_path); const fs::path control_file_path = library_destination_path / "CONTROL"; - fs.write_contents(control_file_path, Strings::serialize(control_file_data)); + fs.write_contents(control_file_path, Strings::serialize(control_file_data), VCPKG_LINE_INFO); } const CommandStructure COMMAND_STRUCTURE = { diff --git a/toolsrc/src/vcpkg/commands.integrate.cpp b/toolsrc/src/vcpkg/commands.integrate.cpp index ef555a844..6921a5390 100644 --- a/toolsrc/src/vcpkg/commands.integrate.cpp +++ b/toolsrc/src/vcpkg/commands.integrate.cpp @@ -209,7 +209,7 @@ namespace vcpkg::Commands::Integrate if (should_install_system) { const fs::path sys_src_path = tmp_dir / "vcpkg.system.targets"; - fs.write_contents(sys_src_path, create_system_targets_shortcut()); + fs.write_contents(sys_src_path, create_system_targets_shortcut(), VCPKG_LINE_INFO); const std::string param = Strings::format(R"(/c mkdir "%s" & copy "%s" "%s" /Y > nul)", SYSTEM_WIDE_TARGETS_FILE.parent_path().string(), @@ -248,7 +248,8 @@ namespace vcpkg::Commands::Integrate const fs::path appdata_src_path = tmp_dir / "vcpkg.user.targets"; fs.write_contents(appdata_src_path, - create_appdata_targets_shortcut(paths.buildsystems_msbuild_targets.u8string())); + create_appdata_targets_shortcut(paths.buildsystems_msbuild_targets.u8string()), + VCPKG_LINE_INFO); auto appdata_dst_path = get_appdata_targets_path(); const auto rc = fs.copy_file(appdata_src_path, appdata_dst_path, fs::copy_options::overwrite_existing, ec); @@ -268,12 +269,7 @@ namespace vcpkg::Commands::Integrate const auto pathtxt = get_path_txt_path(); std::error_code ec; - fs.write_contents(pathtxt, paths.root.generic_u8string(), ec); - if (ec) - { - System::print2(System::Color::error, "Error: Failed to write file: ", pathtxt.u8string(), "\n"); - Checks::exit_fail(VCPKG_LINE_INFO); - } + fs.write_contents(pathtxt, paths.root.generic_u8string(), VCPKG_LINE_INFO); System::print2(System::Color::success, "Applied user-wide integration for this vcpkg root.\n"); const fs::path cmake_toolchain = paths.buildsystems / "vcpkg.cmake"; @@ -344,9 +340,11 @@ CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=%s" const std::string nuget_id = get_nuget_id(paths.root); const std::string nupkg_version = "1.0.0"; - fs.write_contents(targets_file_path, create_nuget_targets_file_contents(paths.buildsystems_msbuild_targets)); - fs.write_contents(props_file_path, create_nuget_props_file_contents()); - fs.write_contents(nuspec_file_path, create_nuspec_file_contents(paths.root, nuget_id, nupkg_version)); + fs.write_contents( + targets_file_path, create_nuget_targets_file_contents(paths.buildsystems_msbuild_targets), VCPKG_LINE_INFO); + fs.write_contents(props_file_path, create_nuget_props_file_contents(), VCPKG_LINE_INFO); + fs.write_contents( + nuspec_file_path, create_nuspec_file_contents(paths.root, nuget_id, nupkg_version), VCPKG_LINE_INFO); // Using all forward slashes for the command line const std::string cmd_line = Strings::format(R"("%s" pack -OutputDirectory "%s" "%s" > nul)", @@ -449,7 +447,7 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console System::printf("Adding vcpkg completion entry to %s\n", bashrc_path.u8string()); bashrc_content.push_back(Strings::format("source %s", completion_script_path.u8string())); - fs.write_contents(bashrc_path, Strings::join("\n", bashrc_content) + '\n'); + fs.write_contents(bashrc_path, Strings::join("\n", bashrc_content) + '\n', VCPKG_LINE_INFO); Checks::exit_success(VCPKG_LINE_INFO); } #endif diff --git a/toolsrc/src/vcpkg/dependencies.cpp b/toolsrc/src/vcpkg/dependencies.cpp index 8fde28929..f4a05e7dc 100644 --- a/toolsrc/src/vcpkg/dependencies.cpp +++ b/toolsrc/src/vcpkg/dependencies.cpp @@ -488,11 +488,12 @@ namespace vcpkg::Dependencies if (plus) return MarkPlusResult::SUCCESS; plus = true; - auto p_source = cluster.source.get(); - Checks::check_exit(VCPKG_LINE_INFO, - p_source != nullptr, - "Error: Cannot find definition for package `%s`.", - cluster.spec.name()); + const auto p_source = cluster.source.get(); + if (p_source == nullptr) + { + Checks::exit_with_message( + VCPKG_LINE_INFO, "Error: Cannot find definition for package `%s`.", cluster.spec.name()); + } if (feature.empty()) { diff --git a/toolsrc/src/vcpkg/export.cpp b/toolsrc/src/vcpkg/export.cpp index 433d7a1af..23fc7441a 100644 --- a/toolsrc/src/vcpkg/export.cpp +++ b/toolsrc/src/vcpkg/export.cpp @@ -141,12 +141,12 @@ namespace vcpkg::Export std::error_code ec; fs.create_directories(paths.buildsystems / "tmp", ec); - fs.write_contents(targets_redirect, targets_redirect_content); + fs.write_contents(targets_redirect, targets_redirect_content, VCPKG_LINE_INFO); const std::string nuspec_file_content = create_nuspec_file_contents(raw_exported_dir.string(), targets_redirect.string(), nuget_id, nuget_version); const fs::path nuspec_file_path = paths.buildsystems / "tmp" / "vcpkg.export.nuspec"; - fs.write_contents(nuspec_file_path, nuspec_file_content); + fs.write_contents(nuspec_file_path, nuspec_file_content, VCPKG_LINE_INFO); // -NoDefaultExcludes is needed for ".vcpkg-root" const auto cmd_line = Strings::format(R"("%s" pack -OutputDirectory "%s" "%s" -NoDefaultExcludes > nul)", diff --git a/toolsrc/src/vcpkg/help.cpp b/toolsrc/src/vcpkg/help.cpp index 84a054e0f..b92e9ca59 100644 --- a/toolsrc/src/vcpkg/help.cpp +++ b/toolsrc/src/vcpkg/help.cpp @@ -137,7 +137,7 @@ namespace vcpkg::Help void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - args.parse_arguments(COMMAND_STRUCTURE); + Util::unused(args.parse_arguments(COMMAND_STRUCTURE)); if (args.command_arguments.empty()) { diff --git a/toolsrc/src/vcpkg/install.cpp b/toolsrc/src/vcpkg/install.cpp index adab4249f..88b15fe7a 100644 --- a/toolsrc/src/vcpkg/install.cpp +++ b/toolsrc/src/vcpkg/install.cpp @@ -138,7 +138,7 @@ namespace vcpkg::Install std::sort(output.begin(), output.end()); - fs.write_lines(listfile, output); + fs.write_lines(listfile, output, VCPKG_LINE_INFO); } static std::vector extract_files_in_triplet( @@ -364,7 +364,12 @@ namespace vcpkg::Install const fs::path download_dir = paths.downloads; std::error_code ec; for (auto& p : fs.get_files_non_recursive(download_dir)) - if (!fs.is_directory(p)) fs.remove(p); + { + if (!fs.is_directory(p)) + { + fs.remove(p, VCPKG_LINE_INFO); + } + } } return {code, std::move(bcf)}; @@ -628,6 +633,8 @@ namespace vcpkg::Install const bool clean_after_build = Util::Sets::contains(options.switches, (OPTION_CLEAN_AFTER_BUILD)); const KeepGoing keep_going = to_keep_going(Util::Sets::contains(options.switches, OPTION_KEEP_GOING)); + auto& fs = paths.get_filesystem(); + // create the plan StatusParagraphs status_db = database_load_check(paths); @@ -645,7 +652,7 @@ namespace vcpkg::Install Build::FailOnTombstone::NO, }; - auto all_ports = Paragraphs::load_all_ports(paths.get_filesystem(), paths.ports); + auto all_ports = Paragraphs::load_all_ports(fs, paths.ports); std::unordered_map scf_map; for (auto&& port : all_ports) scf_map[port->core_paragraph->name] = std::move(*port); @@ -703,7 +710,7 @@ namespace vcpkg::Install xunit_doc += summary.xunit_results(); xunit_doc += "\n"; - paths.get_filesystem().write_contents(fs::u8path(it_xunit->second), xunit_doc); + fs.write_contents(fs::u8path(it_xunit->second), xunit_doc, VCPKG_LINE_INFO); } for (auto&& result : summary.results) diff --git a/toolsrc/src/vcpkg/remove.cpp b/toolsrc/src/vcpkg/remove.cpp index 685cdfdc3..f997667ac 100644 --- a/toolsrc/src/vcpkg/remove.cpp +++ b/toolsrc/src/vcpkg/remove.cpp @@ -111,7 +111,7 @@ namespace vcpkg::Remove } } - fs.remove(paths.listfile_path(ipv.core->package)); + fs.remove(paths.listfile_path(ipv.core->package), VCPKG_LINE_INFO); } for (auto&& spgh : spghs) diff --git a/toolsrc/src/vcpkg/tools.cpp b/toolsrc/src/vcpkg/tools.cpp index 2fdfbe0f2..4f4b23055 100644 --- a/toolsrc/src/vcpkg/tools.cpp +++ b/toolsrc/src/vcpkg/tools.cpp @@ -131,7 +131,10 @@ namespace vcpkg virtual const std::string& exe_stem() const = 0; virtual std::array default_min_version() const = 0; - virtual void add_special_paths(std::vector& out_candidate_paths) const {} + virtual void add_special_paths(std::vector& out_candidate_paths) const + { + Util::unused(out_candidate_paths); + } virtual Optional get_version(const fs::path& path_to_exe) const = 0; }; @@ -406,6 +409,7 @@ git version 2.17.1.windows.2 virtual void add_special_paths(std::vector& out_candidate_paths) const override { + Util::unused(out_candidate_paths); // TODO: Uncomment later // const std::vector from_path = Files::find_from_PATH("installerbase"); // candidate_paths.insert(candidate_paths.end(), from_path.cbegin(), from_path.cend()); diff --git a/toolsrc/src/vcpkg/update.cpp b/toolsrc/src/vcpkg/update.cpp index 344192d59..2c52d5952 100644 --- a/toolsrc/src/vcpkg/update.cpp +++ b/toolsrc/src/vcpkg/update.cpp @@ -52,7 +52,7 @@ namespace vcpkg::Update void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths) { - args.parse_arguments(COMMAND_STRUCTURE); + Util::unused(args.parse_arguments(COMMAND_STRUCTURE)); System::print2("Using local portfile versions. To update the local portfiles, use `git pull`.\n"); const StatusParagraphs status_db = database_load_check(paths); diff --git a/toolsrc/src/vcpkg/vcpkglib.cpp b/toolsrc/src/vcpkg/vcpkglib.cpp index c8e95dab1..2a52111a6 100644 --- a/toolsrc/src/vcpkg/vcpkglib.cpp +++ b/toolsrc/src/vcpkg/vcpkglib.cpp @@ -21,7 +21,7 @@ namespace vcpkg return StatusParagraphs(); } - fs.rename(vcpkg_dir_status_file_old, vcpkg_dir_status_file); + fs.rename(vcpkg_dir_status_file_old, vcpkg_dir_status_file, VCPKG_LINE_INFO); } auto pghs = Paragraphs::get_paragraphs(fs, vcpkg_dir_status_file).value_or_exit(VCPKG_LINE_INFO); @@ -72,15 +72,15 @@ namespace vcpkg } } - fs.write_contents(status_file_new, Strings::serialize(current_status_db)); + fs.write_contents(status_file_new, Strings::serialize(current_status_db), VCPKG_LINE_INFO); - fs.rename(status_file_new, status_file); + fs.rename(status_file_new, status_file, VCPKG_LINE_INFO); for (auto&& file : update_files) { if (!fs.is_regular_file(file)) continue; - fs.remove(file); + fs.remove(file, VCPKG_LINE_INFO); } return current_status_db; @@ -95,8 +95,8 @@ namespace vcpkg const auto tmp_update_filename = paths.vcpkg_dir_updates / "incomplete"; const auto update_filename = paths.vcpkg_dir_updates / Strings::format("%010d", my_update_id); - fs.write_contents(tmp_update_filename, Strings::serialize(p)); - fs.rename(tmp_update_filename, update_filename); + fs.write_contents(tmp_update_filename, Strings::serialize(p), VCPKG_LINE_INFO); + fs.rename(tmp_update_filename, update_filename, VCPKG_LINE_INFO); } static void upgrade_to_slash_terminated_sorted_format(Files::Filesystem& fs, @@ -165,8 +165,8 @@ namespace vcpkg // Replace the listfile on disk const fs::path updated_listfile_path = listfile_path.generic_string() + "_updated"; - fs.write_lines(updated_listfile_path, *lines); - fs.rename(updated_listfile_path, listfile_path); + fs.write_lines(updated_listfile_path, *lines, VCPKG_LINE_INFO); + fs.rename(updated_listfile_path, listfile_path, VCPKG_LINE_INFO); } std::vector get_installed_ports(const StatusParagraphs& status_db) -- cgit v1.2.3 From f0902b35370fbebcf257de88e43ee47379185a10 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Thu, 20 Jun 2019 11:46:55 -0700 Subject: VS 2019 16.3 deprecates . (#6968) VS 2019 16.3 will contain a couple of source-breaking changes: * will be deprecated via an impossible-to-miss preprocessor "#error The header providing std::experimental::filesystem is deprecated by Microsoft and will be REMOVED. It is superseded by the C++17 header providing std::filesystem. You can define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING to acknowledge that you have received this warning." * will no longer include . In the long term, I believe that vcpkg should detect when it's being built with VS 2017 15.7 or newer, compile in C++17 mode, include , and use std::filesystem. (Activating this for VS 2019 16.0 or newer would also be reasonable.) Similarly for other toolsets supporting std::filesystem. In the short term, this commit makes vcpkg compatible with the upcoming deprecation. First, we need to define the silencing macro before including the appropriate header. I've chosen to define it unconditionally (without checking for platform or version), since it has no effect for other platforms or versions. Second, we need to deal with no longer including . I verified that VS 2015 Update 3 contained (back then, it simply included the header, where the experimental implementation was defined; this was later reorganized). Therefore, all of vcpkg's supported MSVC toolsets have , so we can simply always include it. I've verified that this builds with both VS 2015 Update 3 and VS 2019 16.1.3 (the current production version). --- toolsrc/include/pch.h | 5 +---- toolsrc/include/vcpkg/base/files.h | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/pch.h b/toolsrc/include/pch.h index fa2c2bb72..15ec25e76 100644 --- a/toolsrc/include/pch.h +++ b/toolsrc/include/pch.h @@ -37,11 +37,8 @@ #include #include #include -#if defined(_WIN32) -#include -#else +#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING #include -#endif #include #include #include diff --git a/toolsrc/include/vcpkg/base/files.h b/toolsrc/include/vcpkg/base/files.h index 02e2b8db8..3ea0d6036 100644 --- a/toolsrc/include/vcpkg/base/files.h +++ b/toolsrc/include/vcpkg/base/files.h @@ -2,11 +2,8 @@ #include -#if defined(_WIN32) -#include -#else +#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING #include -#endif namespace fs { -- cgit v1.2.3 From 31184ac70d6b96e52eff60ee8eace9af2f24e2a2 Mon Sep 17 00:00:00 2001 From: Farwaykorse Date: Sat, 22 Jun 2019 06:26:10 +0200 Subject: Bump version to 2019.06.21 (#6987) --- toolsrc/VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'toolsrc') diff --git a/toolsrc/VERSION.txt b/toolsrc/VERSION.txt index ce62ec959..c2116e0e8 100644 --- a/toolsrc/VERSION.txt +++ b/toolsrc/VERSION.txt @@ -1 +1 @@ -"2018.11.23" \ No newline at end of file +"2019.06.21" \ No newline at end of file -- cgit v1.2.3 From f3db66b403840b24ea2612d09cca30a5285f5ea3 Mon Sep 17 00:00:00 2001 From: Victor Romero Date: Fri, 21 Jun 2019 23:50:05 -0700 Subject: Ports Overlay partial implementation (#6981) * Ports Overlay feature spec * Ports Overlay implementation * [--overlay-ports] Refactor handling of additional paths * Code cleanup * [--overlay-ports] Add help * [depend-info] Support --overlay-ports * Add method to load all ports using PathsPortFileProvider * Make PortFileProvider::load_all_control_files() const * Remove unused code * [vcpkg] Avoid double-load of source control file between Build::perform_and_exit and Build::perform_and_exit_ex * [vcpkg] Clang format * [vcpkg] Fixup build failure introduced in b069ceb2f231 * Report errors from Paragraphs::try_load_port() --- toolsrc/include/vcpkg/build.h | 2 +- toolsrc/include/vcpkg/dependencies.h | 27 ++-- toolsrc/include/vcpkg/postbuildlint.h | 3 +- toolsrc/include/vcpkg/sourceparagraph.h | 9 ++ toolsrc/include/vcpkg/vcpkgcmdarguments.h | 16 +- toolsrc/include/vcpkg/vcpkgpaths.h | 2 - toolsrc/src/tests.plan.cpp | 8 +- toolsrc/src/tests.update.cpp | 16 +- toolsrc/src/vcpkg/build.cpp | 45 +++--- toolsrc/src/vcpkg/commands.autocomplete.cpp | 3 +- toolsrc/src/vcpkg/commands.buildexternal.cpp | 9 +- toolsrc/src/vcpkg/commands.ci.cpp | 21 ++- toolsrc/src/vcpkg/commands.dependinfo.cpp | 19 ++- toolsrc/src/vcpkg/commands.edit.cpp | 1 + toolsrc/src/vcpkg/commands.search.cpp | 8 +- toolsrc/src/vcpkg/commands.upgrade.cpp | 9 +- toolsrc/src/vcpkg/dependencies.cpp | 170 +++++++++++++++++---- toolsrc/src/vcpkg/export.cpp | 5 +- toolsrc/src/vcpkg/help.cpp | 4 +- toolsrc/src/vcpkg/install.cpp | 14 +- toolsrc/src/vcpkg/postbuildlint.cpp | 5 +- toolsrc/src/vcpkg/remove.cpp | 3 +- toolsrc/src/vcpkg/update.cpp | 8 +- toolsrc/src/vcpkg/vcpkgcmdarguments.cpp | 115 +++++++++++++- toolsrc/src/vcpkg/vcpkgpaths.cpp | 3 - toolsrc/vcpkg/vcpkg.vcxproj | 4 +- toolsrc/vcpkglib/vcpkglib.vcxproj | 4 +- .../vcpkgmetricsuploader.vcxproj | 4 +- toolsrc/vcpkgtest/vcpkgtest.vcxproj | 6 +- 29 files changed, 420 insertions(+), 123 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg/build.h b/toolsrc/include/vcpkg/build.h index 9044cb556..04cd7cf87 100644 --- a/toolsrc/include/vcpkg/build.h +++ b/toolsrc/include/vcpkg/build.h @@ -20,7 +20,7 @@ namespace vcpkg::Build namespace Command { void perform_and_exit_ex(const FullPackageSpec& full_spec, - const fs::path& port_dir, + const SourceControlFileLocation& scfl, const ParsedArguments& options, const VcpkgPaths& paths); diff --git a/toolsrc/include/vcpkg/dependencies.h b/toolsrc/include/vcpkg/dependencies.h index 16fdb3f73..8c2050b3d 100644 --- a/toolsrc/include/vcpkg/dependencies.h +++ b/toolsrc/include/vcpkg/dependencies.h @@ -48,7 +48,7 @@ namespace vcpkg::Dependencies const RequestType& request_type); InstallPlanAction(const PackageSpec& spec, - const SourceControlFile& scf, + const SourceControlFileLocation& scfl, const std::set& features, const RequestType& request_type, std::vector&& dependencies); @@ -57,7 +57,7 @@ namespace vcpkg::Dependencies PackageSpec spec; - Optional source_control_file; + Optional source_control_file_location; Optional installed_package; InstallPlanType plan_type; @@ -129,26 +129,31 @@ namespace vcpkg::Dependencies struct PortFileProvider { - virtual Optional get_control_file(const std::string& src_name) const = 0; + virtual Optional get_control_file(const std::string& src_name) const = 0; + virtual std::vector load_all_control_files() const = 0; }; struct MapPortFileProvider : Util::ResourceBase, PortFileProvider { - explicit MapPortFileProvider(const std::unordered_map& map); - Optional get_control_file(const std::string& src_name) const override; + explicit MapPortFileProvider(const std::unordered_map& map); + Optional get_control_file(const std::string& src_name) const override; + std::vector load_all_control_files() const override; private: - const std::unordered_map& ports; + const std::unordered_map& ports; }; struct PathsPortFileProvider : Util::ResourceBase, PortFileProvider { - explicit PathsPortFileProvider(const VcpkgPaths& paths); - Optional get_control_file(const std::string& src_name) const override; + explicit PathsPortFileProvider(const vcpkg::VcpkgPaths& paths, + const std::vector* ports_dirs_paths); + Optional get_control_file(const std::string& src_name) const override; + std::vector load_all_control_files() const override; private: - const VcpkgPaths& ports; - mutable std::unordered_map cache; + Files::Filesystem& filesystem; + std::vector ports_dirs; + mutable std::unordered_map cache; }; struct ClusterGraph; @@ -181,7 +186,7 @@ namespace vcpkg::Dependencies std::vector create_export_plan(const std::vector& specs, const StatusParagraphs& status_db); - std::vector create_feature_install_plan(const std::unordered_map& map, + std::vector create_feature_install_plan(const std::unordered_map& map, const std::vector& specs, const StatusParagraphs& status_db); diff --git a/toolsrc/include/vcpkg/postbuildlint.h b/toolsrc/include/vcpkg/postbuildlint.h index 5dcfeb8df..027619eb8 100644 --- a/toolsrc/include/vcpkg/postbuildlint.h +++ b/toolsrc/include/vcpkg/postbuildlint.h @@ -9,5 +9,6 @@ namespace vcpkg::PostBuildLint size_t perform_all_checks(const PackageSpec& spec, const VcpkgPaths& paths, const Build::PreBuildInfo& pre_build_info, - const Build::BuildInfo& build_info); + const Build::BuildInfo& build_info, + const fs::path& port_dir); } diff --git a/toolsrc/include/vcpkg/sourceparagraph.h b/toolsrc/include/vcpkg/sourceparagraph.h index d70fd4337..6232a3fd2 100644 --- a/toolsrc/include/vcpkg/sourceparagraph.h +++ b/toolsrc/include/vcpkg/sourceparagraph.h @@ -68,6 +68,15 @@ namespace vcpkg Optional find_feature(const std::string& featurename) const; }; + /// + /// Full metadata of a package: core and other features. As well as the location the SourceControlFile was loaded from. + /// + struct SourceControlFileLocation + { + std::unique_ptr source_control_file; + fs::path source_location; + }; + void print_error_message(Span> error_info_list); inline void print_error_message(const std::unique_ptr& error_info_list) { diff --git a/toolsrc/include/vcpkg/vcpkgcmdarguments.h b/toolsrc/include/vcpkg/vcpkgcmdarguments.h index de65eec28..cad013eb8 100644 --- a/toolsrc/include/vcpkg/vcpkgcmdarguments.h +++ b/toolsrc/include/vcpkg/vcpkgcmdarguments.h @@ -15,6 +15,7 @@ namespace vcpkg { std::unordered_set switches; std::unordered_map settings; + std::unordered_map> multisettings; }; struct VcpkgPaths; @@ -41,10 +42,22 @@ namespace vcpkg StringLiteral short_help_text; }; + struct CommandMultiSetting + { + constexpr CommandMultiSetting(const StringLiteral& name, const StringLiteral& short_help_text) + : name(name), short_help_text(short_help_text) + { + } + + StringLiteral name; + StringLiteral short_help_text; + }; + struct CommandOptionsStructure { Span switches; Span settings; + Span multisettings; }; struct CommandStructure @@ -74,6 +87,7 @@ namespace vcpkg std::unique_ptr vcpkg_root_dir; std::unique_ptr triplet; + std::unique_ptr> overlay_ports; Optional debug = nullopt; Optional sendmetrics = nullopt; Optional printmetrics = nullopt; @@ -88,6 +102,6 @@ namespace vcpkg ParsedArguments parse_arguments(const CommandStructure& command_structure) const; private: - std::unordered_map> optional_command_arguments; + std::unordered_map>> optional_command_arguments; }; } diff --git a/toolsrc/include/vcpkg/vcpkgpaths.h b/toolsrc/include/vcpkg/vcpkgpaths.h index 42de40d9c..b09169b02 100644 --- a/toolsrc/include/vcpkg/vcpkgpaths.h +++ b/toolsrc/include/vcpkg/vcpkgpaths.h @@ -50,8 +50,6 @@ namespace vcpkg static Expected create(const fs::path& vcpkg_root_dir, const std::string& default_vs_path); fs::path package_dir(const PackageSpec& spec) const; - fs::path port_dir(const PackageSpec& spec) const; - fs::path port_dir(const std::string& name) const; fs::path build_info_file_path(const PackageSpec& spec) const; fs::path listfile_path(const BinaryParagraph& pgh) const; diff --git a/toolsrc/src/tests.plan.cpp b/toolsrc/src/tests.plan.cpp index 238aa7032..ab24266b4 100644 --- a/toolsrc/src/tests.plan.cpp +++ b/toolsrc/src/tests.plan.cpp @@ -47,7 +47,8 @@ namespace UnitTest1 Assert::AreEqual(plan.spec.triplet().to_string().c_str(), triplet.to_string().c_str()); - Assert::AreEqual(pkg_name.c_str(), plan.source_control_file.get()->core_paragraph->name.c_str()); + auto* scfl = plan.source_control_file_location.get(); + Assert::AreEqual(pkg_name.c_str(), scfl->source_control_file->core_paragraph->name.c_str()); Assert::AreEqual(size_t(vec.size()), feature_list.size()); for (auto&& feature_name : vec) @@ -79,7 +80,7 @@ namespace UnitTest1 /// struct PackageSpecMap { - std::unordered_map map; + std::unordered_map map; Triplet triplet; PackageSpecMap(const Triplet& t = Triplet::X86_WINDOWS) noexcept { triplet = t; } @@ -94,7 +95,8 @@ namespace UnitTest1 { auto spec = PackageSpec::from_name_and_triplet(scf.core_paragraph->name, triplet); Assert::IsTrue(spec.has_value()); - map.emplace(scf.core_paragraph->name, std::move(scf)); + map.emplace(scf.core_paragraph->name, + SourceControlFileLocation{std::unique_ptr(std::move(&scf)), ""}); return PackageSpec{*spec.get()}; } }; diff --git a/toolsrc/src/tests.update.cpp b/toolsrc/src/tests.update.cpp index b6e487c17..5e3f9f3e2 100644 --- a/toolsrc/src/tests.update.cpp +++ b/toolsrc/src/tests.update.cpp @@ -21,9 +21,9 @@ namespace UnitTest1 StatusParagraphs status_db(std::move(status_paragraphs)); - std::unordered_map map; + std::unordered_map map; auto scf = unwrap(SourceControlFile::parse_control_file(Pgh{{{"Source", "a"}, {"Version", "0"}}})); - map.emplace("a", std::move(*scf)); + map.emplace("a", SourceControlFileLocation { std::move(scf), "" }); Dependencies::MapPortFileProvider provider(map); auto pkgs = SortedVector(Update::find_outdated_packages(provider, status_db), @@ -45,9 +45,9 @@ namespace UnitTest1 StatusParagraphs status_db(std::move(status_paragraphs)); - std::unordered_map map; + std::unordered_map map; auto scf = unwrap(SourceControlFile::parse_control_file(Pgh{{{"Source", "a"}, {"Version", "0"}}})); - map.emplace("a", std::move(*scf)); + map.emplace("a", SourceControlFileLocation { std::move(scf), "" }); Dependencies::MapPortFileProvider provider(map); auto pkgs = SortedVector(Update::find_outdated_packages(provider, status_db), @@ -71,9 +71,9 @@ namespace UnitTest1 StatusParagraphs status_db(std::move(status_paragraphs)); - std::unordered_map map; + std::unordered_map map; auto scf = unwrap(SourceControlFile::parse_control_file(Pgh{{{"Source", "a"}, {"Version", "0"}}})); - map.emplace("a", std::move(*scf)); + map.emplace("a", SourceControlFileLocation{ std::move(scf), "" }); Dependencies::MapPortFileProvider provider(map); auto pkgs = SortedVector(Update::find_outdated_packages(provider, status_db), @@ -92,9 +92,9 @@ namespace UnitTest1 StatusParagraphs status_db(std::move(status_paragraphs)); - std::unordered_map map; + std::unordered_map map; auto scf = unwrap(SourceControlFile::parse_control_file(Pgh{{{"Source", "a"}, {"Version", "2"}}})); - map.emplace("a", std::move(*scf)); + map.emplace("a", SourceControlFileLocation{ std::move(scf), "" }); Dependencies::MapPortFileProvider provider(map); auto pkgs = SortedVector(Update::find_outdated_packages(provider, status_db), diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp index daff7e6c8..059a09432 100644 --- a/toolsrc/src/vcpkg/build.cpp +++ b/toolsrc/src/vcpkg/build.cpp @@ -23,6 +23,7 @@ #include using vcpkg::Build::BuildResult; +using vcpkg::Dependencies::PathsPortFileProvider; using vcpkg::Parse::ParseControlErrorInfo; using vcpkg::Parse::ParseExpected; @@ -34,34 +35,26 @@ namespace vcpkg::Build::Command static constexpr StringLiteral OPTION_CHECKS_ONLY = "--checks-only"; void perform_and_exit_ex(const FullPackageSpec& full_spec, - const fs::path& port_dir, + const SourceControlFileLocation& scfl, const ParsedArguments& options, const VcpkgPaths& paths) { const PackageSpec& spec = full_spec.package_spec; + const auto& scf = *scfl.source_control_file; if (Util::Sets::contains(options.switches, OPTION_CHECKS_ONLY)) { const auto pre_build_info = Build::PreBuildInfo::from_triplet_file(paths, spec.triplet()); const auto build_info = Build::read_build_info(paths.get_filesystem(), paths.build_info_file_path(spec)); - const size_t error_count = PostBuildLint::perform_all_checks(spec, paths, pre_build_info, build_info); + const size_t error_count = + PostBuildLint::perform_all_checks(spec, paths, pre_build_info, build_info, scfl.source_location); Checks::check_exit(VCPKG_LINE_INFO, error_count == 0); Checks::exit_success(VCPKG_LINE_INFO); } - const ParseExpected source_control_file = - Paragraphs::try_load_port(paths.get_filesystem(), port_dir); - - if (!source_control_file.has_value()) - { - print_error_message(source_control_file.error()); - Checks::exit_fail(VCPKG_LINE_INFO); - } - - const auto& scf = source_control_file.value_or_exit(VCPKG_LINE_INFO); Checks::check_exit(VCPKG_LINE_INFO, - spec.name() == scf->core_paragraph->name, + spec.name() == scf.core_paragraph->name, "The Source field inside the CONTROL file does not match the port directory: '%s' != '%s'", - scf->core_paragraph->name, + scf.core_paragraph->name, spec.name()); const StatusParagraphs status_db = database_load_check(paths); @@ -80,7 +73,7 @@ namespace vcpkg::Build::Command features_as_set.emplace("core"); const Build::BuildPackageConfig build_config{ - *scf, spec.triplet(), fs::path{port_dir}, build_package_options, features_as_set}; + scf, spec.triplet(), fs::path(scfl.source_location), build_package_options, features_as_set}; const auto build_timer = Chrono::ElapsedTimer::create_started(); const auto result = Build::build_package(paths, build_config, status_db); @@ -128,10 +121,19 @@ namespace vcpkg::Build::Command // Build only takes a single package and all dependencies must already be installed const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); std::string first_arg = args.command_arguments.at(0); + const FullPackageSpec spec = Input::check_and_get_full_package_spec( std::move(first_arg), default_triplet, COMMAND_STRUCTURE.example_text); + Input::check_triplet(spec.package_spec.triplet(), paths); - perform_and_exit_ex(spec, paths.port_dir(spec.package_spec), options, paths); + + PathsPortFileProvider provider(paths, args.overlay_ports.get()); + const auto port_name = spec.package_spec.name(); + const auto* scfl = provider.get_control_file(port_name).get(); + + Checks::check_exit(VCPKG_LINE_INFO, scfl != nullptr, "Error: Couldn't find port '%s'", port_name); + + perform_and_exit_ex(spec, *scfl, options, paths); } } @@ -360,6 +362,12 @@ namespace vcpkg::Build auto& fs = paths.get_filesystem(); const Triplet& triplet = spec.triplet(); + if (!Strings::starts_with(Strings::ascii_to_lowercase(config.port_dir.u8string()), + Strings::ascii_to_lowercase(paths.ports.u8string()))) + { + System::printf("-- Installing port from location: %s\n", config.port_dir.u8string()); + } + #if !defined(_WIN32) // TODO: remove when vcpkg.exe is in charge for acquiring tools. Change introduced in vcpkg v0.0.107. // bootstrap should have already downloaded ninja, but making sure it is present in case it was deleted. @@ -428,7 +436,8 @@ namespace vcpkg::Build } const BuildInfo build_info = read_build_info(fs, paths.build_info_file_path(spec)); - const size_t error_count = PostBuildLint::perform_all_checks(spec, paths, pre_build_info, build_info); + const size_t error_count = + PostBuildLint::perform_all_checks(spec, paths, pre_build_info, build_info, config.port_dir); auto bcf = create_binary_control_file(*config.scf.core_paragraph, triplet, build_info, abi_tag); @@ -705,7 +714,7 @@ namespace vcpkg::Build } } - System::print2("Could not locate cached archive: ", archive_path.u8string(), "\n"); + System::printf("Could not locate cached archive: %s\n", archive_path.u8string()); ExtendedBuildResult result = do_build_package_and_clean_buildtrees( paths, pre_build_info, spec, maybe_abi_tag_and_file.value_or(AbiTagAndFile{}).tag, config); diff --git a/toolsrc/src/vcpkg/commands.autocomplete.cpp b/toolsrc/src/vcpkg/commands.autocomplete.cpp index afef518eb..3cf4dd98f 100644 --- a/toolsrc/src/vcpkg/commands.autocomplete.cpp +++ b/toolsrc/src/vcpkg/commands.autocomplete.cpp @@ -90,7 +90,8 @@ namespace vcpkg::Commands::Autocomplete const auto port_name = match[2].str(); const auto triplet_prefix = match[3].str(); - auto maybe_port = Paragraphs::try_load_port(paths.get_filesystem(), paths.port_dir(port_name)); + // TODO: Support autocomplete for ports in --overlay-ports + auto maybe_port = Paragraphs::try_load_port(paths.get_filesystem(), paths.ports / port_name); if (maybe_port.error()) { Checks::exit_success(VCPKG_LINE_INFO); diff --git a/toolsrc/src/vcpkg/commands.buildexternal.cpp b/toolsrc/src/vcpkg/commands.buildexternal.cpp index 19b89c2f5..1c3c511c2 100644 --- a/toolsrc/src/vcpkg/commands.buildexternal.cpp +++ b/toolsrc/src/vcpkg/commands.buildexternal.cpp @@ -23,7 +23,12 @@ namespace vcpkg::Commands::BuildExternal std::string(args.command_arguments.at(0)), default_triplet, COMMAND_STRUCTURE.example_text); Input::check_triplet(spec.package_spec.triplet(), paths); - const fs::path port_dir = args.command_arguments.at(1); - Build::Command::perform_and_exit_ex(spec, port_dir, options, paths); + auto overlays = args.overlay_ports ? *args.overlay_ports : std::vector(); + overlays.insert(overlays.begin(), args.command_arguments.at(1)); + Dependencies::PathsPortFileProvider provider(paths, &overlays); + auto maybe_scfl = provider.get_control_file(spec.package_spec.name()); + Checks::check_exit( + VCPKG_LINE_INFO, maybe_scfl.has_value(), "could not load control file for %s", spec.package_spec.name()); + Build::Command::perform_and_exit_ex(spec, maybe_scfl.value_or_exit(VCPKG_LINE_INFO), options, paths); } } diff --git a/toolsrc/src/vcpkg/commands.ci.cpp b/toolsrc/src/vcpkg/commands.ci.cpp index de66d917b..8cab79504 100644 --- a/toolsrc/src/vcpkg/commands.ci.cpp +++ b/toolsrc/src/vcpkg/commands.ci.cpp @@ -232,12 +232,17 @@ namespace vcpkg::Commands::CI { // determine abi tag std::string abi; - if (auto scf = p->source_control_file.get()) + if (auto scfl = p->source_control_file_location.get()) { auto triplet = p->spec.triplet(); const Build::BuildPackageConfig build_config{ - *scf, triplet, paths.port_dir(p->spec), build_options, p->feature_list}; + *scfl->source_control_file, + triplet, + static_cast(scfl->source_location), + build_options, + p->feature_list + }; auto dependency_abis = Util::fmap(p->computed_dependencies, [&](const PackageSpec& spec) -> Build::AbiEntry { @@ -351,7 +356,8 @@ namespace vcpkg::Commands::CI } StatusParagraphs status_db = database_load_check(paths); - const auto& paths_port_file = Dependencies::PathsPortFileProvider(paths); + + Dependencies::PathsPortFileProvider provider(paths, args.overlay_ports.get()); const Build::BuildPackageOptions install_plan_options = { Build::UseHeadVersion::NO, @@ -369,7 +375,10 @@ namespace vcpkg::Commands::CI XunitTestResults xunitTestResults; - std::vector all_ports = Install::get_all_port_names(paths); + std::vector all_ports = + Util::fmap(provider.load_all_control_files(), [](auto&& scfl) -> std::string { + return scfl->source_control_file.get()->core_paragraph->name; + }); std::vector results; auto timer = Chrono::ElapsedTimer::create_started(); for (const Triplet& triplet : triplets) @@ -378,13 +387,13 @@ namespace vcpkg::Commands::CI xunitTestResults.push_collection(triplet.canonical_name()); - Dependencies::PackageGraph pgraph(paths_port_file, status_db); + Dependencies::PackageGraph pgraph(provider, status_db); std::vector specs = PackageSpec::to_package_specs(all_ports, triplet); // Install the default features for every package auto all_feature_specs = Util::fmap(specs, [](auto& spec) { return FeatureSpec(spec, ""); }); auto split_specs = - find_unknown_ports_for_ci(paths, exclusions_set, paths_port_file, all_feature_specs, purge_tombstones); + find_unknown_ports_for_ci(paths, exclusions_set, provider, all_feature_specs, purge_tombstones); auto feature_specs = FullPackageSpec::to_feature_specs(split_specs->unknown); for (auto&& fspec : feature_specs) diff --git a/toolsrc/src/vcpkg/commands.dependinfo.cpp b/toolsrc/src/vcpkg/commands.dependinfo.cpp index 48a289fa5..c0800a4b5 100644 --- a/toolsrc/src/vcpkg/commands.dependinfo.cpp +++ b/toolsrc/src/vcpkg/commands.dependinfo.cpp @@ -6,6 +6,9 @@ #include #include #include +#include + +using vcpkg::Dependencies::PathsPortFileProvider; namespace vcpkg::Commands::DependInfo { @@ -35,7 +38,7 @@ namespace vcpkg::Commands::DependInfo return output; } - std::string create_dot_as_string(const std::vector>& source_control_files) + std::string create_dot_as_string(const std::vector& source_control_files) { int empty_node_count = 0; @@ -64,7 +67,7 @@ namespace vcpkg::Commands::DependInfo return s; } - std::string create_dgml_as_string(const std::vector>& source_control_files) + std::string create_dgml_as_string(const std::vector& source_control_files) { std::string s; s.append(""); @@ -109,7 +112,7 @@ namespace vcpkg::Commands::DependInfo } std::string create_graph_as_string(const std::unordered_set& switches, - const std::vector>& source_control_files) + const std::vector& source_control_files) { if (Util::Sets::contains(switches, OPTION_DOT)) { @@ -124,7 +127,7 @@ namespace vcpkg::Commands::DependInfo void build_dependencies_list(std::set& packages_to_keep, const std::string& requested_package, - const std::vector>& source_control_files, + const std::vector& source_control_files, const std::unordered_set& switches) { const auto source_control_file = @@ -154,7 +157,11 @@ namespace vcpkg::Commands::DependInfo { const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); - auto source_control_files = Paragraphs::load_all_ports(paths.get_filesystem(), paths.ports); + // TODO: Optimize implementation, current implementation needs to load all ports from disk which is too slow. + PathsPortFileProvider provider(paths, args.overlay_ports.get()); + auto source_control_files = Util::fmap(provider.load_all_control_files(), [](auto&& scfl) -> const SourceControlFile * { + return scfl->source_control_file.get(); + }); if (args.command_arguments.size() >= 1) { @@ -178,7 +185,7 @@ namespace vcpkg::Commands::DependInfo for (auto&& source_control_file : source_control_files) { - const SourceParagraph& source_paragraph = *source_control_file->core_paragraph; + const SourceParagraph& source_paragraph = *source_control_file->core_paragraph.get(); const auto s = Strings::join(", ", source_paragraph.depends, [](const Dependency& d) { return d.name(); }); System::print2(source_paragraph.name, ": ", s, "\n"); } diff --git a/toolsrc/src/vcpkg/commands.edit.cpp b/toolsrc/src/vcpkg/commands.edit.cpp index 98176b2b0..f2f0b1569 100644 --- a/toolsrc/src/vcpkg/commands.edit.cpp +++ b/toolsrc/src/vcpkg/commands.edit.cpp @@ -79,6 +79,7 @@ namespace vcpkg::Commands::Edit const auto& fs = paths.get_filesystem(); auto packages = fs.get_files_non_recursive(paths.packages); + // TODO: Support edit for --overlay-ports return Util::fmap(ports, [&](const std::string& port_name) -> std::string { const auto portpath = paths.ports / port_name; const auto portfile = portpath / "portfile.cmake"; diff --git a/toolsrc/src/vcpkg/commands.search.cpp b/toolsrc/src/vcpkg/commands.search.cpp index a0afd69e1..3d8387ee1 100644 --- a/toolsrc/src/vcpkg/commands.search.cpp +++ b/toolsrc/src/vcpkg/commands.search.cpp @@ -7,6 +7,9 @@ #include #include #include +#include + +using vcpkg::Dependencies::PathsPortFileProvider; namespace vcpkg::Commands::Search { @@ -63,7 +66,10 @@ namespace vcpkg::Commands::Search const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE); const bool full_description = Util::Sets::contains(options.switches, OPTION_FULLDESC); - auto source_paragraphs = Paragraphs::load_all_ports(paths.get_filesystem(), paths.ports); + PathsPortFileProvider provider(paths, args.overlay_ports.get()); + auto source_paragraphs = Util::fmap(provider.load_all_control_files(), [](auto&& port) -> const SourceControlFile * { + return port->source_control_file.get(); + }); if (args.command_arguments.empty()) { diff --git a/toolsrc/src/vcpkg/commands.upgrade.cpp b/toolsrc/src/vcpkg/commands.upgrade.cpp index 29815ca94..77183ceaf 100644 --- a/toolsrc/src/vcpkg/commands.upgrade.cpp +++ b/toolsrc/src/vcpkg/commands.upgrade.cpp @@ -43,7 +43,8 @@ namespace vcpkg::Commands::Upgrade StatusParagraphs status_db = database_load_check(paths); - Dependencies::PathsPortFileProvider provider(paths); + // Load ports from ports dirs + Dependencies::PathsPortFileProvider provider(paths, args.overlay_ports.get()); Dependencies::PackageGraph graph(provider, status_db); // input sanitization @@ -85,12 +86,12 @@ namespace vcpkg::Commands::Upgrade not_installed.push_back(spec); } - auto maybe_scf = provider.get_control_file(spec.name()); - if (auto p_scf = maybe_scf.get()) + auto maybe_scfl = provider.get_control_file(spec.name()); + if (auto p_scfl = maybe_scfl.get()) { if (it != status_db.end()) { - if (p_scf->core_paragraph->version != (*it)->package.version) + if (p_scfl->source_control_file->core_paragraph->version != (*it)->package.version) { to_upgrade.push_back(spec); } diff --git a/toolsrc/src/vcpkg/dependencies.cpp b/toolsrc/src/vcpkg/dependencies.cpp index f4a05e7dc..df472515f 100644 --- a/toolsrc/src/vcpkg/dependencies.cpp +++ b/toolsrc/src/vcpkg/dependencies.cpp @@ -22,7 +22,7 @@ namespace vcpkg::Dependencies struct ClusterSource { - const SourceControlFile* scf = nullptr; + const SourceControlFileLocation* scfl = nullptr; std::unordered_map> build_edges; }; @@ -92,12 +92,12 @@ namespace vcpkg::Dependencies if (it == m_graph.end()) { // Load on-demand from m_provider - auto maybe_scf = m_provider.get_control_file(spec.name()); + auto maybe_scfl = m_provider.get_control_file(spec.name()); auto& clust = m_graph[spec]; clust.spec = spec; - if (auto p_scf = maybe_scf.get()) + if (auto p_scfl = maybe_scfl.get()) { - clust.source = cluster_from_scf(*p_scf, clust.spec.triplet()); + clust.source = cluster_from_scf(*p_scfl, clust.spec.triplet()); } return clust; } @@ -105,15 +105,17 @@ namespace vcpkg::Dependencies } private: - static ClusterSource cluster_from_scf(const SourceControlFile& scf, Triplet t) + static ClusterSource cluster_from_scf(const SourceControlFileLocation& scfl, Triplet t) { ClusterSource ret; - ret.build_edges.emplace("core", filter_dependencies_to_specs(scf.core_paragraph->depends, t)); + ret.build_edges.emplace("core", + filter_dependencies_to_specs(scfl.source_control_file->core_paragraph->depends, + t)); - for (const auto& feature : scf.feature_paragraphs) + for (const auto& feature : scfl.source_control_file->feature_paragraphs) ret.build_edges.emplace(feature->name, filter_dependencies_to_specs(feature->depends, t)); - ret.scf = &scf; + ret.scfl = &scfl; return ret; } @@ -151,12 +153,12 @@ namespace vcpkg::Dependencies } InstallPlanAction::InstallPlanAction(const PackageSpec& spec, - const SourceControlFile& scf, + const SourceControlFileLocation& scfl, const std::set& features, const RequestType& request_type, std::vector&& dependencies) : spec(spec) - , source_control_file(scf) + , source_control_file_location(scfl) , plan_type(InstallPlanType::BUILD_AND_INSTALL) , request_type(request_type) , build_options{} @@ -268,37 +270,145 @@ namespace vcpkg::Dependencies return left->spec.name() < right->spec.name(); } - MapPortFileProvider::MapPortFileProvider(const std::unordered_map& map) : ports(map) - { - } + MapPortFileProvider::MapPortFileProvider(const std::unordered_map& map) + : ports(map) + {} - Optional MapPortFileProvider::get_control_file(const std::string& spec) const + Optional MapPortFileProvider::get_control_file(const std::string& spec) const { auto scf = ports.find(spec); if (scf == ports.end()) return nullopt; return scf->second; } - PathsPortFileProvider::PathsPortFileProvider(const VcpkgPaths& paths) : ports(paths) {} + std::vector MapPortFileProvider::load_all_control_files() const + { + return Util::fmap(ports, [](auto&& kvpair) -> const SourceControlFileLocation * { return &kvpair.second; }); + } - Optional PathsPortFileProvider::get_control_file(const std::string& spec) const + PathsPortFileProvider::PathsPortFileProvider(const vcpkg::VcpkgPaths& paths, + const std::vector* ports_dirs_paths) + : filesystem(paths.get_filesystem()) + { + if (ports_dirs_paths) + { + for (auto&& overlay_path : *ports_dirs_paths) + { + if (!overlay_path.empty()) + { + auto overlay = fs::stdfs::canonical(fs::u8path(overlay_path)); + + Checks::check_exit(VCPKG_LINE_INFO, + filesystem.exists(overlay), + "Error: Path \"%s\" does not exist", + overlay.string()); + + Checks::check_exit(VCPKG_LINE_INFO, + fs::stdfs::is_directory(overlay), + "Error: Path \"%s\" must be a directory", + overlay.string()); + + ports_dirs.emplace_back(overlay); + } + } + } + ports_dirs.emplace_back(paths.ports); + } + + Optional PathsPortFileProvider::get_control_file(const std::string& spec) const { auto cache_it = cache.find(spec); if (cache_it != cache.end()) { return cache_it->second; } - Parse::ParseExpected source_control_file = - Paragraphs::try_load_port(ports.get_filesystem(), ports.port_dir(spec)); - if (auto scf = source_control_file.get()) + for (auto&& ports_dir : ports_dirs) { - auto it = cache.emplace(spec, std::move(*scf->get())); - return it.first->second; + // Try loading individual port + if (filesystem.exists(ports_dir / "CONTROL")) + { + auto maybe_scf = Paragraphs::try_load_port(filesystem, ports_dir); + if (auto scf = maybe_scf.get()) + { + if (scf->get()->core_paragraph->name == spec) + { + SourceControlFileLocation scfl{ std::move(*scf), ports_dir }; + auto it = cache.emplace(spec, std::move(scfl)); + return it.first->second; + } + } + else + { + vcpkg::print_error_message(maybe_scf.error()); + Checks::exit_with_message(VCPKG_LINE_INFO, + "Error: Failed to load port from %s", + spec, ports_dir.u8string()); + } + } + + auto found_scf = Paragraphs::try_load_port(filesystem, ports_dir / spec); + if (auto scf = found_scf.get()) + { + if (scf->get()->core_paragraph->name == spec) + { + SourceControlFileLocation scfl{ std::move(*scf), ports_dir / spec }; + auto it = cache.emplace(spec, std::move(scfl)); + return it.first->second; + } + } } + return nullopt; } + std::vector PathsPortFileProvider::load_all_control_files() const + { + // Reload cache with ports contained in all ports_dirs + cache.clear(); + std::vector ret; + for (auto&& ports_dir : ports_dirs) + { + // Try loading individual port + if (filesystem.exists(ports_dir / "CONTROL")) + { + auto maybe_scf = Paragraphs::try_load_port(filesystem, ports_dir); + if (auto scf = maybe_scf.get()) + { + auto port_name = scf->get()->core_paragraph->name; + if (cache.find(port_name) == cache.end()) + { + SourceControlFileLocation scfl{ std::move(*scf), ports_dir }; + auto it = cache.emplace(port_name, std::move(scfl)); + ret.emplace_back(&it.first->second); + } + } + else + { + vcpkg::print_error_message(maybe_scf.error()); + Checks::exit_with_message(VCPKG_LINE_INFO, + "Error: Failed to load port from %s", + ports_dir.u8string()); + } + continue; + } + + // Try loading all ports inside ports_dir + auto found_scf = Paragraphs::load_all_ports(filesystem, ports_dir); + for (auto&& scf : found_scf) + { + auto port_name = scf->core_paragraph->name; + if (cache.find(port_name) == cache.end()) + { + SourceControlFileLocation scfl{ std::move(scf), ports_dir / port_name }; + auto it = cache.emplace(port_name, std::move(scfl)); + ret.emplace_back(&it.first->second); + } + } + } + return ret; + } + std::vector create_remove_plan(const std::vector& specs, const StatusParagraphs& status_db) { @@ -495,10 +605,11 @@ namespace vcpkg::Dependencies VCPKG_LINE_INFO, "Error: Cannot find definition for package `%s`.", cluster.spec.name()); } + auto&& control_file = *p_source->scfl->source_control_file.get(); if (feature.empty()) { // Add default features for this package. This is an exact reference, so ignore prevent_default_features. - for (auto&& default_feature : p_source->scf->core_paragraph.get()->default_features) + for (auto&& default_feature : control_file.core_paragraph.get()->default_features) { auto res = mark_plus(default_feature, cluster, graph, graph_plan, prevent_default_features); if (res != MarkPlusResult::SUCCESS) @@ -513,7 +624,7 @@ namespace vcpkg::Dependencies if (feature == "*") { - for (auto&& fpgh : p_source->scf->feature_paragraphs) + for (auto&& fpgh : control_file.feature_paragraphs) { auto res = mark_plus(fpgh->name, cluster, graph, graph_plan, prevent_default_features); @@ -590,7 +701,8 @@ namespace vcpkg::Dependencies // Check if any default features have been added auto& previous_df = p_installed->ipv.core->package.default_features; - for (auto&& default_feature : p_source->scf->core_paragraph->default_features) + auto&& control_file = *p_source->scfl->source_control_file.get(); + for (auto&& default_feature : control_file.core_paragraph->default_features) { if (std::find(previous_df.begin(), previous_df.end(), default_feature) == previous_df.end()) { @@ -635,7 +747,7 @@ namespace vcpkg::Dependencies /// Map of all source control files in the current environment. /// Feature specifications to resolve dependencies for. /// Status of installed packages in the current environment. - std::vector create_feature_install_plan(const std::unordered_map& map, + std::vector create_feature_install_plan(const std::unordered_map& map, const std::vector& specs, const StatusParagraphs& status_db) { @@ -698,7 +810,11 @@ namespace vcpkg::Dependencies if (p_cluster->transient_uninstalled) { // If it will be transiently uninstalled, we need to issue a full installation command - auto pscf = p_cluster->source.value_or_exit(VCPKG_LINE_INFO).scf; + auto* pscfl = p_cluster->source.value_or_exit(VCPKG_LINE_INFO).scfl; + Checks::check_exit(VCPKG_LINE_INFO, + pscfl != nullptr, + "Error: Expected a SourceControlFileLocation to exist"); + auto&& scfl = *pscfl; auto dep_specs = Util::fmap(m_graph_plan->install_graph.adjacency_list(p_cluster), [](ClusterPtr const& p) { return p->spec; }); @@ -706,7 +822,7 @@ namespace vcpkg::Dependencies plan.emplace_back(InstallPlanAction{ p_cluster->spec, - *pscf, + scfl, p_cluster->to_install_features, p_cluster->request_type, std::move(dep_specs), diff --git a/toolsrc/src/vcpkg/export.cpp b/toolsrc/src/vcpkg/export.cpp index 23fc7441a..88c1526c5 100644 --- a/toolsrc/src/vcpkg/export.cpp +++ b/toolsrc/src/vcpkg/export.cpp @@ -488,7 +488,10 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console // create the plan const StatusParagraphs status_db = database_load_check(paths); - Dependencies::PathsPortFileProvider provider(paths); + + // Load ports from ports dirs + Dependencies::PathsPortFileProvider provider(paths, args.overlay_ports.get()); + std::vector export_plan = Dependencies::create_export_plan(opts.specs, status_db); Checks::check_exit(VCPKG_LINE_INFO, !export_plan.empty(), "Export plan cannot be empty"); diff --git a/toolsrc/src/vcpkg/help.cpp b/toolsrc/src/vcpkg/help.cpp index b92e9ca59..6ee573dfc 100644 --- a/toolsrc/src/vcpkg/help.cpp +++ b/toolsrc/src/vcpkg/help.cpp @@ -111,10 +111,12 @@ namespace vcpkg::Help " vcpkg contact Display contact information to send feedback\n" "\n" "Options:\n" - " --triplet Specify the target architecture triplet.\n" + " --triplet Specify the target architecture triplet\n" " (default: " ENVVAR(VCPKG_DEFAULT_TRIPLET) // ", see 'vcpkg help triplet')\n" "\n" + " --overlay-ports= Specify directories to be used when searching for ports\n" + "\n" " --vcpkg-root Specify the vcpkg root " "directory\n" " (default: " ENVVAR(VCPKG_ROOT) // diff --git a/toolsrc/src/vcpkg/install.cpp b/toolsrc/src/vcpkg/install.cpp index 88b15fe7a..781629236 100644 --- a/toolsrc/src/vcpkg/install.cpp +++ b/toolsrc/src/vcpkg/install.cpp @@ -330,9 +330,10 @@ namespace vcpkg::Install System::printf("Building package %s...\n", display_name_with_features); auto result = [&]() -> Build::ExtendedBuildResult { - const Build::BuildPackageConfig build_config{action.source_control_file.value_or_exit(VCPKG_LINE_INFO), + const auto& scfl = action.source_control_file_location.value_or_exit(VCPKG_LINE_INFO); + const Build::BuildPackageConfig build_config{*scfl.source_control_file, action.spec.triplet(), - paths.port_dir(action.spec), + static_cast(scfl.source_location), action.build_options, action.feature_list}; return Build::build_package(paths, build_config, status_db); @@ -652,13 +653,10 @@ namespace vcpkg::Install Build::FailOnTombstone::NO, }; - auto all_ports = Paragraphs::load_all_ports(fs, paths.ports); - std::unordered_map scf_map; - for (auto&& port : all_ports) - scf_map[port->core_paragraph->name] = std::move(*port); - MapPortFileProvider provider(scf_map); + //// Load ports from ports dirs + PathsPortFileProvider provider(paths, args.overlay_ports.get()); - // Note: action_plan will hold raw pointers to SourceControlFiles from this map + // Note: action_plan will hold raw pointers to SourceControlFileLocations from this map std::vector action_plan = create_feature_install_plan(provider, FullPackageSpec::to_feature_specs(specs), status_db); diff --git a/toolsrc/src/vcpkg/postbuildlint.cpp b/toolsrc/src/vcpkg/postbuildlint.cpp index d6581c2b4..c760a034f 100644 --- a/toolsrc/src/vcpkg/postbuildlint.cpp +++ b/toolsrc/src/vcpkg/postbuildlint.cpp @@ -857,14 +857,15 @@ namespace vcpkg::PostBuildLint size_t perform_all_checks(const PackageSpec& spec, const VcpkgPaths& paths, const PreBuildInfo& pre_build_info, - const BuildInfo& build_info) + const BuildInfo& build_info, + const fs::path& port_dir) { System::print2("-- Performing post-build validation\n"); const size_t error_count = perform_all_checks_and_return_error_count(spec, paths, pre_build_info, build_info); if (error_count != 0) { - const fs::path portfile = paths.ports / spec.name() / "portfile.cmake"; + const fs::path portfile = port_dir / "portfile.cmake"; System::print2(System::Color::error, "Found ", error_count, diff --git a/toolsrc/src/vcpkg/remove.cpp b/toolsrc/src/vcpkg/remove.cpp index f997667ac..a40b27bd7 100644 --- a/toolsrc/src/vcpkg/remove.cpp +++ b/toolsrc/src/vcpkg/remove.cpp @@ -229,7 +229,8 @@ namespace vcpkg::Remove Checks::exit_fail(VCPKG_LINE_INFO); } - Dependencies::PathsPortFileProvider provider(paths); + // Load ports from ports dirs + Dependencies::PathsPortFileProvider provider(paths, args.overlay_ports.get()); specs = Util::fmap(Update::find_outdated_packages(provider, status_db), [](auto&& outdated) { return outdated.spec; }); diff --git a/toolsrc/src/vcpkg/update.cpp b/toolsrc/src/vcpkg/update.cpp index 2c52d5952..6320bae5b 100644 --- a/toolsrc/src/vcpkg/update.cpp +++ b/toolsrc/src/vcpkg/update.cpp @@ -23,10 +23,10 @@ namespace vcpkg::Update for (auto&& ipv : installed_packages) { const auto& pgh = ipv.core; - auto maybe_scf = provider.get_control_file(pgh->package.spec.name()); - if (auto p_scf = maybe_scf.get()) + auto maybe_scfl = provider.get_control_file(pgh->package.spec.name()); + if (auto p_scfl = maybe_scfl.get()) { - auto&& port_version = p_scf->core_paragraph->version; + auto&& port_version = p_scfl->source_control_file->core_paragraph->version; auto&& installed_version = pgh->package.version; if (installed_version != port_version) { @@ -57,7 +57,7 @@ namespace vcpkg::Update const StatusParagraphs status_db = database_load_check(paths); - Dependencies::PathsPortFileProvider provider(paths); + Dependencies::PathsPortFileProvider provider(paths, args.overlay_ports.get()); const auto outdated_packages = SortedVector(find_outdated_packages(provider, status_db), &OutdatedPackage::compare_by_name); diff --git a/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp b/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp index 8565c28f9..21bf4d028 100644 --- a/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp +++ b/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp @@ -45,6 +45,45 @@ namespace vcpkg option_field = new_setting; } + static void parse_multivalue(const std::string* arg_begin, + const std::string* arg_end, + const std::string& option_name, + std::unique_ptr>& option_field) + { + if (arg_begin == arg_end) + { + System::print2(System::Color::error, "Error: expected value after ", option_name, '\n'); + Metrics::g_metrics.lock()->track_property("error", "error option name"); + Help::print_usage(); + Checks::exit_fail(VCPKG_LINE_INFO); + } + + if (!option_field) + { + option_field = std::make_unique>(); + } + option_field->emplace_back(*arg_begin); + } + + static void parse_cojoined_multivalue(std::string new_value, + const std::string& option_name, + std::unique_ptr>& option_field) + { + if (new_value.empty()) + { + System::print2(System::Color::error, "Error: expected value after ", option_name, '\n'); + Metrics::g_metrics.lock()->track_property("error", "error option name"); + Help::print_usage(); + Checks::exit_fail(VCPKG_LINE_INFO); + } + + if (!option_field) + { + option_field = std::make_unique>(); + } + option_field->emplace_back(std::move(new_value)); + } + VcpkgCmdArguments VcpkgCmdArguments::create_from_command_line(const int argc, const CommandLineCharType* const* const argv) { @@ -117,6 +156,13 @@ namespace vcpkg parse_value(arg_begin, arg_end, "--triplet", args.triplet); continue; } + if (Strings::starts_with(arg, "--overlay-ports=")) + { + parse_cojoined_multivalue(arg.substr(sizeof("--overlay-ports=") - 1), + "--overlay-ports", + args.overlay_ports); + continue; + } if (arg == "--debug") { parse_switch(true, "debug", args.debug); @@ -166,7 +212,21 @@ namespace vcpkg const auto eq_pos = arg.find('='); if (eq_pos != std::string::npos) { - args.optional_command_arguments.emplace(arg.substr(0, eq_pos), arg.substr(eq_pos + 1)); + const auto& key = arg.substr(0, eq_pos); + const auto& value = arg.substr(eq_pos + 1); + + auto it = args.optional_command_arguments.find(key); + if (args.optional_command_arguments.end() == it) + { + args.optional_command_arguments.emplace(key, std::vector { value }); + } + else + { + if (auto* maybe_values = it->second.get()) + { + maybe_values->emplace_back(value); + } + } } else { @@ -264,7 +324,51 @@ namespace vcpkg } else { - output.settings.emplace(option.name, it->second.value_or_exit(VCPKG_LINE_INFO)); + const auto& value = it->second.value_or_exit(VCPKG_LINE_INFO); + if (value.front().empty()) + { + // Fail when not given a value, e.g.: "vcpkg install sqlite3 --additional-ports=" + System::printf( + System::Color::error, "Error: The option '%s' must be passed an argument.\n", option.name); + failed = true; + } + else + { + output.settings.emplace(option.name, value.front()); + options_copy.erase(it); + } + } + } + } + + for (auto&& option : command_structure.options.multisettings) + { + const auto it = options_copy.find(option.name); + if (it != options_copy.end()) + { + if (!it->second.has_value()) + { + // Not having a string value indicates it was passed like '--a' + System::printf( + System::Color::error, "Error: The option '%s' must be passed an argument.\n", option.name); + failed = true; + } + else + { + const auto& value = it->second.value_or_exit(VCPKG_LINE_INFO); + for (auto&& v : value) + { + if (v.empty()) + { + System::printf( + System::Color::error, "Error: The option '%s' must be passed an argument.\n", option.name); + failed = true; + } + else + { + output.multisettings[option.name].emplace_back(v); + } + } options_copy.erase(it); } } @@ -306,7 +410,14 @@ namespace vcpkg { System::printf(" %-40s %s\n", (option.name + "=..."), option.short_help_text); } + for (auto&& option : command_structure.options.multisettings) + { + System::printf(" %-40s %s\n", (option.name + "=..."), option.short_help_text); + } System::printf(" %-40s %s\n", "--triplet ", "Set the default triplet for unqualified packages"); + System::printf(" %-40s %s\n", + "--overlay-ports=", + "Specify directories to be used when searching for ports"); System::printf(" %-40s %s\n", "--vcpkg-root ", "Specify the vcpkg directory to use instead of current directory or tool directory"); diff --git a/toolsrc/src/vcpkg/vcpkgpaths.cpp b/toolsrc/src/vcpkg/vcpkgpaths.cpp index 512bcfc35..562a18c9b 100644 --- a/toolsrc/src/vcpkg/vcpkgpaths.cpp +++ b/toolsrc/src/vcpkg/vcpkgpaths.cpp @@ -81,9 +81,6 @@ namespace vcpkg fs::path VcpkgPaths::package_dir(const PackageSpec& spec) const { return this->packages / spec.dir(); } - fs::path VcpkgPaths::port_dir(const PackageSpec& spec) const { return this->ports / spec.name(); } - fs::path VcpkgPaths::port_dir(const std::string& name) const { return this->ports / name; } - fs::path VcpkgPaths::build_info_file_path(const PackageSpec& spec) const { return this->package_dir(spec) / "BUILD_INFO"; diff --git a/toolsrc/vcpkg/vcpkg.vcxproj b/toolsrc/vcpkg/vcpkg.vcxproj index 8edea2244..06d849a74 100644 --- a/toolsrc/vcpkg/vcpkg.vcxproj +++ b/toolsrc/vcpkg/vcpkg.vcxproj @@ -21,8 +21,8 @@ {34671B80-54F9-46F5-8310-AC429C11D4FB} vcpkg - 8.1 - v140 + 10.0 + v142 diff --git a/toolsrc/vcpkglib/vcpkglib.vcxproj b/toolsrc/vcpkglib/vcpkglib.vcxproj index a64eb42fd..2a6853b8a 100644 --- a/toolsrc/vcpkglib/vcpkglib.vcxproj +++ b/toolsrc/vcpkglib/vcpkglib.vcxproj @@ -21,8 +21,8 @@ {B98C92B7-2874-4537-9D46-D14E5C237F04} vcpkglib - 8.1 - v140 + 10.0 + v142 diff --git a/toolsrc/vcpkgmetricsuploader/vcpkgmetricsuploader.vcxproj b/toolsrc/vcpkgmetricsuploader/vcpkgmetricsuploader.vcxproj index e533d0e15..2e689c7fc 100644 --- a/toolsrc/vcpkgmetricsuploader/vcpkgmetricsuploader.vcxproj +++ b/toolsrc/vcpkgmetricsuploader/vcpkgmetricsuploader.vcxproj @@ -21,8 +21,8 @@ {7D6FDEEB-B299-4A23-85EE-F67C4DED47BE} vcpkgmetricsuploader - 8.1 - v140 + 10.0 + v142 diff --git a/toolsrc/vcpkgtest/vcpkgtest.vcxproj b/toolsrc/vcpkgtest/vcpkgtest.vcxproj index 4cda29461..a7517ec54 100644 --- a/toolsrc/vcpkgtest/vcpkgtest.vcxproj +++ b/toolsrc/vcpkgtest/vcpkgtest.vcxproj @@ -48,8 +48,8 @@ {F27B8DB0-1279-4AF8-A2E3-1D49C4F0220D} Win32Proj vcpkgtest - 8.1 - v140 + 10.0 + v142 @@ -84,7 +84,7 @@ - + $(SolutionDir)msbuild.x86.debug\$(ProjectName)\ $(SolutionDir)msbuild.x86.debug\ -- cgit v1.2.3 From 9e565e986789cf273de12fe1b07ce31800d10417 Mon Sep 17 00:00:00 2001 From: Victor Romero Date: Mon, 24 Jun 2019 12:09:48 -0700 Subject: [--overlay-ports] Show location of overriden ports during install plan (#7002) * [--overlay-ports] Show source location of overlayed ports during install plan * Code cleanup * Code cleanup --- toolsrc/include/vcpkg/dependencies.h | 4 +++- toolsrc/src/vcpkg/commands.ci.cpp | 2 +- toolsrc/src/vcpkg/commands.upgrade.cpp | 2 +- toolsrc/src/vcpkg/dependencies.cpp | 40 +++++++++++++++++++++++++++++----- toolsrc/src/vcpkg/install.cpp | 2 +- 5 files changed, 41 insertions(+), 9 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg/dependencies.h b/toolsrc/include/vcpkg/dependencies.h index 8c2050b3d..964158026 100644 --- a/toolsrc/include/vcpkg/dependencies.h +++ b/toolsrc/include/vcpkg/dependencies.h @@ -199,5 +199,7 @@ namespace vcpkg::Dependencies const StatusParagraphs& status_db, const CreateInstallPlanOptions& options = {}); - void print_plan(const std::vector& action_plan, const bool is_recursive = true); + void print_plan(const std::vector& action_plan, + const bool is_recursive = true, + const fs::path& default_ports_dir = ""); } diff --git a/toolsrc/src/vcpkg/commands.ci.cpp b/toolsrc/src/vcpkg/commands.ci.cpp index 8cab79504..c12c26ff7 100644 --- a/toolsrc/src/vcpkg/commands.ci.cpp +++ b/toolsrc/src/vcpkg/commands.ci.cpp @@ -451,7 +451,7 @@ namespace vcpkg::Commands::CI if (is_dry_run) { - Dependencies::print_plan(action_plan); + Dependencies::print_plan(action_plan, true, paths.ports); } else { diff --git a/toolsrc/src/vcpkg/commands.upgrade.cpp b/toolsrc/src/vcpkg/commands.upgrade.cpp index 77183ceaf..1e64b2eb6 100644 --- a/toolsrc/src/vcpkg/commands.upgrade.cpp +++ b/toolsrc/src/vcpkg/commands.upgrade.cpp @@ -171,7 +171,7 @@ namespace vcpkg::Commands::Upgrade } } - Dependencies::print_plan(plan, true); + Dependencies::print_plan(plan, true, paths.ports); if (!no_dry_run) { diff --git a/toolsrc/src/vcpkg/dependencies.cpp b/toolsrc/src/vcpkg/dependencies.cpp index df472515f..b604c9acf 100644 --- a/toolsrc/src/vcpkg/dependencies.cpp +++ b/toolsrc/src/vcpkg/dependencies.cpp @@ -123,6 +123,27 @@ namespace vcpkg::Dependencies const PortFileProvider& m_provider; }; + std::string to_output_string(RequestType request_type, + const CStringView s, + const Build::BuildPackageOptions& options, + const fs::path& install_port_path, + const fs::path& default_port_path) + { + if (!default_port_path.empty() + && !Strings::case_insensitive_ascii_starts_with(install_port_path.u8string(), + default_port_path.u8string())) + { + const char* const from_head = options.use_head_version == Build::UseHeadVersion::YES ? " (from HEAD)" : ""; + switch (request_type) + { + case RequestType::AUTO_SELECTED: return Strings::format(" * %s%s -- %s", s, from_head, install_port_path.u8string()); + case RequestType::USER_REQUESTED: return Strings::format(" %s%s -- %s", s, from_head, install_port_path.u8string()); + default: Checks::unreachable(VCPKG_LINE_INFO); + } + } + return to_output_string(request_type, s, options); + } + std::string to_output_string(RequestType request_type, const CStringView s, const Build::BuildPackageOptions& options) @@ -131,7 +152,7 @@ namespace vcpkg::Dependencies switch (request_type) { - case RequestType::AUTO_SELECTED: return Strings::format(" * %s%s", s, from_head); + case RequestType::AUTO_SELECTED: return Strings::format(" * %s%s", s, from_head); case RequestType::USER_REQUESTED: return Strings::format(" %s%s", s, from_head); default: Checks::unreachable(VCPKG_LINE_INFO); } @@ -141,7 +162,7 @@ namespace vcpkg::Dependencies { switch (request_type) { - case RequestType::AUTO_SELECTED: return Strings::format(" * %s", s); + case RequestType::AUTO_SELECTED: return Strings::format(" * %s", s); case RequestType::USER_REQUESTED: return Strings::format(" %s", s); default: Checks::unreachable(VCPKG_LINE_INFO); } @@ -893,7 +914,7 @@ namespace vcpkg::Dependencies PackageGraph::~PackageGraph() = default; - void print_plan(const std::vector& action_plan, const bool is_recursive) + void print_plan(const std::vector& action_plan, const bool is_recursive, const fs::path& default_ports_dir) { std::vector remove_plans; std::vector rebuilt_plans; @@ -948,8 +969,17 @@ namespace vcpkg::Dependencies std::sort(already_installed_plans.begin(), already_installed_plans.end(), &InstallPlanAction::compare_by_name); std::sort(excluded.begin(), excluded.end(), &InstallPlanAction::compare_by_name); - static auto actions_to_output_string = [](const std::vector& v) { - return Strings::join("\n", v, [](const InstallPlanAction* p) { + static auto actions_to_output_string = [&](const std::vector& v) { + return Strings::join("\n", v, [&](const InstallPlanAction* p) { + if (auto * pscfl = p->source_control_file_location.get()) + { + return to_output_string(p->request_type, + p->displayname(), + p->build_options, + pscfl->source_location, + default_ports_dir); + } + return to_output_string(p->request_type, p->displayname(), p->build_options); }); }; diff --git a/toolsrc/src/vcpkg/install.cpp b/toolsrc/src/vcpkg/install.cpp index 781629236..de19c360a 100644 --- a/toolsrc/src/vcpkg/install.cpp +++ b/toolsrc/src/vcpkg/install.cpp @@ -684,7 +684,7 @@ namespace vcpkg::Install Metrics::g_metrics.lock()->track_property("installplan", specs_string); - Dependencies::print_plan(action_plan, is_recursive); + Dependencies::print_plan(action_plan, is_recursive, paths.ports); if (dry_run) { -- cgit v1.2.3 From 35e985d3ccf60235bc4881df4d934610cd507090 Mon Sep 17 00:00:00 2001 From: Victor Romero Date: Thu, 27 Jun 2019 12:20:12 -0700 Subject: Triplets Overlay Implementation (#7053) * Triplets Overlay Implementation * Use cache for get_triplet_file_path() * Code cleanup --- toolsrc/include/vcpkg/vcpkgcmdarguments.h | 1 + toolsrc/include/vcpkg/vcpkgpaths.h | 11 ++++-- toolsrc/src/vcpkg.cpp | 4 +- toolsrc/src/vcpkg/build.cpp | 13 +++++-- toolsrc/src/vcpkg/help.cpp | 2 + toolsrc/src/vcpkg/vcpkgcmdarguments.cpp | 30 +++++---------- toolsrc/src/vcpkg/vcpkgpaths.cpp | 61 +++++++++++++++++++++++++------ 7 files changed, 83 insertions(+), 39 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/include/vcpkg/vcpkgcmdarguments.h b/toolsrc/include/vcpkg/vcpkgcmdarguments.h index cad013eb8..ff13ae6bf 100644 --- a/toolsrc/include/vcpkg/vcpkgcmdarguments.h +++ b/toolsrc/include/vcpkg/vcpkgcmdarguments.h @@ -88,6 +88,7 @@ namespace vcpkg std::unique_ptr vcpkg_root_dir; std::unique_ptr triplet; std::unique_ptr> overlay_ports; + std::unique_ptr> overlay_triplets; Optional debug = nullopt; Optional sendmetrics = nullopt; Optional printmetrics = nullopt; diff --git a/toolsrc/include/vcpkg/vcpkgpaths.h b/toolsrc/include/vcpkg/vcpkgpaths.h index b09169b02..a30e0c653 100644 --- a/toolsrc/include/vcpkg/vcpkgpaths.h +++ b/toolsrc/include/vcpkg/vcpkgpaths.h @@ -47,14 +47,17 @@ namespace vcpkg struct VcpkgPaths { - static Expected create(const fs::path& vcpkg_root_dir, const std::string& default_vs_path); + static Expected create(const fs::path& vcpkg_root_dir, + const std::string& default_vs_path, + const std::vector* triplets_dirs); fs::path package_dir(const PackageSpec& spec) const; fs::path build_info_file_path(const PackageSpec& spec) const; fs::path listfile_path(const BinaryParagraph& pgh) const; - - const std::vector& get_available_triplets() const; + bool is_valid_triplet(const Triplet& t) const; + const std::vector& get_available_triplets() const; + const fs::path get_triplet_file_path(const Triplet& triplet) const; fs::path root; fs::path packages; @@ -93,7 +96,9 @@ namespace vcpkg Lazy> toolsets_vs2013; fs::path default_vs_path; + std::vector triplets_dirs; mutable std::unique_ptr m_tool_cache; + mutable vcpkg::Cache m_triplets_cache; }; } diff --git a/toolsrc/src/vcpkg.cpp b/toolsrc/src/vcpkg.cpp index e02bdc71f..5da97b136 100644 --- a/toolsrc/src/vcpkg.cpp +++ b/toolsrc/src/vcpkg.cpp @@ -118,7 +118,9 @@ static void inner(const VcpkgCmdArguments& args) auto default_vs_path = System::get_environment_variable("VCPKG_VISUAL_STUDIO_PATH").value_or(""); - const Expected expected_paths = VcpkgPaths::create(vcpkg_root_dir, default_vs_path); + const Expected expected_paths = VcpkgPaths::create(vcpkg_root_dir, + default_vs_path, + args.overlay_triplets.get()); Checks::check_exit(VCPKG_LINE_INFO, !expected_paths.error(), "Error: Invalid vcpkg root directory %s: %s", diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp index 059a09432..f826a4865 100644 --- a/toolsrc/src/vcpkg/build.cpp +++ b/toolsrc/src/vcpkg/build.cpp @@ -361,9 +361,15 @@ namespace vcpkg::Build { auto& fs = paths.get_filesystem(); const Triplet& triplet = spec.triplet(); + const auto& triplet_file_path = paths.get_triplet_file_path(spec.triplet()).u8string(); - if (!Strings::starts_with(Strings::ascii_to_lowercase(config.port_dir.u8string()), - Strings::ascii_to_lowercase(paths.ports.u8string()))) + if (!Strings::case_insensitive_ascii_starts_with(triplet_file_path, + paths.triplets.u8string())) + { + System::printf("-- Loading triplet configuration from: %s\n", triplet_file_path); + } + if (!Strings::case_insensitive_ascii_starts_with(config.port_dir.u8string(), + paths.ports.u8string())) { System::printf("-- Installing port from location: %s\n", config.port_dir.u8string()); } @@ -390,6 +396,7 @@ namespace vcpkg::Build {"PORT", config.scf.core_paragraph->name}, {"CURRENT_PORT_DIR", config.port_dir}, {"TARGET_TRIPLET", spec.triplet().canonical_name()}, + {"TARGET_TRIPLET_FILE", triplet_file_path}, {"VCPKG_PLATFORM_TOOLSET", toolset.version.c_str()}, {"VCPKG_USE_HEAD_VERSION", Util::Enum::to_bool(config.build_package_options.use_head_version) ? "1" : "0"}, {"DOWNLOADS", paths.downloads}, @@ -890,7 +897,7 @@ namespace vcpkg::Build const fs::path& cmake_exe_path = paths.get_tool_exe(Tools::CMAKE); const fs::path ports_cmake_script_path = paths.scripts / "get_triplet_environment.cmake"; - const fs::path triplet_file_path = paths.triplets / (triplet.canonical_name() + ".cmake"); + const fs::path triplet_file_path = paths.get_triplet_file_path(triplet); const auto cmd_launch_cmake = System::make_cmake_cmd(cmake_exe_path, ports_cmake_script_path, diff --git a/toolsrc/src/vcpkg/help.cpp b/toolsrc/src/vcpkg/help.cpp index 6ee573dfc..896f62661 100644 --- a/toolsrc/src/vcpkg/help.cpp +++ b/toolsrc/src/vcpkg/help.cpp @@ -117,6 +117,8 @@ namespace vcpkg::Help "\n" " --overlay-ports= Specify directories to be used when searching for ports\n" "\n" + " --overlay-triplets= Specify directories containing triplets files\n" + "\n" " --vcpkg-root Specify the vcpkg root " "directory\n" " (default: " ENVVAR(VCPKG_ROOT) // diff --git a/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp b/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp index 21bf4d028..3c1452d47 100644 --- a/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp +++ b/toolsrc/src/vcpkg/vcpkgcmdarguments.cpp @@ -45,26 +45,6 @@ namespace vcpkg option_field = new_setting; } - static void parse_multivalue(const std::string* arg_begin, - const std::string* arg_end, - const std::string& option_name, - std::unique_ptr>& option_field) - { - if (arg_begin == arg_end) - { - System::print2(System::Color::error, "Error: expected value after ", option_name, '\n'); - Metrics::g_metrics.lock()->track_property("error", "error option name"); - Help::print_usage(); - Checks::exit_fail(VCPKG_LINE_INFO); - } - - if (!option_field) - { - option_field = std::make_unique>(); - } - option_field->emplace_back(*arg_begin); - } - static void parse_cojoined_multivalue(std::string new_value, const std::string& option_name, std::unique_ptr>& option_field) @@ -163,6 +143,13 @@ namespace vcpkg args.overlay_ports); continue; } + if (Strings::starts_with(arg, "--overlay-triplets=")) + { + parse_cojoined_multivalue(arg.substr(sizeof("--overlay-triplets=") - 1), + "--overlay-triplets", + args.overlay_triplets); + continue; + } if (arg == "--debug") { parse_switch(true, "debug", args.debug); @@ -418,6 +405,9 @@ namespace vcpkg System::printf(" %-40s %s\n", "--overlay-ports=", "Specify directories to be used when searching for ports"); + System::printf(" %-40s %s\n", + "--overlay-triplets=", + "Specify directories containing triplets files"); System::printf(" %-40s %s\n", "--vcpkg-root ", "Specify the vcpkg directory to use instead of current directory or tool directory"); diff --git a/toolsrc/src/vcpkg/vcpkgpaths.cpp b/toolsrc/src/vcpkg/vcpkgpaths.cpp index 562a18c9b..909fbeb44 100644 --- a/toolsrc/src/vcpkg/vcpkgpaths.cpp +++ b/toolsrc/src/vcpkg/vcpkgpaths.cpp @@ -13,7 +13,9 @@ namespace vcpkg { - Expected VcpkgPaths::create(const fs::path& vcpkg_root_dir, const std::string& default_vs_path) + Expected VcpkgPaths::create(const fs::path& vcpkg_root_dir, + const std::string& default_vs_path, + const std::vector* triplets_dirs) { std::error_code ec; const fs::path canonical_vcpkg_root_dir = fs::stdfs::canonical(vcpkg_root_dir, ec); @@ -76,6 +78,20 @@ namespace vcpkg paths.ports_cmake = paths.scripts / "ports.cmake"; + if (triplets_dirs) + { + for (auto&& triplets_dir : *triplets_dirs) + { + auto path = fs::u8path(triplets_dir); + Checks::check_exit(VCPKG_LINE_INFO, + paths.get_filesystem().exists(path), + "Error: Path does not exist '%s'", + triplets_dir); + paths.triplets_dirs.emplace_back(fs::stdfs::canonical(path)); + } + } + paths.triplets_dirs.emplace_back(fs::stdfs::canonical(paths.root / "triplets")); + return paths; } @@ -91,26 +107,47 @@ namespace vcpkg return this->vcpkg_dir_info / (pgh.fullstem() + ".list"); } + bool VcpkgPaths::is_valid_triplet(const Triplet& t) const + { + const auto it = Util::find_if(this->get_available_triplets(), [&](auto&& available_triplet) { + return t.canonical_name() == available_triplet; + }); + return it != this->get_available_triplets().cend(); + } + const std::vector& VcpkgPaths::get_available_triplets() const { return this->available_triplets.get_lazy([this]() -> std::vector { std::vector output; - for (auto&& path : this->get_filesystem().get_files_non_recursive(this->triplets)) + for (auto&& triplets_dir : triplets_dirs) { - output.push_back(path.stem().filename().string()); + for (auto&& path : this->get_filesystem().get_files_non_recursive(triplets_dir)) + { + output.push_back(path.stem().filename().string()); + } } - Util::sort(output); - + Util::sort_unique_erase(output); return output; - }); + }); } - bool VcpkgPaths::is_valid_triplet(const Triplet& t) const - { - const auto it = Util::find_if(this->get_available_triplets(), [&](auto&& available_triplet) { - return t.canonical_name() == available_triplet; - }); - return it != this->get_available_triplets().cend(); + const fs::path VcpkgPaths::get_triplet_file_path(const Triplet& triplet) const + { + return m_triplets_cache.get_lazy(triplet, [&]()-> auto { + for (auto&& triplet_dir : triplets_dirs) + { + auto&& path = triplet_dir / (triplet.canonical_name() + ".cmake"); + if (this->get_filesystem().exists(path)) + { + return path; + } + } + + Checks::exit_with_message(VCPKG_LINE_INFO, + "Error: Triplet file %s.cmake not found", + triplet.canonical_name()); + }); + } const fs::path& VcpkgPaths::get_tool_exe(const std::string& tool) const -- cgit v1.2.3 From b9b2a38c7bd9fd66a5b324b4f398024ad2569d60 Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Sat, 29 Jun 2019 23:05:09 -0700 Subject: [vcpkg-integrate] Improve spelling, help, and autocomplete. (#7095) --- toolsrc/src/vcpkg/commands.integrate.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/vcpkg/commands.integrate.cpp b/toolsrc/src/vcpkg/commands.integrate.cpp index 6921a5390..fda9e2b11 100644 --- a/toolsrc/src/vcpkg/commands.integrate.cpp +++ b/toolsrc/src/vcpkg/commands.integrate.cpp @@ -409,7 +409,7 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console Checks::exit_with_code(VCPKG_LINE_INFO, rc); } -#elif defined(__unix__) +#else static void integrate_bash(const VcpkgPaths& paths) { const auto home_path = System::get_environment_variable("HOME").value_or_exit(VCPKG_LINE_INFO); @@ -458,11 +458,12 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console "first use\n" " vcpkg integrate remove Remove user-wide integration\n" " vcpkg integrate project Generate a referencing nuget package for individual VS project use\n" - " vcpkg integrate powershell Enable PowerShell Tab-Completion\n"; + " vcpkg integrate powershell Enable PowerShell tab-completion\n"; #else const char* const INTEGRATE_COMMAND_HELPSTRING = " vcpkg integrate install Make installed packages available user-wide.\n" - " vcpkg integrate remove Remove user-wide integration\n"; + " vcpkg integrate remove Remove user-wide integration\n" + " vcpkg integrate bash Enable bash tab-completion\n"; #endif namespace Subcommand @@ -476,7 +477,15 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console static std::vector valid_arguments(const VcpkgPaths&) { - return {Subcommand::INSTALL, Subcommand::REMOVE, Subcommand::PROJECT, Subcommand::POWERSHELL, Subcommand::BASH}; + return + { + Subcommand::INSTALL, Subcommand::REMOVE, +#if defined(_WIN32) + Subcommand::PROJECT, Subcommand::POWERSHELL, +#else + Subcommand::BASH, +#endif + }; } const CommandStructure COMMAND_STRUCTURE = { @@ -510,7 +519,7 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console { return integrate_powershell(paths); } -#elif defined(__unix__) +#else if (args.command_arguments[0] == Subcommand::BASH) { return integrate_bash(paths); -- cgit v1.2.3 From 8e747d659c40775ce2a5a2e5d0230e4fd659ef57 Mon Sep 17 00:00:00 2001 From: Phil Christensen Date: Sun, 30 Jun 2019 00:15:08 -0700 Subject: [vcpkg] fail archived port install when decompression fails (#7086) * [vcpkg] fail port install when decompression fails * [vcpkg] clang-format --- toolsrc/src/vcpkg/build.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'toolsrc') diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp index f826a4865..9694bce4c 100644 --- a/toolsrc/src/vcpkg/build.cpp +++ b/toolsrc/src/vcpkg/build.cpp @@ -594,7 +594,7 @@ namespace vcpkg::Build return nullopt; } - static void decompress_archive(const VcpkgPaths& paths, const PackageSpec& spec, const fs::path& archive_path) + static int decompress_archive(const VcpkgPaths& paths, const PackageSpec& spec, const fs::path& archive_path) { auto& fs = paths.get_filesystem(); @@ -608,12 +608,13 @@ namespace vcpkg::Build #if defined(_WIN32) auto&& seven_zip_exe = paths.get_tool_exe(Tools::SEVEN_ZIP); - System::cmd_execute_clean(Strings::format( + int result = System::cmd_execute_clean(Strings::format( R"("%s" x "%s" -o"%s" -y >nul)", seven_zip_exe.u8string(), archive_path.u8string(), pkg_path.u8string())); #else - System::cmd_execute_clean( + int result = System::cmd_execute_clean( Strings::format(R"(unzip -qq "%s" "-d%s")", archive_path.u8string(), pkg_path.u8string())); #endif + return result; } // Compress the source directory into the destination file. @@ -699,11 +700,16 @@ namespace vcpkg::Build { System::print2("Using cached binary package: ", archive_path.u8string(), "\n"); - decompress_archive(paths, spec, archive_path); + auto archive_result = decompress_archive(paths, spec, archive_path); + + if (archive_result != 0) + { + System::print2("Failed to decompress archive package\n"); + return BuildResult::BUILD_FAILED; + } auto maybe_bcf = Paragraphs::try_load_cached_package(paths, spec); - std::unique_ptr bcf = - std::make_unique(std::move(maybe_bcf).value_or_exit(VCPKG_LINE_INFO)); + auto bcf = std::make_unique(std::move(maybe_bcf).value_or_exit(VCPKG_LINE_INFO)); return {BuildResult::SUCCEEDED, std::move(bcf)}; } -- cgit v1.2.3 From e2049cb9754006b6a2abed781d34030e16702fad Mon Sep 17 00:00:00 2001 From: Victor Romero Date: Sun, 30 Jun 2019 09:31:22 -0700 Subject: [vcpkg_configure_cmake] Add NO_CHARSET_FLAG option (#7074) * [vcpkg_configure_cmake] Add NO_CHARSET_FLAG option * [vcpkg_configure_cmake] Add documentation for new NO_CHARSET_FLAG option * [vcpkg_configure_cmake, windows toolchain] Handle NO_CHARSET_FLAG in toolchain * [build.cpp] Add Windows toolchain to package hash * [duilib,msix,thrift,tidy-html5] Use NO_CHARSET_FLAG to fix regressions --- toolsrc/src/vcpkg/build.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'toolsrc') diff --git a/toolsrc/src/vcpkg/build.cpp b/toolsrc/src/vcpkg/build.cpp index 9694bce4c..1975d3aaf 100644 --- a/toolsrc/src/vcpkg/build.cpp +++ b/toolsrc/src/vcpkg/build.cpp @@ -1007,6 +1007,12 @@ namespace vcpkg::Build hash += "-"; hash += Hash::get_file_hash(fs, *p, "SHA1"); } + else if (pre_build_info.cmake_system_name.empty() || + pre_build_info.cmake_system_name == "WindowsStore") + { + hash += "-"; + hash += Hash::get_file_hash(fs, paths.scripts / "toolchains" / "windows.cmake", "SHA1"); + } else if (pre_build_info.cmake_system_name == "Linux") { hash += "-"; -- cgit v1.2.3