diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/target_map/built_in_rules.cpp | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/src/buildtool/build_engine/target_map/built_in_rules.cpp b/src/buildtool/build_engine/target_map/built_in_rules.cpp index f71cd0e8..178000d2 100644 --- a/src/buildtool/build_engine/target_map/built_in_rules.cpp +++ b/src/buildtool/build_engine/target_map/built_in_rules.cpp @@ -70,7 +70,7 @@ auto const kConfigureRuleFields = "type"}; void FileGenRuleWithDeps( - const std::vector<BuildMaps::Target::ConfiguredTarget>& dependency_keys, + const std::vector<BuildMaps::Target::ConfiguredTarget>& transition_keys, const std::vector<AnalysedTargetPtr const*>& dependency_values, const BuildMaps::Base::FieldReader::Ptr& desc, const BuildMaps::Target::ConfiguredTarget& key, @@ -80,9 +80,9 @@ void FileGenRuleWithDeps( // Associate keys and values std::unordered_map<BuildMaps::Target::ConfiguredTarget, AnalysedTargetPtr> deps_by_transition; - deps_by_transition.reserve(dependency_keys.size()); - for (size_t i = 0; i < dependency_keys.size(); ++i) { - deps_by_transition.emplace(dependency_keys[i], *dependency_values[i]); + deps_by_transition.reserve(transition_keys.size()); + for (size_t i = 0; i < transition_keys.size(); ++i) { + deps_by_transition.emplace(transition_keys[i], *dependency_values[i]); } auto param_vars = desc->ReadStringList("arguments_config"); @@ -90,15 +90,21 @@ void FileGenRuleWithDeps( return; } auto param_config = key.config.Prune(*param_vars); + auto vars_set = std::unordered_set<std::string>{}; + vars_set.insert(param_vars->begin(), param_vars->end()); + for (auto const& dep : dependency_values) { + vars_set.insert((*dep)->Vars().begin(), (*dep)->Vars().end()); + } + auto effective_conf = key.config.Prune(vars_set); + std::vector<BuildMaps::Target::ConfiguredTargetPtr> all_deps{}; all_deps.reserve(dependency_values.size()); for (auto const& dep : dependency_values) { all_deps.emplace_back((*dep)->GraphInformation().Node()); } - auto deps_info = TargetGraphInformation{ std::make_shared<BuildMaps::Target::ConfiguredTarget>( - BuildMaps::Target::ConfiguredTarget{key.target, param_config}), + BuildMaps::Target::ConfiguredTarget{key.target, effective_conf}), all_deps, {}, {}}; @@ -186,8 +192,6 @@ void FileGenRuleWithDeps( ArtifactDigest::Create<ObjectType::File>(data_val->String()), ObjectType::File}}}}; - auto vars_set = std::unordered_set<std::string>{}; - vars_set.insert(param_vars->begin(), param_vars->end()); auto analysis_result = std::make_shared<AnalysedTarget const>( TargetResult{stage, ExpressionPtr{Expression::map_t{}}, stage}, std::vector<ActionDescription::Ptr>{}, @@ -197,7 +201,7 @@ void FileGenRuleWithDeps( std::move(tainted), std::move(deps_info)); analysis_result = - result_map->Add(key.target, param_config, std::move(analysis_result)); + result_map->Add(key.target, effective_conf, std::move(analysis_result)); (*setter)(std::move(analysis_result)); } @@ -238,6 +242,10 @@ void FileGenRule( return; } std::vector<BuildMaps::Target::ConfiguredTarget> dependency_keys; + std::vector<BuildMaps::Target::ConfiguredTarget> transition_keys; + dependency_keys.reserve(deps_value->List().size()); + transition_keys.reserve(deps_value->List().size()); + auto empty_transition = Configuration{Expression::kEmptyMap}; for (auto const& dep_name : deps_value->List()) { auto dep_target = BuildMaps::Base::ParseEntityNameFromExpression( dep_name, @@ -253,13 +261,19 @@ void FileGenRule( } dependency_keys.emplace_back( BuildMaps::Target::ConfiguredTarget{*dep_target, key.config}); + transition_keys.emplace_back( + BuildMaps::Target::ConfiguredTarget{*dep_target, empty_transition}); } (*subcaller)( dependency_keys, - [dependency_keys, desc, setter, logger, key, result_map]( - auto const& values) { + [transition_keys = std::move(transition_keys), + desc, + setter, + logger, + key, + result_map](auto const& values) { FileGenRuleWithDeps( - dependency_keys, values, desc, key, setter, logger, result_map); + transition_keys, values, desc, key, setter, logger, result_map); }, logger); } |