Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Unified Diff: tools/gn/args.cc

Issue 984353002: Makes declared_arguments per toolchain (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: feedback Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/args.h ('k') | tools/gn/args_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/args.cc
diff --git a/tools/gn/args.cc b/tools/gn/args.cc
index 2a1509a4cbe11ff60e51a3e4dc95ce1a4a7032f3..60ee7b2ce33d385f58957c9f01858536a3c4d147 100644
--- a/tools/gn/args.cc
+++ b/tools/gn/args.cc
@@ -66,13 +66,30 @@ const char kBuildArgs_Help[] =
" to specify build args in an \"import\"-ed file if you want such\n"
" arguments to apply to multiple buildfiles.\n";
+namespace {
+
+// Removes all entries in |overrides| that are in |declared_overrides|.
+void RemoveDeclaredOverrides(const Scope::KeyValueMap& declared_arguments,
+ Scope::KeyValueMap* overrides) {
+ for (Scope::KeyValueMap::iterator override = overrides->begin();
+ override != overrides->end();) {
+ if (declared_arguments.find(override->first) == declared_arguments.end())
+ ++override;
+ else
+ overrides->erase(override++);
+ }
+}
+
+} // namespace
+
Args::Args() {
}
Args::Args(const Args& other)
: overrides_(other.overrides_),
all_overrides_(other.all_overrides_),
- declared_arguments_(other.declared_arguments_) {
+ declared_arguments_per_toolchain_(
+ other.declared_arguments_per_toolchain_) {
}
Args::~Args() {
@@ -124,6 +141,8 @@ bool Args::DeclareArgs(const Scope::KeyValueMap& args,
Err* err) const {
base::AutoLock lock(lock_);
+ Scope::KeyValueMap& declared_arguments(
+ DeclaredArgumentsForToolchainLocked(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.
@@ -132,8 +151,8 @@ bool Args::DeclareArgs(const Scope::KeyValueMap& args,
// when used from different toolchains, so we can't just check that we've
// seen it before. Instead, we check that the location matches.
Scope::KeyValueMap::iterator previously_declared =
- declared_arguments_.find(arg.first);
- if (previously_declared != declared_arguments_.end()) {
+ declared_arguments.find(arg.first);
+ if (previously_declared != declared_arguments.end()) {
if (previously_declared->second.origin() != arg.second.origin()) {
// Declaration location mismatch.
*err = Err(arg.second.origin(),
@@ -151,7 +170,7 @@ bool Args::DeclareArgs(const Scope::KeyValueMap& args,
return false;
}
} else {
- declared_arguments_.insert(arg);
+ declared_arguments.insert(arg);
}
// Only set on the current scope to the new value if it hasn't been already
@@ -168,43 +187,41 @@ bool Args::DeclareArgs(const Scope::KeyValueMap& args,
bool Args::VerifyAllOverridesUsed(Err* err) const {
base::AutoLock lock(lock_);
- return VerifyAllOverridesUsed(all_overrides_, declared_arguments_, err);
-}
-
-bool Args::VerifyAllOverridesUsed(
- const Scope::KeyValueMap& overrides,
- const Scope::KeyValueMap& declared_arguments,
- Err* err) {
- for (const auto& override : overrides) {
- if (declared_arguments.find(override.first) == declared_arguments.end()) {
- // Get a list of all possible overrides for help with error finding.
- //
- // It might be nice to do edit distance checks to see if we can find one
- // close to what you typed.
- std::string all_declared_str;
- for (Scope::KeyValueMap::const_iterator cur_str =
- declared_arguments.begin();
- cur_str != declared_arguments.end(); ++cur_str) {
- if (cur_str != declared_arguments.begin())
- all_declared_str += ", ";
- all_declared_str += cur_str->first.as_string();
- }
-
- *err = Err(override.second.origin(), "Build argument has no effect.",
- "The variable \"" + override.first.as_string() +
- "\" was set as a build "
- "argument\nbut never appeared in a declare_args() block in any "
- "buildfile.\n\nPossible arguments: " + all_declared_str);
- return false;
+ Scope::KeyValueMap all_overrides(all_overrides_);
+ for (const auto& map_pair : declared_arguments_per_toolchain_)
+ RemoveDeclaredOverrides(map_pair.second, &all_overrides);
+
+ if (all_overrides.empty())
+ return true;
+
+ // Get a list of all possible overrides for help with error finding.
+ //
+ // It might be nice to do edit distance checks to see if we can find one close
+ // to what you typed.
+ std::string all_declared_str;
+ for (const auto& map_pair : declared_arguments_per_toolchain_) {
+ for (const auto& cur_str : map_pair.second) {
+ if (!all_declared_str.empty())
+ all_declared_str += ", ";
+ all_declared_str += cur_str.first.as_string();
}
}
- return true;
+
+ *err = Err(
+ all_overrides.begin()->second.origin(), "Build argument has no effect.",
+ "The variable \"" + all_overrides.begin()->first.as_string() +
+ "\" was set as a build argument\nbut never appeared in a " +
sky 2015/03/16 16:20:45 git cl format did this. No idea why it indented he
+ "declare_args() block in any buildfile.\n\nPossible arguments: " +
+ all_declared_str);
+ return false;
}
void Args::MergeDeclaredArguments(Scope::KeyValueMap* dest) const {
base::AutoLock lock(lock_);
- for (const auto& arg : declared_arguments_)
- (*dest)[arg.first] = arg.second;
+ for (const auto& map_pair : declared_arguments_per_toolchain_) {
+ for (const auto& arg : map_pair.second)
+ (*dest)[arg.first] = arg.second;
+ }
}
void Args::SetSystemVarsLocked(Scope* dest) const {
@@ -257,12 +274,14 @@ void Args::SetSystemVarsLocked(Scope* dest) const {
dest->SetValue(variables::kTargetCpu, empty_string, nullptr);
dest->SetValue(variables::kCurrentCpu, empty_string, nullptr);
- declared_arguments_[variables::kHostOs] = os_val;
- declared_arguments_[variables::kCurrentOs] = empty_string;
- declared_arguments_[variables::kTargetOs] = empty_string;
- declared_arguments_[variables::kHostCpu] = arch_val;
- declared_arguments_[variables::kCurrentCpu] = empty_string;
- declared_arguments_[variables::kTargetCpu] = empty_string;
+ Scope::KeyValueMap& declared_arguments(
+ DeclaredArgumentsForToolchainLocked(dest));
+ declared_arguments[variables::kHostOs] = os_val;
+ declared_arguments[variables::kCurrentOs] = empty_string;
+ declared_arguments[variables::kTargetOs] = empty_string;
+ declared_arguments[variables::kHostCpu] = arch_val;
+ declared_arguments[variables::kCurrentCpu] = empty_string;
+ declared_arguments[variables::kTargetCpu] = empty_string;
// Mark these variables used so the build config file can override them
// without geting a warning about overwriting an unused variable.
@@ -286,3 +305,9 @@ void Args::SaveOverrideRecordLocked(const Scope::KeyValueMap& values) const {
for (const auto& val : values)
all_overrides_[val.first] = val.second;
}
+
+Scope::KeyValueMap& Args::DeclaredArgumentsForToolchainLocked(
+ Scope* scope) const {
+ lock_.AssertAcquired();
+ return declared_arguments_per_toolchain_[scope->settings()];
+}
« no previous file with comments | « tools/gn/args.h ('k') | tools/gn/args_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698