| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "tools/gn/args.h" | 5 #include "tools/gn/args.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 #include "tools/gn/variables.h" | 8 #include "tools/gn/variables.h" |
| 9 | 9 |
| 10 #if defined(OS_WIN) | 10 #if defined(OS_WIN) |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 void Args::AddArgOverride(const char* name, const Value& value) { | 82 void Args::AddArgOverride(const char* name, const Value& value) { |
| 83 base::AutoLock lock(lock_); | 83 base::AutoLock lock(lock_); |
| 84 | 84 |
| 85 overrides_[base::StringPiece(name)] = value; | 85 overrides_[base::StringPiece(name)] = value; |
| 86 all_overrides_[base::StringPiece(name)] = value; | 86 all_overrides_[base::StringPiece(name)] = value; |
| 87 } | 87 } |
| 88 | 88 |
| 89 void Args::AddArgOverrides(const Scope::KeyValueMap& overrides) { | 89 void Args::AddArgOverrides(const Scope::KeyValueMap& overrides) { |
| 90 base::AutoLock lock(lock_); | 90 base::AutoLock lock(lock_); |
| 91 | 91 |
| 92 for (Scope::KeyValueMap::const_iterator i = overrides.begin(); | 92 for (const auto& cur_override : overrides) { |
| 93 i != overrides.end(); ++i) { | 93 overrides_[cur_override.first] = cur_override.second; |
| 94 overrides_[i->first] = i->second; | 94 all_overrides_[cur_override.first] = cur_override.second; |
| 95 all_overrides_[i->first] = i->second; | |
| 96 } | 95 } |
| 97 } | 96 } |
| 98 | 97 |
| 99 const Value* Args::GetArgOverride(const char* name) const { | 98 const Value* Args::GetArgOverride(const char* name) const { |
| 100 base::AutoLock lock(lock_); | 99 base::AutoLock lock(lock_); |
| 101 | 100 |
| 102 Scope::KeyValueMap::const_iterator found = | 101 Scope::KeyValueMap::const_iterator found = |
| 103 all_overrides_.find(base::StringPiece(name)); | 102 all_overrides_.find(base::StringPiece(name)); |
| 104 if (found == all_overrides_.end()) | 103 if (found == all_overrides_.end()) |
| 105 return NULL; | 104 return NULL; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 119 ApplyOverridesLocked(overrides_, dest); | 118 ApplyOverridesLocked(overrides_, dest); |
| 120 ApplyOverridesLocked(toolchain_overrides, dest); | 119 ApplyOverridesLocked(toolchain_overrides, dest); |
| 121 SaveOverrideRecordLocked(toolchain_overrides); | 120 SaveOverrideRecordLocked(toolchain_overrides); |
| 122 } | 121 } |
| 123 | 122 |
| 124 bool Args::DeclareArgs(const Scope::KeyValueMap& args, | 123 bool Args::DeclareArgs(const Scope::KeyValueMap& args, |
| 125 Scope* scope_to_set, | 124 Scope* scope_to_set, |
| 126 Err* err) const { | 125 Err* err) const { |
| 127 base::AutoLock lock(lock_); | 126 base::AutoLock lock(lock_); |
| 128 | 127 |
| 129 for (Scope::KeyValueMap::const_iterator i = args.begin(); | 128 for (const auto& arg : args) { |
| 130 i != args.end(); ++i) { | |
| 131 // Verify that the value hasn't already been declared. We want each value | 129 // Verify that the value hasn't already been declared. We want each value |
| 132 // to be declared only once. | 130 // to be declared only once. |
| 133 // | 131 // |
| 134 // The tricky part is that a buildfile can be interpreted multiple times | 132 // The tricky part is that a buildfile can be interpreted multiple times |
| 135 // when used from different toolchains, so we can't just check that we've | 133 // when used from different toolchains, so we can't just check that we've |
| 136 // seen it before. Instead, we check that the location matches. | 134 // seen it before. Instead, we check that the location matches. |
| 137 Scope::KeyValueMap::iterator previously_declared = | 135 Scope::KeyValueMap::iterator previously_declared = |
| 138 declared_arguments_.find(i->first); | 136 declared_arguments_.find(arg.first); |
| 139 if (previously_declared != declared_arguments_.end()) { | 137 if (previously_declared != declared_arguments_.end()) { |
| 140 if (previously_declared->second.origin() != i->second.origin()) { | 138 if (previously_declared->second.origin() != arg.second.origin()) { |
| 141 // Declaration location mismatch. | 139 // Declaration location mismatch. |
| 142 *err = Err(i->second.origin(), "Duplicate build argument declaration.", | 140 *err = Err(arg.second.origin(), |
| 141 "Duplicate build argument declaration.", |
| 143 "Here you're declaring an argument that was already declared " | 142 "Here you're declaring an argument that was already declared " |
| 144 "elsewhere.\nYou can only declare each argument once in the entire " | 143 "elsewhere.\nYou can only declare each argument once in the entire " |
| 145 "build so there is one\ncanonical place for documentation and the " | 144 "build so there is one\ncanonical place for documentation and the " |
| 146 "default value. Either move this\nargument to the build config " | 145 "default value. Either move this\nargument to the build config " |
| 147 "file (for visibility everywhere) or to a .gni file\nthat you " | 146 "file (for visibility everywhere) or to a .gni file\nthat you " |
| 148 "\"import\" from the files where you need it (preferred)."); | 147 "\"import\" from the files where you need it (preferred)."); |
| 149 err->AppendSubErr(Err(previously_declared->second.origin(), | 148 err->AppendSubErr(Err(previously_declared->second.origin(), |
| 150 "Previous declaration.", | 149 "Previous declaration.", |
| 151 "See also \"gn help buildargs\" for more on how " | 150 "See also \"gn help buildargs\" for more on how " |
| 152 "build arguments work.")); | 151 "build arguments work.")); |
| 153 return false; | 152 return false; |
| 154 } | 153 } |
| 155 } else { | 154 } else { |
| 156 declared_arguments_.insert(*i); | 155 declared_arguments_.insert(arg); |
| 157 } | 156 } |
| 158 | 157 |
| 159 // Only set on the current scope to the new value if it hasn't been already | 158 // Only set on the current scope to the new value if it hasn't been already |
| 160 // set. Mark the variable used so the build script can override it in | 159 // set. Mark the variable used so the build script can override it in |
| 161 // certain cases without getting unused value errors. | 160 // certain cases without getting unused value errors. |
| 162 if (!scope_to_set->GetValue(i->first)) { | 161 if (!scope_to_set->GetValue(arg.first)) { |
| 163 scope_to_set->SetValue(i->first, i->second, i->second.origin()); | 162 scope_to_set->SetValue(arg.first, arg.second, arg.second.origin()); |
| 164 scope_to_set->MarkUsed(i->first); | 163 scope_to_set->MarkUsed(arg.first); |
| 165 } | 164 } |
| 166 } | 165 } |
| 167 | 166 |
| 168 return true; | 167 return true; |
| 169 } | 168 } |
| 170 | 169 |
| 171 bool Args::VerifyAllOverridesUsed(Err* err) const { | 170 bool Args::VerifyAllOverridesUsed(Err* err) const { |
| 172 base::AutoLock lock(lock_); | 171 base::AutoLock lock(lock_); |
| 173 return VerifyAllOverridesUsed(all_overrides_, declared_arguments_, err); | 172 return VerifyAllOverridesUsed(all_overrides_, declared_arguments_, err); |
| 174 } | 173 } |
| 175 | 174 |
| 176 bool Args::VerifyAllOverridesUsed( | 175 bool Args::VerifyAllOverridesUsed( |
| 177 const Scope::KeyValueMap& overrides, | 176 const Scope::KeyValueMap& overrides, |
| 178 const Scope::KeyValueMap& declared_arguments, | 177 const Scope::KeyValueMap& declared_arguments, |
| 179 Err* err) { | 178 Err* err) { |
| 180 for (Scope::KeyValueMap::const_iterator i = overrides.begin(); | 179 for (const auto& override : overrides) { |
| 181 i != overrides.end(); ++i) { | 180 if (declared_arguments.find(override.first) == declared_arguments.end()) { |
| 182 if (declared_arguments.find(i->first) == declared_arguments.end()) { | |
| 183 // Get a list of all possible overrides for help with error finding. | 181 // Get a list of all possible overrides for help with error finding. |
| 184 // | 182 // |
| 185 // It might be nice to do edit distance checks to see if we can find one | 183 // It might be nice to do edit distance checks to see if we can find one |
| 186 // close to what you typed. | 184 // close to what you typed. |
| 187 std::string all_declared_str; | 185 std::string all_declared_str; |
| 188 for (Scope::KeyValueMap::const_iterator cur_str = | 186 for (Scope::KeyValueMap::const_iterator cur_str = |
| 189 declared_arguments.begin(); | 187 declared_arguments.begin(); |
| 190 cur_str != declared_arguments.end(); ++cur_str) { | 188 cur_str != declared_arguments.end(); ++cur_str) { |
| 191 if (cur_str != declared_arguments.begin()) | 189 if (cur_str != declared_arguments.begin()) |
| 192 all_declared_str += ", "; | 190 all_declared_str += ", "; |
| 193 all_declared_str += cur_str->first.as_string(); | 191 all_declared_str += cur_str->first.as_string(); |
| 194 } | 192 } |
| 195 | 193 |
| 196 *err = Err(i->second.origin(), "Build argument has no effect.", | 194 *err = Err(override.second.origin(), "Build argument has no effect.", |
| 197 "The variable \"" + i->first.as_string() + "\" was set as a build " | 195 "The variable \"" + override.first.as_string() + |
| 196 "\" was set as a build " |
| 198 "argument\nbut never appeared in a declare_args() block in any " | 197 "argument\nbut never appeared in a declare_args() block in any " |
| 199 "buildfile.\n\nPossible arguments: " + all_declared_str); | 198 "buildfile.\n\nPossible arguments: " + all_declared_str); |
| 200 return false; | 199 return false; |
| 201 } | 200 } |
| 202 } | 201 } |
| 203 return true; | 202 return true; |
| 204 } | 203 } |
| 205 | 204 |
| 206 void Args::MergeDeclaredArguments(Scope::KeyValueMap* dest) const { | 205 void Args::MergeDeclaredArguments(Scope::KeyValueMap* dest) const { |
| 207 base::AutoLock lock(lock_); | 206 base::AutoLock lock(lock_); |
| 208 | 207 for (const auto& arg : declared_arguments_) |
| 209 for (Scope::KeyValueMap::const_iterator i = declared_arguments_.begin(); | 208 (*dest)[arg.first] = arg.second; |
| 210 i != declared_arguments_.end(); ++i) | |
| 211 (*dest)[i->first] = i->second; | |
| 212 } | 209 } |
| 213 | 210 |
| 214 void Args::SetSystemVarsLocked(Scope* dest) const { | 211 void Args::SetSystemVarsLocked(Scope* dest) const { |
| 215 lock_.AssertAcquired(); | 212 lock_.AssertAcquired(); |
| 216 | 213 |
| 217 // Host OS. | 214 // Host OS. |
| 218 const char* os = NULL; | 215 const char* os = NULL; |
| 219 #if defined(OS_WIN) | 216 #if defined(OS_WIN) |
| 220 os = "win"; | 217 os = "win"; |
| 221 #elif defined(OS_MACOSX) | 218 #elif defined(OS_MACOSX) |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 // without geting a warning about overwriting an unused variable. | 279 // without geting a warning about overwriting an unused variable. |
| 283 declared_arguments_[variables::kOs] = os_val; | 280 declared_arguments_[variables::kOs] = os_val; |
| 284 declared_arguments_[variables::kCpuArch] = arch_val; | 281 declared_arguments_[variables::kCpuArch] = arch_val; |
| 285 dest->MarkUsed(variables::kCpuArch); | 282 dest->MarkUsed(variables::kCpuArch); |
| 286 dest->MarkUsed(variables::kOs); | 283 dest->MarkUsed(variables::kOs); |
| 287 } | 284 } |
| 288 | 285 |
| 289 void Args::ApplyOverridesLocked(const Scope::KeyValueMap& values, | 286 void Args::ApplyOverridesLocked(const Scope::KeyValueMap& values, |
| 290 Scope* scope) const { | 287 Scope* scope) const { |
| 291 lock_.AssertAcquired(); | 288 lock_.AssertAcquired(); |
| 292 for (Scope::KeyValueMap::const_iterator i = values.begin(); | 289 for (const auto& val : values) |
| 293 i != values.end(); ++i) | 290 scope->SetValue(val.first, val.second, val.second.origin()); |
| 294 scope->SetValue(i->first, i->second, i->second.origin()); | |
| 295 } | 291 } |
| 296 | 292 |
| 297 void Args::SaveOverrideRecordLocked(const Scope::KeyValueMap& values) const { | 293 void Args::SaveOverrideRecordLocked(const Scope::KeyValueMap& values) const { |
| 298 lock_.AssertAcquired(); | 294 lock_.AssertAcquired(); |
| 299 for (Scope::KeyValueMap::const_iterator i = values.begin(); | 295 for (const auto& val : values) |
| 300 i != values.end(); ++i) | 296 all_overrides_[val.first] = val.second; |
| 301 all_overrides_[i->first] = i->second; | |
| 302 } | 297 } |
| OLD | NEW |