diff --git a/src/vcpkg/dependencies.cpp b/src/vcpkg/dependencies.cpp index 4e5e7b8c5c..2bfc2cfed8 100644 --- a/src/vcpkg/dependencies.cpp +++ b/src/vcpkg/dependencies.cpp @@ -1465,7 +1465,7 @@ namespace vcpkg void require_port_defaults(PackageNode& ref, const std::string& origin); void resolve_stack(const ConstraintFrame& frame); - const CMakeVars::CMakeVars& batch_load_vars(const PackageSpec& spec); + const CMakeVars::CMakeVars& batch_load_vars(const ConstraintFrame& frame); Optional find_package(const PackageSpec& spec) const; @@ -1485,13 +1485,15 @@ namespace vcpkg std::vector m_errors; }; - const CMakeVars::CMakeVars& VersionedPackageGraph::batch_load_vars(const PackageSpec& spec) + const CMakeVars::CMakeVars& VersionedPackageGraph::batch_load_vars(const ConstraintFrame& frame) { - auto vars = m_var_provider.get_dep_info_vars(spec); + auto vars = m_var_provider.get_dep_info_vars(frame.spec); if (!vars) { - // We want to batch as many dep_infos as possible, so look ahead in the stack - std::unordered_set spec_set = {spec}; + // We want to batch as many dep_infos as possible, so look ahead in the frame and stack + std::unordered_set spec_set = {frame.spec}; + for (auto&& d : frame.deps) + spec_set.emplace(d.name, d.host ? m_host_triplet : frame.spec.triplet()); for (auto&& s : m_resolve_stack) { spec_set.insert(s.spec); @@ -1500,7 +1502,7 @@ namespace vcpkg } std::vector spec_vec(spec_set.begin(), spec_set.end()); m_var_provider.load_dep_info_vars(spec_vec, m_host_triplet); - return m_var_provider.get_dep_info_vars(spec).value_or_exit(VCPKG_LINE_INFO); + return m_var_provider.get_dep_info_vars(frame.spec).value_or_exit(VCPKG_LINE_INFO); } return *vars.get(); } @@ -1509,7 +1511,7 @@ namespace vcpkg { for (auto&& dep : frame.deps) { - if (!dep.platform.is_empty() && !dep.platform.evaluate(batch_load_vars(frame.spec))) continue; + if (!dep.platform.is_empty() && !dep.platform.evaluate(batch_load_vars(frame))) continue; PackageSpec dep_spec(dep.name, dep.host ? m_host_triplet : frame.spec.triplet()); auto maybe_node = require_package(dep_spec, frame.spec.name()); @@ -1665,42 +1667,38 @@ namespace vcpkg it->second.overlay_or_override = true; it->second.scfl = p_overlay; } + else if (const auto over_it = m_overrides.find(spec.name()); over_it != m_overrides.end()) + { + auto maybe_scfl = m_ver_provider.get_control_file({spec.name(), over_it->second}); + if (auto p_scfl = maybe_scfl.get()) + { + it = m_graph.emplace(spec, PackageNodeData{}).first; + it->second.overlay_or_override = true; + it->second.scfl = p_scfl; + } + else + { + m_errors.push_back(std::move(maybe_scfl).error()); + m_failed_nodes.insert(spec.name()); + return nullopt; + } + } else { - Version ver; - if (const auto over_it = m_overrides.find(spec.name()); over_it != m_overrides.end()) + auto maybe_scfl = m_base_provider.get_baseline_version(spec.name()).then([&](const Version& ver) { + return m_ver_provider.get_control_file({spec.name(), ver}); + }); + if (auto p_scfl = maybe_scfl.get()) { - auto maybe_scfl = m_ver_provider.get_control_file({spec.name(), over_it->second}); - if (auto p_scfl = maybe_scfl.get()) - { - it = m_graph.emplace(spec, PackageNodeData{}).first; - it->second.overlay_or_override = true; - it->second.scfl = p_scfl; - } - else - { - m_errors.push_back(std::move(maybe_scfl).error()); - m_failed_nodes.insert(spec.name()); - return nullopt; - } + it = m_graph.emplace(spec, PackageNodeData{}).first; + it->second.baseline = p_scfl->schemed_version(); + it->second.scfl = p_scfl; } else { - auto maybe_scfl = m_base_provider.get_baseline_version(spec.name()).then([&](const Version& ver) { - return m_ver_provider.get_control_file({spec.name(), ver}); - }); - if (auto p_scfl = maybe_scfl.get()) - { - it = m_graph.emplace(spec, PackageNodeData{}).first; - it->second.baseline = p_scfl->schemed_version(); - it->second.scfl = p_scfl; - } - else - { - m_errors.push_back(std::move(maybe_scfl).error()); - m_failed_nodes.insert(spec.name()); - return nullopt; - } + m_errors.push_back(std::move(maybe_scfl).error()); + m_failed_nodes.insert(spec.name()); + return nullopt; } } @@ -1725,22 +1723,14 @@ namespace vcpkg void VersionedPackageGraph::solve_with_roots(View deps) { - auto dep_to_spec = [this](const Dependency& d) { - return PackageSpec{d.name, d.host ? m_host_triplet : m_toplevel.triplet()}; - }; - auto specs = Util::fmap(deps, dep_to_spec); - - specs.push_back(m_toplevel); - Util::sort_unique_erase(specs); for (auto&& dep : deps) { - if (!dep.platform.is_empty() && - !dep.platform.evaluate(m_var_provider.get_or_load_dep_info_vars(m_toplevel, m_host_triplet))) + if (!dep.platform.is_empty() && !evaluate(m_toplevel, dep.platform)) { continue; } - auto spec = dep_to_spec(dep); + auto spec = PackageSpec{dep.name, dep.host ? m_host_triplet : m_toplevel.triplet()}; m_user_requested.insert(spec); m_roots.push_back(DepSpec{std::move(spec), dep.constraint, dep.features}); } @@ -1824,9 +1814,7 @@ namespace vcpkg // Ignore intra-package dependencies if (fspec == node.first) continue; - if (!fdep.platform.is_empty() && - !fdep.platform.evaluate( - m_var_provider.get_or_load_dep_info_vars(node.first, m_host_triplet))) + if (!fdep.platform.is_empty() && !evaluate(node.first, fdep.platform)) { continue; }