Index: tools/gn/args.cc |
diff --git a/tools/gn/args.cc b/tools/gn/args.cc |
index d83c6789793a541b46386d07e3eeeec941c6102f..accdf7ecb2dcbd3756e81a636747b62ecfbb5d68 100644 |
--- a/tools/gn/args.cc |
+++ b/tools/gn/args.cc |
@@ -89,7 +89,8 @@ Args::Args(const Args& other) |
: overrides_(other.overrides_), |
all_overrides_(other.all_overrides_), |
declared_arguments_per_toolchain_( |
- other.declared_arguments_per_toolchain_) { |
+ other.declared_arguments_per_toolchain_), |
+ toolchain_overrides_(other.toolchain_overrides_) { |
} |
Args::~Args() { |
@@ -131,8 +132,14 @@ void Args::SetupRootScope(Scope* dest, |
base::AutoLock lock(lock_); |
SetSystemVarsLocked(dest); |
+ |
+ // Apply overrides for already declared args. |
+ // (i.e. the system vars we set above) |
ApplyOverridesLocked(overrides_, dest); |
ApplyOverridesLocked(toolchain_overrides, dest); |
+ |
+ OverridesForToolchainLocked(dest) = toolchain_overrides; |
+ |
SaveOverrideRecordLocked(toolchain_overrides); |
} |
@@ -143,6 +150,10 @@ bool Args::DeclareArgs(const Scope::KeyValueMap& args, |
Scope::KeyValueMap& declared_arguments( |
DeclaredArgumentsForToolchainLocked(scope_to_set)); |
+ |
+ const Scope::KeyValueMap& toolchain_overrides( |
+ OverridesForToolchainLocked(scope_to_set)); |
+ |
for (const auto& arg : args) { |
// Verify that the value hasn't already been declared. We want each value |
// to be declared only once. |
@@ -173,13 +184,30 @@ bool Args::DeclareArgs(const Scope::KeyValueMap& args, |
declared_arguments.insert(arg); |
} |
- // Only set on the current scope to the new value if it hasn't been already |
- // set. Mark the variable used so the build script can override it in |
- // certain cases without getting unused value errors. |
- if (!scope_to_set->GetValue(arg.first)) { |
- scope_to_set->SetValue(arg.first, arg.second, arg.second.origin()); |
- scope_to_set->MarkUsed(arg.first); |
+ // Check whether this argument has been overridden on the toolchain level |
+ // and use the override instead. |
+ Scope::KeyValueMap::const_iterator toolchain_override = |
+ toolchain_overrides.find(arg.first); |
+ if (toolchain_override != toolchain_overrides.end()) { |
+ scope_to_set->SetValue(toolchain_override->first, |
+ toolchain_override->second, |
+ toolchain_override->second.origin()); |
+ continue; |
+ } |
+ |
+ // Check whether this argument has been overridden and use the override |
+ // instead. |
+ Scope::KeyValueMap::const_iterator override = overrides_.find(arg.first); |
+ if (override != overrides_.end()) { |
+ scope_to_set->SetValue(override->first, override->second, |
+ override->second.origin()); |
+ continue; |
} |
+ |
+ // Mark the variable used so the build script can override it in |
+ // certain cases without getting unused value errors. |
+ scope_to_set->SetValue(arg.first, arg.second, arg.second.origin()); |
+ scope_to_set->MarkUsed(arg.first); |
} |
return true; |
@@ -286,8 +314,20 @@ void Args::SetSystemVarsLocked(Scope* dest) const { |
void Args::ApplyOverridesLocked(const Scope::KeyValueMap& values, |
Scope* scope) const { |
lock_.AssertAcquired(); |
- for (const auto& val : values) |
+ |
+ const Scope::KeyValueMap& declared_arguments( |
+ DeclaredArgumentsForToolchainLocked(scope)); |
+ |
+ // Only set a value if it has been declared. |
+ for (const auto& val : values) { |
+ Scope::KeyValueMap::const_iterator declared = |
+ declared_arguments.find(val.first); |
+ |
+ if (declared == declared_arguments.end()) |
+ continue; |
+ |
scope->SetValue(val.first, val.second, val.second.origin()); |
+ } |
} |
void Args::SaveOverrideRecordLocked(const Scope::KeyValueMap& values) const { |
@@ -301,3 +341,9 @@ Scope::KeyValueMap& Args::DeclaredArgumentsForToolchainLocked( |
lock_.AssertAcquired(); |
return declared_arguments_per_toolchain_[scope->settings()]; |
} |
+ |
+Scope::KeyValueMap& Args::OverridesForToolchainLocked( |
+ Scope* scope) const { |
+ lock_.AssertAcquired(); |
+ return toolchain_overrides_[scope->settings()]; |
+} |