diff options
| author | Robert Schumacher <roschuma@microsoft.com> | 2018-02-28 11:54:40 -0800 |
|---|---|---|
| committer | Robert Schumacher <roschuma@microsoft.com> | 2018-02-28 11:55:29 -0800 |
| commit | ef4febc7ef08d1aaa3fb97efadf09e2ad2b9464d (patch) | |
| tree | 340bcffeddea595be39d218244b1a577ae81a479 /toolsrc/src | |
| parent | a7c93cd73eb734699101976c3017a3d33e33ce2c (diff) | |
| download | vcpkg-ef4febc7ef08d1aaa3fb97efadf09e2ad2b9464d.tar.gz vcpkg-ef4febc7ef08d1aaa3fb97efadf09e2ad2b9464d.zip | |
[vcpkg] Fix exporting packages with features-depending-on-features
Diffstat (limited to 'toolsrc/src')
| -rw-r--r-- | toolsrc/src/vcpkg/packagespec.cpp | 21 | ||||
| -rw-r--r-- | toolsrc/src/vcpkg/statusparagraph.cpp | 31 |
2 files changed, 30 insertions, 22 deletions
diff --git a/toolsrc/src/vcpkg/packagespec.cpp b/toolsrc/src/vcpkg/packagespec.cpp index a9e072094..789aaca80 100644 --- a/toolsrc/src/vcpkg/packagespec.cpp +++ b/toolsrc/src/vcpkg/packagespec.cpp @@ -112,27 +112,6 @@ namespace vcpkg }); } - std::vector<PackageSpec> PackageSpec::from_dependencies_of_port(const std::string& port, - const std::vector<std::string>& dependencies, - const Triplet& triplet) - { - return Util::fmap(dependencies, [&](const std::string& spec_as_string) -> PackageSpec { - auto maybe_spec = PackageSpec::from_name_and_triplet(spec_as_string, triplet); - if (auto spec = maybe_spec.get()) - { - return std::move(*spec); - } - - const PackageSpecParseResult error_type = maybe_spec.error(); - Checks::exit_with_message(VCPKG_LINE_INFO, - "Invalid dependency [%s] in package [%s]\n" - "%s", - spec_as_string, - port, - vcpkg::to_string(error_type)); - }); - } - const std::string& PackageSpec::name() const { return this->m_name; } const Triplet& PackageSpec::triplet() const { return this->m_triplet; } diff --git a/toolsrc/src/vcpkg/statusparagraph.cpp b/toolsrc/src/vcpkg/statusparagraph.cpp index 05238ba8b..62d1d4b42 100644 --- a/toolsrc/src/vcpkg/statusparagraph.cpp +++ b/toolsrc/src/vcpkg/statusparagraph.cpp @@ -86,13 +86,42 @@ namespace vcpkg } std::vector<PackageSpec> InstalledPackageView::dependencies() const { + // accumulate all features in installed dependencies + // Todo: make this unneeded by collapsing all package dependencies into the core package auto deps = Util::fmap_flatten(features, [](const StatusParagraph* pgh) -> std::vector<std::string> const& { return pgh->package.depends; }); + // Add the core paragraph dependencies to the list deps.insert(deps.end(), core->package.depends.begin(), core->package.depends.end()); auto&& spec = core->package.spec; - return PackageSpec::from_dependencies_of_port(spec.name(), deps, spec.triplet()); + + // <hack> + // This is a hack to work around existing installations that put featurespecs into binary packages + // (example: curl[core]) + for (auto&& dep : deps) + { + dep.erase(std::find(dep.begin(), dep.end(), '['), dep.end()); + } + Util::unstable_keep_if(deps, [&](auto&& e) { return e != spec.name(); }); + // </hack> + Util::sort_unique_erase(deps); + + return Util::fmap(deps, [&](const std::string& dep) -> PackageSpec { + auto maybe_dependency_spec = PackageSpec::from_name_and_triplet(dep, spec.triplet()); + if (auto dependency_spec = maybe_dependency_spec.get()) + { + return std::move(*dependency_spec); + } + + const PackageSpecParseResult error_type = maybe_dependency_spec.error(); + Checks::exit_with_message(VCPKG_LINE_INFO, + "Invalid dependency [%s] in package [%s]\n" + "%s", + dep, + spec.name(), + vcpkg::to_string(error_type)); + }); } } |
