diff options
| author | Phil Christensen <philc@microsoft.com> | 2020-02-03 14:22:52 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-03 14:22:52 -0800 |
| commit | e62d1361288e83eba786395b60361ab35ba83800 (patch) | |
| tree | a782ed37dc24eafa81f32082b602922f32d6cfec /toolsrc/include | |
| parent | 586bee9bcd30993033a3590f7e84ef1b648cad10 (diff) | |
| download | vcpkg-e62d1361288e83eba786395b60361ab35ba83800.tar.gz vcpkg-e62d1361288e83eba786395b60361ab35ba83800.zip | |
[vcpkg] Add Supports: field. Use contents of triplets instead of names for dependency resolution. (#8601)
* remove unfinished "supports" tag
* extract "supports" from control files
But do nothing with the value
* Start `Supports` documentation
* Use Supports in a bunch of control files
I only tried matching the already existing logic in the portfile.cmake.
* Cmake var provider (#8)
* Cmake var provider (#9)
* fix windows build (#10)
* Add missing files to build
* Fix test (#11)
* adding hooks for cmake variables in expressions
* Adding hooks for 'supports' in CI test
* Fix test (#12)
* Add overrides to evaluation environment
* use "supported" tag in CI testing
* cleanup comment
* Fix issues with PR
* [var_provider] Get library linkage variables from triplet
* Fix compilation errors in tests
* Add unimplemented functions
* Fix unit tests part 1
* Fix issue when buildtrees dir does not exist
* Change binary output hash
* Fix handling of * feature
* Add core feature when using *
* Do not add Default-Features when installing 'core'
* [vcpkg] WIP. 6 failing tests.
* [vcpkg] WIP. 1 failing tests.
* [vcpkg] WIP. 0 failing tests.
* [vcpkg] Removed 'remove_graph'. 0 failing tests.
* [vcpkg] Removed 'install_graph'. 0 failing tests.
* [vcpkg] Remove AnyAction; replace with ActionPlan
* [vcpkg] Minor cleanup.
* [vcpkg][z3][qt5-connectivity][qt5-purchasing] Improve error messages while parsing. Fix a few trivial port issues.
* [vcpkg] Work around ICE with MSVC v140
* [vcpkg] Add purge on fail to decompress for CI
* [vcpkg] Fix parsing of nested parentheses in qualifiers
* [vcpkg] Fix Linux builds (explicit qualification in declaration)
* [vcpkg] Fix Build-Depends implying default features. Fix qualified dependencies regression.
* [mmx] Add to skip list and full rebuild -- mmx causes problems by installing 'sched.h'
* [libpqxx][mqtt-cpp] Prevent installing include/CMakeLists.txt
* [cppitertools] Fix installed include namespace (should be include/cppitertools)
* [libsoundio] Move headers into soundio/ subdirectory as per original cmake
* [ci.baseline] Temporarily skip charls due to conflict with dcmtk
* [vcpkg] Add restricted include files post build check -- bump global abi version
* [libsoundio] Hotfix stray line in portfile
* [vcpkg] Fix regression: CMake information was not being displayed for build-and-install actions
* [jsonnet] Fix installation of internal headers; use system nlohmann-json
* [grpc][upb] Teach grpc to use packaged upb. Add find_package(upb). Remove inappropriate upb features.
* [zfp] Move problematic 'include/bitstream.h' to 'include/zfp/bitstream.h'
* [x265] Bump control version to trigger rebuild after zfp conflict
* [akali] Disable parallel configure
* [dirent][dlfcn-win32][getopt-win32][pthreads] Grandfather into VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS
* [ci.baseline] Update baseline for improved upb support
* [tgui] Disable parallel configure
* [libiconv] Enable VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS
* [aws-sdk-cpp] Disable parallel configure
* [vcpkg] Implement policy VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS
* [aws-sdk-cpp] Fix amount of escaping semicolons -- Note: I do not know the root cause requiring this change
* [libodb-sqlite] Fix configuring into source directory
* [gettext] Grandfather into VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS
* [libodb] DISABLE_PARALLEL_CONFIGURE
* [vcpkg] Add 'config.h' and 'local.h' to restricted header list
* [mcpp] Remove unused and problematic include 'config.h' from installed files
* [teemo] Move installed headers into subdirectory to prevent conflicts with x265
* [ci.baseline] Update current OSX. Skip libmesh on all platforms due to heavy conflicts.
* [vcpkg] Add 'slice.h' as a restricted header
* [osg] Improve accuracy of dependencies (disable some, add some to Depends)
* [vcpkg] Skip invoking a subprocess for 0 specs in load_tag_vars
* [ci.baseline] Skip mongo-c-driver on osx due to flakiness
* [teemo] Fix incorrect include file read
* [osg] Fix dependency typo: glut -> freeglut
* [vcpkg] Recover some lost performance with the addition of vcpkg_get_tags.
A huge performance cost was loading the triplet files over and over; instead, we splice the sources into a macro and load it once, then just call that macro for each port.
Remove use of hashing because we aren't cross-process-safe anyway (global static will do instead).
* [vcpkg] Change Supports atom 'windows' to include UWP. Improve Supports field documentation.
* [vcpkg] Add docs for VCPKG_ENV_PASSTHROUGH and VCPKG_DEP_INFO_OVERRIDE_VARS
* Fix typo
Co-authored-by: Curtis J Bezault <curtbezault@gmail.com>
Co-authored-by: Victor Romero <romerosanchezv@gmail.com>
Co-authored-by: Robert Schumacher <roschuma@microsoft.com>
Diffstat (limited to 'toolsrc/include')
| -rw-r--r-- | toolsrc/include/vcpkg-test/mockcmakevarprovider.h | 38 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg-test/util.h | 23 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/base/graphs.h | 47 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/base/span.h | 3 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/base/util.h | 14 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/binaryparagraph.h | 11 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/build.h | 36 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/cmakevars.h | 69 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/dependencies.h | 98 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/install.h | 14 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/logicexpression.h | 16 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/packagespec.h | 29 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/portfileprovider.h | 38 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/sourceparagraph.h | 88 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/statusparagraph.h | 1 | ||||
| -rw-r--r-- | toolsrc/include/vcpkg/update.h | 2 |
16 files changed, 352 insertions, 175 deletions
diff --git a/toolsrc/include/vcpkg-test/mockcmakevarprovider.h b/toolsrc/include/vcpkg-test/mockcmakevarprovider.h new file mode 100644 index 000000000..03defdcdd --- /dev/null +++ b/toolsrc/include/vcpkg-test/mockcmakevarprovider.h @@ -0,0 +1,38 @@ +#pragma once
+
+#include <vcpkg/cmakevars.h>
+
+namespace vcpkg::Test
+{
+ struct MockCMakeVarProvider : CMakeVars::CMakeVarProvider
+ {
+ void load_generic_triplet_vars(const Triplet& triplet) const override { generic_triplet_vars[triplet] = {}; }
+
+ void load_dep_info_vars(Span<const PackageSpec> specs) const override
+ {
+ for (auto&& spec : specs)
+ dep_info_vars[spec] = {};
+ }
+
+ void load_tag_vars(Span<const FullPackageSpec> specs,
+ const PortFileProvider::PortFileProvider& port_provider) const override
+ {
+ for (auto&& spec : specs)
+ tag_vars[spec.package_spec] = {};
+ Util::unused(port_provider);
+ }
+
+ Optional<const std::unordered_map<std::string, std::string>&> get_generic_triplet_vars(
+ const Triplet& triplet) const override;
+
+ Optional<const std::unordered_map<std::string, std::string>&> get_dep_info_vars(
+ const PackageSpec& spec) const override;
+
+ Optional<const std::unordered_map<std::string, std::string>&> get_tag_vars(
+ const PackageSpec& spec) const override;
+
+ mutable std::unordered_map<PackageSpec, std::unordered_map<std::string, std::string>> dep_info_vars;
+ mutable std::unordered_map<PackageSpec, std::unordered_map<std::string, std::string>> tag_vars;
+ mutable std::unordered_map<Triplet, std::unordered_map<std::string, std::string>> generic_triplet_vars;
+ };
+}
diff --git a/toolsrc/include/vcpkg-test/util.h b/toolsrc/include/vcpkg-test/util.h index 259b0ba7e..088a39b7d 100644 --- a/toolsrc/include/vcpkg-test/util.h +++ b/toolsrc/include/vcpkg-test/util.h @@ -17,6 +17,12 @@ namespace vcpkg::Test { + std::unique_ptr<SourceControlFile> make_control_file( + const char* name, + const char* depends, + const std::vector<std::pair<const char*, const char*>>& features = {}, + const std::vector<const char*>& default_features = {}); + std::unique_ptr<vcpkg::StatusParagraph> make_status_pgh(const char* name, const char* depends = "", const char* default_features = "", @@ -27,6 +33,23 @@ namespace vcpkg::Test const char* depends = "", const char* triplet = "x86-windows"); + /// <summary> + /// Map of source control files by their package name. + /// </summary> + struct PackageSpecMap + { + std::unordered_map<std::string, SourceControlFileLocation> map; + Triplet triplet; + PackageSpecMap(const Triplet& t = Triplet::X86_WINDOWS) noexcept : triplet(t) {} + + PackageSpec emplace(const char* name, + const char* depends = "", + const std::vector<std::pair<const char*, const char*>>& features = {}, + const std::vector<const char*>& default_features = {}); + + PackageSpec emplace(vcpkg::SourceControlFileLocation&& scfl); + }; + vcpkg::PackageSpec unsafe_pspec(std::string name, vcpkg::Triplet t = vcpkg::Triplet::X86_WINDOWS); template<class T, class S> diff --git a/toolsrc/include/vcpkg/base/graphs.h b/toolsrc/include/vcpkg/base/graphs.h index 683735b1c..f368a872d 100644 --- a/toolsrc/include/vcpkg/base/graphs.h +++ b/toolsrc/include/vcpkg/base/graphs.h @@ -1,11 +1,10 @@ #pragma once +#include <string> #include <unordered_map> -#include <unordered_set> -#include <utility> +#include <vector> #include <vcpkg/base/checks.h> -#include <vcpkg/base/span.h> #include <vcpkg/base/system.print.h> namespace vcpkg::Graphs @@ -95,10 +94,8 @@ namespace vcpkg::Graphs } } - template<class VertexContainer, class V, class U> - std::vector<U> topological_sort(VertexContainer starting_vertices, - const AdjacencyProvider<V, U>& f, - Randomizer* randomizer) + template<class Range, class V, class U> + std::vector<U> topological_sort(Range starting_vertices, const AdjacencyProvider<V, U>& f, Randomizer* randomizer) { std::vector<U> sorted; std::unordered_map<V, ExplorationStatus> exploration_status; @@ -112,40 +109,4 @@ namespace vcpkg::Graphs return sorted; } - - template<class V> - struct Graph final : AdjacencyProvider<V, V> - { - public: - void add_vertex(const V& v) { this->m_edges[v]; } - - void add_edge(const V& u, const V& v) - { - this->m_edges[v]; - this->m_edges[u].insert(v); - } - - std::vector<V> vertex_list() const - { - std::vector<V> vertex_list; - for (auto&& vertex : this->m_edges) - vertex_list.emplace_back(vertex.first); - return vertex_list; - } - - std::vector<V> adjacency_list(const V& vertex) const override - { - const std::unordered_set<V>& as_set = this->m_edges.at(vertex); - return std::vector<V>(as_set.cbegin(), as_set.cend()); // TODO: Avoid redundant copy - } - - V load_vertex_data(const V& vertex) const override { return vertex; } - - // Note: this function indicates how tied this template is to the exact type it will be templated upon. - // Possible fix: This type shouldn't implement to_string() and should instead be derived from? - std::string to_string(const V& spec) const override { return spec->spec.to_string(); } - - private: - std::unordered_map<V, std::unordered_set<V>> m_edges; - }; } diff --git a/toolsrc/include/vcpkg/base/span.h b/toolsrc/include/vcpkg/base/span.h index 4c805e2b4..a5ba884af 100644 --- a/toolsrc/include/vcpkg/base/span.h +++ b/toolsrc/include/vcpkg/base/span.h @@ -23,14 +23,13 @@ namespace vcpkg constexpr Span(std::nullptr_t) noexcept : m_ptr(nullptr), m_count(0) {}
constexpr Span(pointer ptr, size_t count) noexcept : m_ptr(ptr), m_count(count) {}
constexpr Span(pointer ptr_begin, pointer ptr_end) noexcept : m_ptr(ptr_begin), m_count(ptr_end - ptr_begin) {}
- constexpr Span(std::initializer_list<T> l) noexcept : m_ptr(l.begin()), m_count(l.size()) {}
template<size_t N>
constexpr Span(T (&arr)[N]) noexcept : m_ptr(arr), m_count(N)
{
}
- template<size_t N>
+ template<size_t N, class = std::enable_if_t<std::is_const_v<T>>>
constexpr Span(std::remove_const_t<T> (&arr)[N]) noexcept : m_ptr(arr), m_count(N)
{
}
diff --git a/toolsrc/include/vcpkg/base/util.h b/toolsrc/include/vcpkg/base/util.h index ad628e071..849781b95 100644 --- a/toolsrc/include/vcpkg/base/util.h +++ b/toolsrc/include/vcpkg/base/util.h @@ -18,7 +18,7 @@ namespace vcpkg::Util namespace Vectors { template<class Container, class T = ElementT<Container>> - void concatenate(std::vector<T>* augend, const Container& addend) + void append(std::vector<T>* augend, const Container& addend) { augend->insert(augend->end(), addend.begin(), addend.end()); } @@ -122,6 +122,12 @@ namespace vcpkg::Util std::sort(begin(cont), end(cont), comp); } + template<class Range, class Pred> + bool any_of(Range&& rng, Pred pred) + { + return std::any_of(rng.begin(), rng.end(), std::move(pred)); + } + template<class Range> Range&& sort_unique_erase(Range&& cont) { @@ -220,4 +226,10 @@ namespace vcpkg::Util void unused(const Ts&...) { } + + template<class T> + T copy(const T& t) + { + return t; + } } diff --git a/toolsrc/include/vcpkg/binaryparagraph.h b/toolsrc/include/vcpkg/binaryparagraph.h index 457205384..223a1fb86 100644 --- a/toolsrc/include/vcpkg/binaryparagraph.h +++ b/toolsrc/include/vcpkg/binaryparagraph.h @@ -13,8 +13,14 @@ namespace vcpkg { BinaryParagraph(); explicit BinaryParagraph(Parse::RawParagraph fields); - BinaryParagraph(const SourceParagraph& spgh, const Triplet& triplet, const std::string& abi_tag); - BinaryParagraph(const SourceParagraph& spgh, const FeatureParagraph& fpgh, const Triplet& triplet); + BinaryParagraph(const SourceParagraph& spgh, + const Triplet& triplet, + const std::string& abi_tag, + const std::vector<FeatureSpec>& deps); + BinaryParagraph(const SourceParagraph& spgh, + const FeatureParagraph& fpgh, + const Triplet& triplet, + const std::vector<FeatureSpec>& deps); std::string displayname() const; @@ -30,6 +36,7 @@ namespace vcpkg std::vector<std::string> default_features; std::vector<std::string> depends; std::string abi; + Type type; }; struct BinaryControlFile diff --git a/toolsrc/include/vcpkg/build.h b/toolsrc/include/vcpkg/build.h index be5424296..57663ebe5 100644 --- a/toolsrc/include/vcpkg/build.h +++ b/toolsrc/include/vcpkg/build.h @@ -1,5 +1,6 @@ #pragma once +#include <vcpkg/cmakevars.h> #include <vcpkg/packagespec.h> #include <vcpkg/statusparagraphs.h> #include <vcpkg/triplet.h> @@ -21,6 +22,7 @@ namespace vcpkg::Build { void perform_and_exit_ex(const FullPackageSpec& full_spec, const SourceControlFileLocation& scfl, + const PortFileProvider::PathsPortFileProvider& provider, const ParsedArguments& options, const VcpkgPaths& paths); @@ -88,6 +90,12 @@ namespace vcpkg::Build YES }; + enum class PurgeDecompressFailure + { + NO = 0, + YES + }; + struct BuildPackageOptions { UseHeadVersion use_head_version; @@ -99,6 +107,7 @@ namespace vcpkg::Build DownloadTool download_tool; BinaryCaching binary_caching; FailOnTombstone fail_on_tombstone; + PurgeDecompressFailure purge_decompress_failure; }; enum class BuildResult @@ -130,12 +139,9 @@ namespace vcpkg::Build /// </summary> struct PreBuildInfo { - /// <summary> - /// Runs the triplet file in a "capture" mode to create a PreBuildInfo - /// </summary> - static PreBuildInfo from_triplet_file(const VcpkgPaths& paths, - const Triplet& triplet, - Optional<const SourceControlFileLocation&> port = nullopt); + PreBuildInfo(const VcpkgPaths& paths, + const Triplet& triplet, + const std::unordered_map<std::string, std::string>& cmakevars); std::string triplet_abi_tag; std::string target_architecture; @@ -193,12 +199,18 @@ namespace vcpkg::Build BuildPackageConfig(const SourceControlFileLocation& scfl, const Triplet& triplet, const BuildPackageOptions& build_package_options, - const std::set<std::string>& feature_list) + const CMakeVars::CMakeVarProvider& var_provider, + const std::unordered_map<std::string, std::vector<FeatureSpec>>& feature_dependencies, + const std::vector<PackageSpec>& package_dependencies, + const std::vector<std::string>& feature_list) : scfl(scfl) , scf(*scfl.source_control_file) , triplet(triplet) , port_dir(scfl.source_location) , build_package_options(build_package_options) + , var_provider(var_provider) + , feature_dependencies(feature_dependencies) + , package_dependencies(package_dependencies) , feature_list(feature_list) { } @@ -206,9 +218,13 @@ namespace vcpkg::Build const SourceControlFileLocation& scfl; const SourceControlFile& scf; const Triplet& triplet; - fs::path port_dir; + const fs::path& port_dir; const BuildPackageOptions& build_package_options; - const std::set<std::string>& feature_list; + const CMakeVars::CMakeVarProvider& var_provider; + + const std::unordered_map<std::string, std::vector<FeatureSpec>>& feature_dependencies; + const std::vector<PackageSpec>& package_dependencies; + const std::vector<std::string>& feature_list; }; ExtendedBuildResult build_package(const VcpkgPaths& paths, @@ -223,6 +239,7 @@ namespace vcpkg::Build ONLY_RELEASE_CRT, EMPTY_INCLUDE_FOLDER, ALLOW_OBSOLETE_MSVCRT, + ALLOW_RESTRICTED_HEADERS, // Must be last COUNT, }; @@ -234,6 +251,7 @@ namespace vcpkg::Build BuildPolicy::ONLY_RELEASE_CRT, BuildPolicy::EMPTY_INCLUDE_FOLDER, BuildPolicy::ALLOW_OBSOLETE_MSVCRT, + BuildPolicy::ALLOW_RESTRICTED_HEADERS, }; const std::string& to_string(BuildPolicy policy); diff --git a/toolsrc/include/vcpkg/cmakevars.h b/toolsrc/include/vcpkg/cmakevars.h new file mode 100644 index 000000000..c634866d0 --- /dev/null +++ b/toolsrc/include/vcpkg/cmakevars.h @@ -0,0 +1,69 @@ +#pragma once + +#include <vcpkg/base/hash.h> +#include <vcpkg/base/system.process.h> + +#include <vcpkg/portfileprovider.h> +#include <vcpkg/vcpkgpaths.h> + +namespace vcpkg::CMakeVars +{ + struct CMakeVarProvider + { + virtual Optional<const std::unordered_map<std::string, std::string>&> get_generic_triplet_vars( + const Triplet& triplet) const = 0; + + virtual Optional<const std::unordered_map<std::string, std::string>&> get_dep_info_vars( + const PackageSpec& spec) const = 0; + + virtual Optional<const std::unordered_map<std::string, std::string>&> get_tag_vars( + const PackageSpec& spec) const = 0; + + virtual void load_generic_triplet_vars(const Triplet& triplet) const = 0; + + virtual void load_dep_info_vars(Span<const PackageSpec> specs) const = 0; + + virtual void load_tag_vars(Span<const FullPackageSpec> specs, + const PortFileProvider::PortFileProvider& port_provider) const = 0; + }; + + struct TripletCMakeVarProvider : Util::ResourceBase, CMakeVarProvider + { + private: + fs::path create_tag_extraction_file( + const Span<const std::pair<const FullPackageSpec*, std::string>>& spec_abi_settings) const; + + fs::path create_dep_info_extraction_file(const Span<const PackageSpec> specs) const; + + void launch_and_split(const fs::path& script_path, + std::vector<std::vector<std::pair<std::string, std::string>>>& vars) const; + + public: + explicit TripletCMakeVarProvider(const vcpkg::VcpkgPaths& paths) : paths(paths) {} + + void load_generic_triplet_vars(const Triplet& triplet) const override; + + void load_dep_info_vars(Span<const PackageSpec> specs) const override; + + void load_tag_vars(Span<const FullPackageSpec> specs, + const PortFileProvider::PortFileProvider& port_provider) const override; + + Optional<const std::unordered_map<std::string, std::string>&> get_generic_triplet_vars( + const Triplet& triplet) const override; + + Optional<const std::unordered_map<std::string, std::string>&> get_dep_info_vars( + const PackageSpec& spec) const override; + + Optional<const std::unordered_map<std::string, std::string>&> get_tag_vars( + const PackageSpec& spec) const override; + + private: + const VcpkgPaths& paths; + const fs::path& cmake_exe_path = paths.get_tool_exe(Tools::CMAKE); + const fs::path get_tags_path = paths.scripts / "vcpkg_get_tags.cmake"; + const fs::path get_dep_info_path = paths.scripts / "vcpkg_get_dep_info.cmake"; + mutable std::unordered_map<PackageSpec, std::unordered_map<std::string, std::string>> dep_resolution_vars; + mutable std::unordered_map<PackageSpec, std::unordered_map<std::string, std::string>> tag_vars; + mutable std::unordered_map<Triplet, std::unordered_map<std::string, std::string>> generic_triplet_vars; + }; +} diff --git a/toolsrc/include/vcpkg/dependencies.h b/toolsrc/include/vcpkg/dependencies.h index e9018b1b8..eb9d42b6d 100644 --- a/toolsrc/include/vcpkg/dependencies.h +++ b/toolsrc/include/vcpkg/dependencies.h @@ -3,7 +3,9 @@ #include <vcpkg/base/optional.h> #include <vcpkg/base/util.h> #include <vcpkg/build.h> +#include <vcpkg/cmakevars.h> #include <vcpkg/packagespec.h> +#include <vcpkg/portfileprovider.h> #include <vcpkg/statusparagraphs.h> #include <vcpkg/vcpkgpaths.h> @@ -43,15 +45,12 @@ namespace vcpkg::Dependencies InstallPlanAction() noexcept; - InstallPlanAction(InstalledPackageView&& spghs, - const std::set<std::string>& features, - const RequestType& request_type); + InstallPlanAction(InstalledPackageView&& spghs, const RequestType& request_type); InstallPlanAction(const PackageSpec& spec, const SourceControlFileLocation& scfl, - const std::set<std::string>& features, const RequestType& request_type, - std::vector<PackageSpec>&& dependencies); + std::unordered_map<std::string, std::vector<FeatureSpec>>&& dependencies); std::string displayname() const; @@ -63,9 +62,11 @@ namespace vcpkg::Dependencies InstallPlanType plan_type; RequestType request_type; Build::BuildPackageOptions build_options; - std::set<std::string> feature_list; - std::vector<PackageSpec> computed_dependencies; + std::unordered_map<std::string, std::vector<FeatureSpec>> feature_dependencies; + std::vector<PackageSpec> package_dependencies; + + std::vector<std::string> feature_list; }; enum class RemovePlanType @@ -87,15 +88,14 @@ namespace vcpkg::Dependencies RequestType request_type; }; - struct AnyAction + struct ActionPlan { - AnyAction(InstallPlanAction&& iplan) : install_action(std::move(iplan)) {} - AnyAction(RemovePlanAction&& rplan) : remove_action(std::move(rplan)) {} - - Optional<InstallPlanAction> install_action; - Optional<RemovePlanAction> remove_action; + bool empty() const { return remove_actions.empty() && already_installed.empty() && install_actions.empty(); } + size_t size() const { return remove_actions.size() + already_installed.size() + install_actions.size(); } - const PackageSpec& spec() const; + std::vector<RemovePlanAction> remove_actions; + std::vector<InstallPlanAction> already_installed; + std::vector<InstallPlanAction> install_actions; }; enum class ExportPlanType @@ -127,80 +127,36 @@ namespace vcpkg::Dependencies Optional<InstalledPackageView> m_installed_package; }; - struct PortFileProvider - { - virtual Optional<const SourceControlFileLocation&> get_control_file(const std::string& src_name) const = 0; - virtual std::vector<const SourceControlFileLocation*> load_all_control_files() const = 0; - }; - - struct MapPortFileProvider : Util::ResourceBase, PortFileProvider - { - explicit MapPortFileProvider(const std::unordered_map<std::string, SourceControlFileLocation>& map); - Optional<const SourceControlFileLocation&> get_control_file(const std::string& src_name) const override; - std::vector<const SourceControlFileLocation*> load_all_control_files() const override; - - private: - const std::unordered_map<std::string, SourceControlFileLocation>& ports; - }; - - struct PathsPortFileProvider : Util::ResourceBase, PortFileProvider - { - explicit PathsPortFileProvider(const vcpkg::VcpkgPaths& paths, - const std::vector<std::string>* ports_dirs_paths); - Optional<const SourceControlFileLocation&> get_control_file(const std::string& src_name) const override; - std::vector<const SourceControlFileLocation*> load_all_control_files() const override; - - private: - Files::Filesystem& filesystem; - std::vector<fs::path> ports_dirs; - mutable std::unordered_map<std::string, SourceControlFileLocation> cache; - }; - struct ClusterGraph; - struct GraphPlan; struct CreateInstallPlanOptions { Graphs::Randomizer* randomizer = nullptr; }; - struct PackageGraph - { - PackageGraph(const PortFileProvider& provider, const StatusParagraphs& status_db); - ~PackageGraph(); - - void install(const FeatureSpec& spec, - const std::unordered_set<std::string>& prevent_default_features = {}) const; - void upgrade(const PackageSpec& spec) const; - - std::vector<AnyAction> serialize(const CreateInstallPlanOptions& options = {}) const; - - private: - std::unique_ptr<GraphPlan> m_graph_plan; - std::unique_ptr<ClusterGraph> m_graph; - }; - std::vector<RemovePlanAction> create_remove_plan(const std::vector<PackageSpec>& specs, const StatusParagraphs& status_db); std::vector<ExportPlanAction> create_export_plan(const std::vector<PackageSpec>& specs, const StatusParagraphs& status_db); - std::vector<AnyAction> create_feature_install_plan( - const std::unordered_map<std::string, SourceControlFileLocation>& map, - const std::vector<FeatureSpec>& specs, - const StatusParagraphs& status_db); - /// <summary>Figure out which actions are required to install features specifications in `specs`.</summary> /// <param name="provider">Contains the ports of the current environment.</param> /// <param name="specs">Feature specifications to resolve dependencies for.</param> /// <param name="status_db">Status of installed packages in the current environment.</param> - std::vector<AnyAction> create_feature_install_plan(const PortFileProvider& provider, - const std::vector<FeatureSpec>& specs, - const StatusParagraphs& status_db, - const CreateInstallPlanOptions& options = {}); - - void print_plan(const std::vector<AnyAction>& action_plan, + ActionPlan create_feature_install_plan(const PortFileProvider::PortFileProvider& provider, + const CMakeVars::CMakeVarProvider& var_provider, + const std::vector<FullPackageSpec>& specs, + const StatusParagraphs& status_db, + const CreateInstallPlanOptions& options = {}); + + ActionPlan create_upgrade_plan(const PortFileProvider::PortFileProvider& provider, + const CMakeVars::CMakeVarProvider& var_provider, + const std::vector<PackageSpec>& specs, + const StatusParagraphs& status_db, + const CreateInstallPlanOptions& options = {}); + + void print_plan(const ActionPlan& action_plan, const bool is_recursive = true, const fs::path& default_ports_dir = ""); } diff --git a/toolsrc/include/vcpkg/install.h b/toolsrc/include/vcpkg/install.h index 2e92764dc..e020c8653 100644 --- a/toolsrc/include/vcpkg/install.h +++ b/toolsrc/include/vcpkg/install.h @@ -20,7 +20,7 @@ namespace vcpkg::Install struct SpecSummary { - SpecSummary(const PackageSpec& spec, const Dependencies::AnyAction* action); + SpecSummary(const PackageSpec& spec, const Dependencies::InstallPlanAction* action); const BinaryParagraph* get_binary_paragraph() const; @@ -28,7 +28,7 @@ namespace vcpkg::Install Build::ExtendedBuildResult build_result; vcpkg::Chrono::ElapsedTime timing; - const Dependencies::AnyAction* action; + const Dependencies::InstallPlanAction* action; }; struct InstallSummary @@ -58,8 +58,9 @@ namespace vcpkg::Install }; Build::ExtendedBuildResult perform_install_plan_action(const VcpkgPaths& paths, - const Dependencies::InstallPlanAction& action, - StatusParagraphs& status_db); + Dependencies::InstallPlanAction& action, + StatusParagraphs& status_db, + const CMakeVars::CMakeVarProvider& var_provider); enum class InstallResult { @@ -74,10 +75,11 @@ namespace vcpkg::Install const BinaryControlFile& binary_paragraph, StatusParagraphs* status_db); - InstallSummary perform(const std::vector<Dependencies::AnyAction>& action_plan, + InstallSummary perform(Dependencies::ActionPlan& action_plan, const KeepGoing keep_going, const VcpkgPaths& paths, - StatusParagraphs& status_db); + StatusParagraphs& status_db, + const CMakeVars::CMakeVarProvider& var_provider); extern const CommandStructure COMMAND_STRUCTURE; diff --git a/toolsrc/include/vcpkg/logicexpression.h b/toolsrc/include/vcpkg/logicexpression.h index 8795971b9..3a3d0debe 100644 --- a/toolsrc/include/vcpkg/logicexpression.h +++ b/toolsrc/include/vcpkg/logicexpression.h @@ -1,10 +1,24 @@ #pragma once
#include <string>
+#include <unordered_map>
+#include <vcpkg/base/expected.h>
namespace vcpkg
{
+ struct ExpressionContext
+ {
+ // map of cmake variables and their values.
+ const std::unordered_map<std::string, std::string>& cmake_context;
+
+ // The legacy context is a string (typically the name of the triplet).
+ // An identifier was considered 'true' if it is a substring of this.
+ // It is now used for backwards compatability diagnostic messages and
+ // will be eventually removed.
+ const std::string& legacy_context;
+ };
+
// Evaluate simple vcpkg logic expressions. An identifier in the expression is considered 'true'
// if it is a substring of the evaluation_context (typically the name of the triplet)
- bool evaluate_expression(const std::string& expression, const std::string& evaluation_context);
+ ExpectedT<bool, std::string> evaluate_expression(const std::string& expression, const ExpressionContext& context);
}
\ No newline at end of file diff --git a/toolsrc/include/vcpkg/packagespec.h b/toolsrc/include/vcpkg/packagespec.h index c87c6a2c6..628352cdb 100644 --- a/toolsrc/include/vcpkg/packagespec.h +++ b/toolsrc/include/vcpkg/packagespec.h @@ -23,6 +23,9 @@ namespace vcpkg /// struct PackageSpec { + PackageSpec() noexcept = default; + PackageSpec(std::string name, Triplet triplet) : m_name(std::move(name)), m_triplet(triplet) {} + static ExpectedT<PackageSpec, PackageSpecParseResult> from_name_and_triplet(const std::string& name, const Triplet& triplet); @@ -103,7 +106,14 @@ namespace vcpkg PackageSpec package_spec; std::vector<std::string> features; - static std::vector<FeatureSpec> to_feature_specs(const std::vector<FullPackageSpec>& specs); + FullPackageSpec() noexcept = default; + explicit FullPackageSpec(PackageSpec spec, std::vector<std::string> features = {}) + : package_spec(std::move(spec)), features(std::move(features)) + { + } + + std::vector<FeatureSpec> to_feature_specs(const std::vector<std::string>& default_features, + const std::vector<std::string>& all_features) const; static ExpectedT<FullPackageSpec, PackageSpecParseResult> from_string(const std::string& spec_as_string, const Triplet& default_triplet); @@ -145,4 +155,21 @@ namespace std { bool operator()(const vcpkg::PackageSpec& left, const vcpkg::PackageSpec& right) const { return left == right; } }; + + template<> + struct hash<vcpkg::FeatureSpec> + { + size_t operator()(const vcpkg::FeatureSpec& value) const + { + size_t hash = std::hash<vcpkg::PackageSpec>()(value.spec()); + hash = hash * 31 + std::hash<std::string>()(value.feature()); + return hash; + } + }; + + template<> + struct equal_to<vcpkg::FeatureSpec> + { + bool operator()(const vcpkg::FeatureSpec& left, const vcpkg::FeatureSpec& right) const { return left == right; } + }; } diff --git a/toolsrc/include/vcpkg/portfileprovider.h b/toolsrc/include/vcpkg/portfileprovider.h new file mode 100644 index 000000000..79f69d9ae --- /dev/null +++ b/toolsrc/include/vcpkg/portfileprovider.h @@ -0,0 +1,38 @@ +#pragma once + +#include <vcpkg/base/optional.h> +#include <vcpkg/base/util.h> +#include <vcpkg/sourceparagraph.h> +#include <vcpkg/vcpkgpaths.h> + +namespace vcpkg::PortFileProvider +{ + struct PortFileProvider + { + virtual Optional<const SourceControlFileLocation&> get_control_file(const std::string& src_name) const = 0; + virtual std::vector<const SourceControlFileLocation*> load_all_control_files() const = 0; + }; + + struct MapPortFileProvider : Util::ResourceBase, PortFileProvider + { + explicit MapPortFileProvider(const std::unordered_map<std::string, SourceControlFileLocation>& map); + Optional<const SourceControlFileLocation&> get_control_file(const std::string& src_name) const override; + std::vector<const SourceControlFileLocation*> load_all_control_files() const override; + + private: + const std::unordered_map<std::string, SourceControlFileLocation>& ports; + }; + + struct PathsPortFileProvider : Util::ResourceBase, PortFileProvider + { + explicit PathsPortFileProvider(const vcpkg::VcpkgPaths& paths, + const std::vector<std::string>* ports_dirs_paths); + Optional<const SourceControlFileLocation&> get_control_file(const std::string& src_name) const override; + std::vector<const SourceControlFileLocation*> load_all_control_files() const override; + + private: + Files::Filesystem& filesystem; + std::vector<fs::path> ports_dirs; + mutable std::unordered_map<std::string, SourceControlFileLocation> cache; + }; +} diff --git a/toolsrc/include/vcpkg/sourceparagraph.h b/toolsrc/include/vcpkg/sourceparagraph.h index 95347770a..0574afe74 100644 --- a/toolsrc/include/vcpkg/sourceparagraph.h +++ b/toolsrc/include/vcpkg/sourceparagraph.h @@ -7,6 +7,8 @@ #include <vcpkg/base/span.h> #include <vcpkg/base/system.h> +#include <vcpkg/base/system.print.h> + #include <string> #include <vector> @@ -21,15 +23,28 @@ namespace vcpkg static Dependency parse_dependency(std::string name, std::string qualifier); }; - std::vector<std::string> filter_dependencies(const std::vector<Dependency>& deps, const Triplet& t); - std::vector<FeatureSpec> filter_dependencies_to_specs(const std::vector<Dependency>& deps, const Triplet& t); - std::vector<Features> filter_dependencies_to_features(const std::vector<vcpkg::Dependency>& deps, const Triplet& t); + std::vector<FullPackageSpec> filter_dependencies(const std::vector<Dependency>& deps, + const Triplet& t, + const std::unordered_map<std::string, std::string>& cmake_vars); // zlib[uwp] becomes Dependency{"zlib", "uwp"} std::vector<Dependency> expand_qualified_dependencies(const std::vector<std::string>& depends); std::string to_string(const Dependency& dep); + struct Type + { + enum + { + UNKNOWN, + PORT, + ALIAS, + } type; + + static std::string to_string(const Type&); + static Type from_string(const std::string&); + }; + /// <summary> /// Port metadata of additional feature in a package (part of CONTROL file) /// </summary> @@ -50,9 +65,10 @@ namespace vcpkg std::string description; std::string maintainer; std::string homepage; - std::vector<std::string> supports; std::vector<Dependency> depends; std::vector<std::string> default_features; + Type type; + std::string supports_expression; }; /// <summary> @@ -60,21 +76,48 @@ namespace vcpkg /// </summary> struct SourceControlFile { + SourceControlFile() = default; + SourceControlFile(const SourceControlFile& scf) + : core_paragraph(std::make_unique<SourceParagraph>(*scf.core_paragraph)) + { + for (const auto& feat_ptr : scf.feature_paragraphs) + { + feature_paragraphs.emplace_back(std::make_unique<FeatureParagraph>(*feat_ptr)); + } + } + static Parse::ParseExpected<SourceControlFile> parse_control_file( - std::vector<Parse::RawParagraph>&& control_paragraphs); + const fs::path& path_to_control, std::vector<Parse::RawParagraph>&& control_paragraphs); std::unique_ptr<SourceParagraph> core_paragraph; std::vector<std::unique_ptr<FeatureParagraph>> feature_paragraphs; Optional<const FeatureParagraph&> find_feature(const std::string& featurename) const; + Optional<const std::vector<Dependency>&> find_dependencies_for_feature(const std::string& featurename) const; }; /// <summary> - /// Full metadata of a package: core and other features. As well as the location the SourceControlFile was loaded - /// from. + /// Full metadata of a package: core and other features. As well as the location the SourceControlFile was + /// loaded from. /// </summary> struct SourceControlFileLocation { + SourceControlFileLocation(const SourceControlFileLocation& scfl) + : source_control_file(std::make_unique<SourceControlFile>(*scfl.source_control_file)) + , source_location(scfl.source_location) + { + } + + SourceControlFileLocation(std::unique_ptr<SourceControlFile>&& scf, fs::path&& source) + : source_control_file(std::move(scf)), source_location(std::move(source)) + { + } + + SourceControlFileLocation(std::unique_ptr<SourceControlFile>&& scf, const fs::path& source) + : source_control_file(std::move(scf)), source_location(source) + { + } + std::unique_ptr<SourceControlFile> source_control_file; fs::path source_location; }; @@ -84,35 +127,4 @@ namespace vcpkg { return print_error_message({&error_info_list, 1}); } - - struct Supports - { - static ExpectedT<Supports, std::vector<std::string>> parse(const std::vector<std::string>& strs); - - using Architecture = System::CPUArchitecture; - - enum class Platform - { - WINDOWS, - UWP, - }; - enum class Linkage - { - DYNAMIC, - STATIC, - }; - enum class ToolsetVersion - { - V140, - V141, - }; - - bool is_supported(Architecture arch, Platform plat, Linkage crt, ToolsetVersion tools); - - private: - std::vector<Architecture> architectures; - std::vector<Platform> platforms; - std::vector<Linkage> crt_linkages; - std::vector<ToolsetVersion> toolsets; - }; } diff --git a/toolsrc/include/vcpkg/statusparagraph.h b/toolsrc/include/vcpkg/statusparagraph.h index 6e832fe2f..ec850607d 100644 --- a/toolsrc/include/vcpkg/statusparagraph.h +++ b/toolsrc/include/vcpkg/statusparagraph.h @@ -56,6 +56,7 @@ namespace vcpkg const PackageSpec& spec() const { return core->package.spec; } std::vector<PackageSpec> dependencies() const; + std::unordered_map<std::string, std::vector<FeatureSpec>> feature_dependencies() const; const StatusParagraph* core; std::vector<const StatusParagraph*> features; diff --git a/toolsrc/include/vcpkg/update.h b/toolsrc/include/vcpkg/update.h index b85f7b2b3..6091da778 100644 --- a/toolsrc/include/vcpkg/update.h +++ b/toolsrc/include/vcpkg/update.h @@ -17,7 +17,7 @@ namespace vcpkg::Update VersionDiff version_diff; }; - std::vector<OutdatedPackage> find_outdated_packages(const Dependencies::PortFileProvider& provider, + std::vector<OutdatedPackage> find_outdated_packages(const PortFileProvider::PortFileProvider& provider, const StatusParagraphs& status_db); void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths); |
