@@ -84,14 +84,27 @@ namespace
8484 }
8585
8686 bool cascade_for_triplet (const std::vector<InstallPlanAction>& install_actions,
87- const SortedVector<std::string>* triplet_exclusions)
87+ const Triplet& target_triplet,
88+ const SortedVector<std::string>* target_triplet_exclusions,
89+ const Triplet& host_triplet,
90+ const SortedVector<std::string>* host_triplet_exclusions)
8891 {
89- if (!triplet_exclusions) return false ;
92+ return std::any_of (install_actions.begin (), install_actions.end (), [&](const InstallPlanAction& action) {
93+ if (target_triplet_exclusions && action.spec .triplet () == target_triplet)
94+ return target_triplet_exclusions->contains (action.spec .name ());
95+ if (host_triplet_exclusions && action.spec .triplet () == host_triplet)
96+ return host_triplet_exclusions->contains (action.spec .name ());
97+ return false ;
98+ });
99+ }
90100
91- return std::any_of (
92- install_actions.begin (), install_actions.end (), [triplet_exclusions](const InstallPlanAction& action) {
93- return triplet_exclusions->contains (action.spec .name ());
94- });
101+ const SortedVector<std::string>* find_triplet_exclusions (const ExclusionsMap& exclusions_map,
102+ const Triplet& triplet)
103+ {
104+ auto it = Util::find_if (exclusions_map.triplets , [&triplet](const TripletExclusions& exclusions) {
105+ return exclusions.triplet == triplet;
106+ });
107+ return it == exclusions_map.triplets .end () ? nullptr : &it->exclusions ;
95108 }
96109
97110 ActionPlan compute_full_plan (const VcpkgPaths& paths,
@@ -310,6 +323,7 @@ namespace
310323
311324 CiSpecsResult calculate_ci_specs (const ExclusionsMap& exclusions_map,
312325 const Triplet& target_triplet,
326+ const Triplet& host_triplet,
313327 PortFileProvider& provider,
314328 const CMakeVars::CMakeVarProvider& var_provider,
315329 const CreateInstallPlanOptions& serialize_options)
@@ -319,11 +333,10 @@ namespace
319333 // it is too late as we have already calculated an action plan with feature dependencies from
320334 // the skipped ports.
321335 CiSpecsResult result;
322- auto it = Util::find_if (exclusions_map.triplets , [&](const TripletExclusions& exclusions) {
323- return exclusions.triplet == target_triplet;
324- });
325336 const SortedVector<std::string>* const target_triplet_exclusions =
326- it == exclusions_map.triplets .end () ? nullptr : &it->exclusions ;
337+ find_triplet_exclusions (exclusions_map, target_triplet);
338+ const SortedVector<std::string>* const host_triplet_exclusions =
339+ (host_triplet == target_triplet) ? nullptr : find_triplet_exclusions (exclusions_map, host_triplet);
327340 auto all_control_files = provider.load_all_control_files ();
328341
329342 // populate `var_provider` to evaluate supports expressions for all ports:
@@ -355,7 +368,11 @@ namespace
355368 continue ;
356369 }
357370
358- if (cascade_for_triplet (action_plan.install_actions , target_triplet_exclusions))
371+ if (cascade_for_triplet (action_plan.install_actions ,
372+ target_triplet,
373+ target_triplet_exclusions,
374+ host_triplet,
375+ host_triplet_exclusions))
359376 {
360377 result.excluded .insert_or_assign (std::move (full_package_spec.package_spec ), ExcludeReason::Cascade);
361378 continue ;
@@ -504,8 +521,8 @@ namespace vcpkg
504521 }
505522 CreateInstallPlanOptions create_install_plan_options (
506523 randomizer.get (), host_triplet, UnsupportedPortAction::Warn, UseHeadVersion::No, Editable::No);
507- auto ci_specs =
508- calculate_ci_specs ( exclusions_map, target_triplet, provider, var_provider, create_install_plan_options);
524+ auto ci_specs = calculate_ci_specs (
525+ exclusions_map, target_triplet, host_triplet , provider, var_provider, create_install_plan_options);
509526
510527 PackagesDirAssigner packages_dir_assigner{paths.packages ()};
511528 auto action_plan = compute_full_plan (
0 commit comments