aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2018-02-28 11:54:40 -0800
committerRobert Schumacher <roschuma@microsoft.com>2018-02-28 11:55:29 -0800
commitef4febc7ef08d1aaa3fb97efadf09e2ad2b9464d (patch)
tree340bcffeddea595be39d218244b1a577ae81a479
parenta7c93cd73eb734699101976c3017a3d33e33ce2c (diff)
downloadvcpkg-ef4febc7ef08d1aaa3fb97efadf09e2ad2b9464d.tar.gz
vcpkg-ef4febc7ef08d1aaa3fb97efadf09e2ad2b9464d.zip
[vcpkg] Fix exporting packages with features-depending-on-features
-rw-r--r--toolsrc/include/vcpkg/packagespec.h4
-rw-r--r--toolsrc/src/vcpkg/packagespec.cpp21
-rw-r--r--toolsrc/src/vcpkg/statusparagraph.cpp31
3 files changed, 30 insertions, 26 deletions
diff --git a/toolsrc/include/vcpkg/packagespec.h b/toolsrc/include/vcpkg/packagespec.h
index 0a4347639..299a9c401 100644
--- a/toolsrc/include/vcpkg/packagespec.h
+++ b/toolsrc/include/vcpkg/packagespec.h
@@ -28,10 +28,6 @@ namespace vcpkg
static std::vector<PackageSpec> to_package_specs(const std::vector<std::string>& ports, const Triplet& triplet);
- static std::vector<PackageSpec> from_dependencies_of_port(const std::string& port,
- const std::vector<std::string>& dependencies,
- const Triplet& triplet);
-
const std::string& name() const;
const Triplet& triplet() const;
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));
+ });
}
}