| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/substitution_writer.h" | 5 #include "tools/gn/substitution_writer.h" |
| 6 | 6 |
| 7 #include "tools/gn/build_settings.h" | 7 #include "tools/gn/build_settings.h" |
| 8 #include "tools/gn/escape.h" | 8 #include "tools/gn/escape.h" |
| 9 #include "tools/gn/filesystem_utils.h" | 9 #include "tools/gn/filesystem_utils.h" |
| 10 #include "tools/gn/output_file.h" | 10 #include "tools/gn/output_file.h" |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 const EscapeOptions& escape_options, | 144 const EscapeOptions& escape_options, |
| 145 std::ostream& out) { | 145 std::ostream& out) { |
| 146 // The result needs to be quoted as if it was one string, but the $ for | 146 // The result needs to be quoted as if it was one string, but the $ for |
| 147 // the inserted Ninja variables can't be escaped. So write to a buffer with | 147 // the inserted Ninja variables can't be escaped. So write to a buffer with |
| 148 // no quoting, and then quote the whole thing if necessary. | 148 // no quoting, and then quote the whole thing if necessary. |
| 149 EscapeOptions no_quoting(escape_options); | 149 EscapeOptions no_quoting(escape_options); |
| 150 no_quoting.inhibit_quoting = true; | 150 no_quoting.inhibit_quoting = true; |
| 151 | 151 |
| 152 bool needs_quotes = false; | 152 bool needs_quotes = false; |
| 153 std::string result; | 153 std::string result; |
| 154 for (size_t i = 0; i < pattern.ranges().size(); i++) { | 154 for (const auto& range : pattern.ranges()) { |
| 155 const SubstitutionPattern::Subrange range = pattern.ranges()[i]; | |
| 156 if (range.type == SUBSTITUTION_LITERAL) { | 155 if (range.type == SUBSTITUTION_LITERAL) { |
| 157 result.append(EscapeString(range.literal, no_quoting, &needs_quotes)); | 156 result.append(EscapeString(range.literal, no_quoting, &needs_quotes)); |
| 158 } else { | 157 } else { |
| 159 result.append("${"); | 158 result.append("${"); |
| 160 result.append(kSubstitutionNinjaNames[range.type]); | 159 result.append(kSubstitutionNinjaNames[range.type]); |
| 161 result.append("}"); | 160 result.append("}"); |
| 162 } | 161 } |
| 163 } | 162 } |
| 164 | 163 |
| 165 if (needs_quotes && !escape_options.inhibit_quoting) | 164 if (needs_quotes && !escape_options.inhibit_quoting) |
| 166 out << "\"" << result << "\""; | 165 out << "\"" << result << "\""; |
| 167 else | 166 else |
| 168 out << result; | 167 out << result; |
| 169 } | 168 } |
| 170 | 169 |
| 171 // static | 170 // static |
| 172 void SubstitutionWriter::GetListAsSourceFiles( | 171 void SubstitutionWriter::GetListAsSourceFiles( |
| 173 const SubstitutionList& list, | 172 const SubstitutionList& list, |
| 174 std::vector<SourceFile>* output) { | 173 std::vector<SourceFile>* output) { |
| 175 for (size_t i = 0; i < list.list().size(); i++) { | 174 for (const auto& pattern : list.list()) { |
| 176 const SubstitutionPattern& pattern = list.list()[i]; | |
| 177 CHECK(pattern.ranges().size() == 1 && | 175 CHECK(pattern.ranges().size() == 1 && |
| 178 pattern.ranges()[0].type == SUBSTITUTION_LITERAL) | 176 pattern.ranges()[0].type == SUBSTITUTION_LITERAL) |
| 179 << "The substitution patterm \"" | 177 << "The substitution patterm \"" |
| 180 << pattern.AsString() | 178 << pattern.AsString() |
| 181 << "\" was expected to be a literal with no {{substitutions}}."; | 179 << "\" was expected to be a literal with no {{substitutions}}."; |
| 182 const std::string& literal = pattern.ranges()[0].literal; | 180 const std::string& literal = pattern.ranges()[0].literal; |
| 183 CHECK(literal.size() >= 1 && literal[0] == '/') | 181 CHECK(literal.size() >= 1 && literal[0] == '/') |
| 184 << "The result of the pattern \"" | 182 << "The result of the pattern \"" |
| 185 << pattern.AsString() | 183 << pattern.AsString() |
| 186 << "\" was not an absolute path."; | 184 << "\" was not an absolute path."; |
| 187 output->push_back(SourceFile(literal)); | 185 output->push_back(SourceFile(literal)); |
| 188 } | 186 } |
| 189 } | 187 } |
| 190 | 188 |
| 191 // static | 189 // static |
| 192 void SubstitutionWriter::GetListAsOutputFiles( | 190 void SubstitutionWriter::GetListAsOutputFiles( |
| 193 const Settings* settings, | 191 const Settings* settings, |
| 194 const SubstitutionList& list, | 192 const SubstitutionList& list, |
| 195 std::vector<OutputFile>* output) { | 193 std::vector<OutputFile>* output) { |
| 196 std::vector<SourceFile> output_as_sources; | 194 std::vector<SourceFile> output_as_sources; |
| 197 GetListAsSourceFiles(list, &output_as_sources); | 195 GetListAsSourceFiles(list, &output_as_sources); |
| 198 for (size_t i = 0; i < output_as_sources.size(); i++) { | 196 for (const auto& file : output_as_sources) |
| 199 output->push_back(OutputFile(settings->build_settings(), | 197 output->push_back(OutputFile(settings->build_settings(), file)); |
| 200 output_as_sources[i])); | |
| 201 } | |
| 202 } | 198 } |
| 203 | 199 |
| 204 // static | 200 // static |
| 205 SourceFile SubstitutionWriter::ApplyPatternToSource( | 201 SourceFile SubstitutionWriter::ApplyPatternToSource( |
| 206 const Settings* settings, | 202 const Settings* settings, |
| 207 const SubstitutionPattern& pattern, | 203 const SubstitutionPattern& pattern, |
| 208 const SourceFile& source) { | 204 const SourceFile& source) { |
| 209 std::string result_value = ApplyPatternToSourceAsString( | 205 std::string result_value = ApplyPatternToSourceAsString( |
| 210 settings, pattern, source); | 206 settings, pattern, source); |
| 211 CHECK(!result_value.empty() && result_value[0] == '/') | 207 CHECK(!result_value.empty() && result_value[0] == '/') |
| 212 << "The result of the pattern \"" | 208 << "The result of the pattern \"" |
| 213 << pattern.AsString() | 209 << pattern.AsString() |
| 214 << "\" was not a path beginning in \"/\" or \"//\"."; | 210 << "\" was not a path beginning in \"/\" or \"//\"."; |
| 215 return SourceFile(SourceFile::SWAP_IN, &result_value); | 211 return SourceFile(SourceFile::SWAP_IN, &result_value); |
| 216 } | 212 } |
| 217 | 213 |
| 218 // static | 214 // static |
| 219 std::string SubstitutionWriter::ApplyPatternToSourceAsString( | 215 std::string SubstitutionWriter::ApplyPatternToSourceAsString( |
| 220 const Settings* settings, | 216 const Settings* settings, |
| 221 const SubstitutionPattern& pattern, | 217 const SubstitutionPattern& pattern, |
| 222 const SourceFile& source) { | 218 const SourceFile& source) { |
| 223 std::string result_value; | 219 std::string result_value; |
| 224 for (size_t i = 0; i < pattern.ranges().size(); i++) { | 220 for (const auto& subrange : pattern.ranges()) { |
| 225 const SubstitutionPattern::Subrange& subrange = pattern.ranges()[i]; | |
| 226 if (subrange.type == SUBSTITUTION_LITERAL) { | 221 if (subrange.type == SUBSTITUTION_LITERAL) { |
| 227 result_value.append(subrange.literal); | 222 result_value.append(subrange.literal); |
| 228 } else { | 223 } else { |
| 229 result_value.append( | 224 result_value.append( |
| 230 GetSourceSubstitution(settings, source, subrange.type, | 225 GetSourceSubstitution(settings, source, subrange.type, |
| 231 OUTPUT_ABSOLUTE, SourceDir())); | 226 OUTPUT_ABSOLUTE, SourceDir())); |
| 232 } | 227 } |
| 233 } | 228 } |
| 234 return result_value; | 229 return result_value; |
| 235 } | 230 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 246 << "\" was not an absolute path beginning in \"//\"."; | 241 << "\" was not an absolute path beginning in \"//\"."; |
| 247 return OutputFile(settings->build_settings(), result_as_source); | 242 return OutputFile(settings->build_settings(), result_as_source); |
| 248 } | 243 } |
| 249 | 244 |
| 250 // static | 245 // static |
| 251 void SubstitutionWriter::ApplyListToSource( | 246 void SubstitutionWriter::ApplyListToSource( |
| 252 const Settings* settings, | 247 const Settings* settings, |
| 253 const SubstitutionList& list, | 248 const SubstitutionList& list, |
| 254 const SourceFile& source, | 249 const SourceFile& source, |
| 255 std::vector<SourceFile>* output) { | 250 std::vector<SourceFile>* output) { |
| 256 for (size_t i = 0; i < list.list().size(); i++) { | 251 for (const auto& item : list.list()) |
| 257 output->push_back(ApplyPatternToSource( | 252 output->push_back(ApplyPatternToSource(settings, item, source)); |
| 258 settings, list.list()[i], source)); | |
| 259 } | |
| 260 } | 253 } |
| 261 | 254 |
| 262 // static | 255 // static |
| 263 void SubstitutionWriter::ApplyListToSourceAsString( | 256 void SubstitutionWriter::ApplyListToSourceAsString( |
| 264 const Settings* settings, | 257 const Settings* settings, |
| 265 const SubstitutionList& list, | 258 const SubstitutionList& list, |
| 266 const SourceFile& source, | 259 const SourceFile& source, |
| 267 std::vector<std::string>* output) { | 260 std::vector<std::string>* output) { |
| 268 for (size_t i = 0; i < list.list().size(); i++) { | 261 for (const auto& item : list.list()) |
| 269 output->push_back(ApplyPatternToSourceAsString( | 262 output->push_back(ApplyPatternToSourceAsString(settings, item, source)); |
| 270 settings, list.list()[i], source)); | |
| 271 } | |
| 272 } | 263 } |
| 273 | 264 |
| 274 // static | 265 // static |
| 275 void SubstitutionWriter::ApplyListToSourceAsOutputFile( | 266 void SubstitutionWriter::ApplyListToSourceAsOutputFile( |
| 276 const Settings* settings, | 267 const Settings* settings, |
| 277 const SubstitutionList& list, | 268 const SubstitutionList& list, |
| 278 const SourceFile& source, | 269 const SourceFile& source, |
| 279 std::vector<OutputFile>* output) { | 270 std::vector<OutputFile>* output) { |
| 280 for (size_t i = 0; i < list.list().size(); i++) { | 271 for (const auto& item : list.list()) |
| 281 output->push_back(ApplyPatternToSourceAsOutputFile( | 272 output->push_back(ApplyPatternToSourceAsOutputFile(settings, item, source)); |
| 282 settings, list.list()[i], source)); | |
| 283 } | |
| 284 } | 273 } |
| 285 | 274 |
| 286 // static | 275 // static |
| 287 void SubstitutionWriter::ApplyListToSources( | 276 void SubstitutionWriter::ApplyListToSources( |
| 288 const Settings* settings, | 277 const Settings* settings, |
| 289 const SubstitutionList& list, | 278 const SubstitutionList& list, |
| 290 const std::vector<SourceFile>& sources, | 279 const std::vector<SourceFile>& sources, |
| 291 std::vector<SourceFile>* output) { | 280 std::vector<SourceFile>* output) { |
| 292 output->clear(); | 281 output->clear(); |
| 293 for (size_t i = 0; i < sources.size(); i++) | 282 for (const auto& source : sources) |
| 294 ApplyListToSource(settings, list, sources[i], output); | 283 ApplyListToSource(settings, list, source, output); |
| 295 } | 284 } |
| 296 | 285 |
| 297 // static | 286 // static |
| 298 void SubstitutionWriter::ApplyListToSourcesAsString( | 287 void SubstitutionWriter::ApplyListToSourcesAsString( |
| 299 const Settings* settings, | 288 const Settings* settings, |
| 300 const SubstitutionList& list, | 289 const SubstitutionList& list, |
| 301 const std::vector<SourceFile>& sources, | 290 const std::vector<SourceFile>& sources, |
| 302 std::vector<std::string>* output) { | 291 std::vector<std::string>* output) { |
| 303 output->clear(); | 292 output->clear(); |
| 304 for (size_t i = 0; i < sources.size(); i++) | 293 for (const auto& source : sources) |
| 305 ApplyListToSourceAsString(settings, list, sources[i], output); | 294 ApplyListToSourceAsString(settings, list, source, output); |
| 306 } | 295 } |
| 307 | 296 |
| 308 // static | 297 // static |
| 309 void SubstitutionWriter::ApplyListToSourcesAsOutputFile( | 298 void SubstitutionWriter::ApplyListToSourcesAsOutputFile( |
| 310 const Settings* settings, | 299 const Settings* settings, |
| 311 const SubstitutionList& list, | 300 const SubstitutionList& list, |
| 312 const std::vector<SourceFile>& sources, | 301 const std::vector<SourceFile>& sources, |
| 313 std::vector<OutputFile>* output) { | 302 std::vector<OutputFile>* output) { |
| 314 output->clear(); | 303 output->clear(); |
| 315 for (size_t i = 0; i < sources.size(); i++) | 304 for (const auto& source : sources) |
| 316 ApplyListToSourceAsOutputFile(settings, list, sources[i], output); | 305 ApplyListToSourceAsOutputFile(settings, list, source, output); |
| 317 } | 306 } |
| 318 | 307 |
| 319 // static | 308 // static |
| 320 void SubstitutionWriter::WriteNinjaVariablesForSource( | 309 void SubstitutionWriter::WriteNinjaVariablesForSource( |
| 321 const Settings* settings, | 310 const Settings* settings, |
| 322 const SourceFile& source, | 311 const SourceFile& source, |
| 323 const std::vector<SubstitutionType>& types, | 312 const std::vector<SubstitutionType>& types, |
| 324 const EscapeOptions& escape_options, | 313 const EscapeOptions& escape_options, |
| 325 std::ostream& out) { | 314 std::ostream& out) { |
| 326 for (size_t i = 0; i < types.size(); i++) { | 315 for (const auto& type : types) { |
| 327 // Don't write SOURCE since that just maps to Ninja's $in variable, which | 316 // Don't write SOURCE since that just maps to Ninja's $in variable, which |
| 328 // is implicit in the rule. | 317 // is implicit in the rule. |
| 329 if (types[i] != SUBSTITUTION_SOURCE) { | 318 if (type != SUBSTITUTION_SOURCE) { |
| 330 out << " " << kSubstitutionNinjaNames[types[i]] << " = "; | 319 out << " " << kSubstitutionNinjaNames[type] << " = "; |
| 331 EscapeStringToStream( | 320 EscapeStringToStream( |
| 332 out, | 321 out, |
| 333 GetSourceSubstitution(settings, source, types[i], OUTPUT_RELATIVE, | 322 GetSourceSubstitution(settings, source, type, OUTPUT_RELATIVE, |
| 334 settings->build_settings()->build_dir()), | 323 settings->build_settings()->build_dir()), |
| 335 escape_options); | 324 escape_options); |
| 336 out << std::endl; | 325 out << std::endl; |
| 337 } | 326 } |
| 338 } | 327 } |
| 339 } | 328 } |
| 340 | 329 |
| 341 // static | 330 // static |
| 342 std::string SubstitutionWriter::GetSourceSubstitution( | 331 std::string SubstitutionWriter::GetSourceSubstitution( |
| 343 const Settings* settings, | 332 const Settings* settings, |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 return to_rebase; | 384 return to_rebase; |
| 396 return RebaseSourceAbsolutePath(to_rebase, relative_to); | 385 return RebaseSourceAbsolutePath(to_rebase, relative_to); |
| 397 } | 386 } |
| 398 | 387 |
| 399 // static | 388 // static |
| 400 OutputFile SubstitutionWriter::ApplyPatternToTargetAsOutputFile( | 389 OutputFile SubstitutionWriter::ApplyPatternToTargetAsOutputFile( |
| 401 const Target* target, | 390 const Target* target, |
| 402 const Tool* tool, | 391 const Tool* tool, |
| 403 const SubstitutionPattern& pattern) { | 392 const SubstitutionPattern& pattern) { |
| 404 std::string result_value; | 393 std::string result_value; |
| 405 for (size_t i = 0; i < pattern.ranges().size(); i++) { | 394 for (const auto& subrange : pattern.ranges()) { |
| 406 const SubstitutionPattern::Subrange& subrange = pattern.ranges()[i]; | |
| 407 if (subrange.type == SUBSTITUTION_LITERAL) { | 395 if (subrange.type == SUBSTITUTION_LITERAL) { |
| 408 result_value.append(subrange.literal); | 396 result_value.append(subrange.literal); |
| 409 } else { | 397 } else { |
| 410 std::string subst; | 398 std::string subst; |
| 411 CHECK(GetTargetSubstitution(target, subrange.type, &subst)); | 399 CHECK(GetTargetSubstitution(target, subrange.type, &subst)); |
| 412 result_value.append(subst); | 400 result_value.append(subst); |
| 413 } | 401 } |
| 414 } | 402 } |
| 415 return OutputFile(result_value); | 403 return OutputFile(result_value); |
| 416 } | 404 } |
| 417 | 405 |
| 418 // static | 406 // static |
| 419 void SubstitutionWriter::ApplyListToTargetAsOutputFile( | 407 void SubstitutionWriter::ApplyListToTargetAsOutputFile( |
| 420 const Target* target, | 408 const Target* target, |
| 421 const Tool* tool, | 409 const Tool* tool, |
| 422 const SubstitutionList& list, | 410 const SubstitutionList& list, |
| 423 std::vector<OutputFile>* output) { | 411 std::vector<OutputFile>* output) { |
| 424 for (size_t i = 0; i < list.list().size(); i++) { | 412 for (const auto& item : list.list()) |
| 425 output->push_back(ApplyPatternToTargetAsOutputFile( | 413 output->push_back(ApplyPatternToTargetAsOutputFile(target, tool, item)); |
| 426 target, tool, list.list()[i])); | |
| 427 } | |
| 428 } | 414 } |
| 429 | 415 |
| 430 // static | 416 // static |
| 431 bool SubstitutionWriter::GetTargetSubstitution( | 417 bool SubstitutionWriter::GetTargetSubstitution( |
| 432 const Target* target, | 418 const Target* target, |
| 433 SubstitutionType type, | 419 SubstitutionType type, |
| 434 std::string* result) { | 420 std::string* result) { |
| 435 switch (type) { | 421 switch (type) { |
| 436 case SUBSTITUTION_LABEL: | 422 case SUBSTITUTION_LABEL: |
| 437 // Only include the toolchain for non-default toolchains. | 423 // Only include the toolchain for non-default toolchains. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 GetTargetSubstitution(target, type, &result); | 461 GetTargetSubstitution(target, type, &result); |
| 476 return result; | 462 return result; |
| 477 } | 463 } |
| 478 | 464 |
| 479 // static | 465 // static |
| 480 OutputFile SubstitutionWriter::ApplyPatternToCompilerAsOutputFile( | 466 OutputFile SubstitutionWriter::ApplyPatternToCompilerAsOutputFile( |
| 481 const Target* target, | 467 const Target* target, |
| 482 const SourceFile& source, | 468 const SourceFile& source, |
| 483 const SubstitutionPattern& pattern) { | 469 const SubstitutionPattern& pattern) { |
| 484 OutputFile result; | 470 OutputFile result; |
| 485 for (size_t i = 0; i < pattern.ranges().size(); i++) { | 471 for (const auto& subrange : pattern.ranges()) { |
| 486 const SubstitutionPattern::Subrange& subrange = pattern.ranges()[i]; | |
| 487 if (subrange.type == SUBSTITUTION_LITERAL) { | 472 if (subrange.type == SUBSTITUTION_LITERAL) { |
| 488 result.value().append(subrange.literal); | 473 result.value().append(subrange.literal); |
| 489 } else { | 474 } else { |
| 490 result.value().append( | 475 result.value().append( |
| 491 GetCompilerSubstitution(target, source, subrange.type)); | 476 GetCompilerSubstitution(target, source, subrange.type)); |
| 492 } | 477 } |
| 493 } | 478 } |
| 494 return result; | 479 return result; |
| 495 } | 480 } |
| 496 | 481 |
| 497 // static | 482 // static |
| 498 void SubstitutionWriter::ApplyListToCompilerAsOutputFile( | 483 void SubstitutionWriter::ApplyListToCompilerAsOutputFile( |
| 499 const Target* target, | 484 const Target* target, |
| 500 const SourceFile& source, | 485 const SourceFile& source, |
| 501 const SubstitutionList& list, | 486 const SubstitutionList& list, |
| 502 std::vector<OutputFile>* output) { | 487 std::vector<OutputFile>* output) { |
| 503 for (size_t i = 0; i < list.list().size(); i++) { | 488 for (const auto& item : list.list()) |
| 504 output->push_back(ApplyPatternToCompilerAsOutputFile( | 489 output->push_back(ApplyPatternToCompilerAsOutputFile(target, source, item)); |
| 505 target, source, list.list()[i])); | |
| 506 } | |
| 507 } | 490 } |
| 508 | 491 |
| 509 // static | 492 // static |
| 510 std::string SubstitutionWriter::GetCompilerSubstitution( | 493 std::string SubstitutionWriter::GetCompilerSubstitution( |
| 511 const Target* target, | 494 const Target* target, |
| 512 const SourceFile& source, | 495 const SourceFile& source, |
| 513 SubstitutionType type) { | 496 SubstitutionType type) { |
| 514 // First try the common tool ones. | 497 // First try the common tool ones. |
| 515 std::string result; | 498 std::string result; |
| 516 if (GetTargetSubstitution(target, type, &result)) | 499 if (GetTargetSubstitution(target, type, &result)) |
| 517 return result; | 500 return result; |
| 518 | 501 |
| 519 // Fall-through to the source ones. | 502 // Fall-through to the source ones. |
| 520 return GetSourceSubstitution( | 503 return GetSourceSubstitution( |
| 521 target->settings(), source, type, OUTPUT_RELATIVE, | 504 target->settings(), source, type, OUTPUT_RELATIVE, |
| 522 target->settings()->build_settings()->build_dir()); | 505 target->settings()->build_settings()->build_dir()); |
| 523 } | 506 } |
| 524 | 507 |
| 525 // static | 508 // static |
| 526 OutputFile SubstitutionWriter::ApplyPatternToLinkerAsOutputFile( | 509 OutputFile SubstitutionWriter::ApplyPatternToLinkerAsOutputFile( |
| 527 const Target* target, | 510 const Target* target, |
| 528 const Tool* tool, | 511 const Tool* tool, |
| 529 const SubstitutionPattern& pattern) { | 512 const SubstitutionPattern& pattern) { |
| 530 OutputFile result; | 513 OutputFile result; |
| 531 for (size_t i = 0; i < pattern.ranges().size(); i++) { | 514 for (const auto& subrange : pattern.ranges()) { |
| 532 const SubstitutionPattern::Subrange& subrange = pattern.ranges()[i]; | |
| 533 if (subrange.type == SUBSTITUTION_LITERAL) { | 515 if (subrange.type == SUBSTITUTION_LITERAL) { |
| 534 result.value().append(subrange.literal); | 516 result.value().append(subrange.literal); |
| 535 } else { | 517 } else { |
| 536 result.value().append(GetLinkerSubstitution(target, tool, subrange.type)); | 518 result.value().append(GetLinkerSubstitution(target, tool, subrange.type)); |
| 537 } | 519 } |
| 538 } | 520 } |
| 539 return result; | 521 return result; |
| 540 } | 522 } |
| 541 | 523 |
| 542 // static | 524 // static |
| 543 void SubstitutionWriter::ApplyListToLinkerAsOutputFile( | 525 void SubstitutionWriter::ApplyListToLinkerAsOutputFile( |
| 544 const Target* target, | 526 const Target* target, |
| 545 const Tool* tool, | 527 const Tool* tool, |
| 546 const SubstitutionList& list, | 528 const SubstitutionList& list, |
| 547 std::vector<OutputFile>* output) { | 529 std::vector<OutputFile>* output) { |
| 548 for (size_t i = 0; i < list.list().size(); i++) { | 530 for (const auto& item : list.list()) |
| 549 output->push_back(ApplyPatternToLinkerAsOutputFile( | 531 output->push_back(ApplyPatternToLinkerAsOutputFile(target, tool, item)); |
| 550 target, tool, list.list()[i])); | |
| 551 } | |
| 552 } | 532 } |
| 553 | 533 |
| 554 // static | 534 // static |
| 555 std::string SubstitutionWriter::GetLinkerSubstitution( | 535 std::string SubstitutionWriter::GetLinkerSubstitution( |
| 556 const Target* target, | 536 const Target* target, |
| 557 const Tool* tool, | 537 const Tool* tool, |
| 558 SubstitutionType type) { | 538 SubstitutionType type) { |
| 559 // First try the common tool ones. | 539 // First try the common tool ones. |
| 560 std::string result; | 540 std::string result; |
| 561 if (GetTargetSubstitution(target, type, &result)) | 541 if (GetTargetSubstitution(target, type, &result)) |
| 562 return result; | 542 return result; |
| 563 | 543 |
| 564 // Fall-through to the linker-specific ones. | 544 // Fall-through to the linker-specific ones. |
| 565 switch (type) { | 545 switch (type) { |
| 566 case SUBSTITUTION_OUTPUT_EXTENSION: | 546 case SUBSTITUTION_OUTPUT_EXTENSION: |
| 567 // Use the extension provided on the target if nonempty, otherwise | 547 // Use the extension provided on the target if nonempty, otherwise |
| 568 // fall back on the default. Note that the target's output extension | 548 // fall back on the default. Note that the target's output extension |
| 569 // does not include the dot but the tool's does. | 549 // does not include the dot but the tool's does. |
| 570 if (target->output_extension().empty()) | 550 if (target->output_extension().empty()) |
| 571 return tool->default_output_extension(); | 551 return tool->default_output_extension(); |
| 572 return std::string(".") + target->output_extension(); | 552 return std::string(".") + target->output_extension(); |
| 573 | 553 |
| 574 default: | 554 default: |
| 575 NOTREACHED(); | 555 NOTREACHED(); |
| 576 return std::string(); | 556 return std::string(); |
| 577 } | 557 } |
| 578 } | 558 } |
| OLD | NEW |