| Index: tools/gn/substitution_writer.cc
|
| diff --git a/tools/gn/substitution_writer.cc b/tools/gn/substitution_writer.cc
|
| index 4d818cdaeac6a25d45de131d93618909ac5a3379..7a3534e4dea3d7a1b9792139ea09fe24b00341eb 100644
|
| --- a/tools/gn/substitution_writer.cc
|
| +++ b/tools/gn/substitution_writer.cc
|
| @@ -98,6 +98,13 @@ Placeholders
|
| build.gn file.
|
| "//foo/bar/baz.txt" => "obj/foo/bar"
|
|
|
| + {{source_target_relative}}\n"
|
| + The path to the source file relative to the target's directory. This will
|
| + generally be used for replicating the source directory layout in the
|
| + output directory. This can only be used in actions and it is an error to
|
| + use in process_file_template where there is no "target".
|
| + "//foo/bar/baz.txt" => "baz.txt"
|
| +
|
| (*) Note on directories
|
|
|
| Paths containing directories (except the source_root_relative_dir) will be
|
| @@ -196,11 +203,12 @@ void SubstitutionWriter::GetListAsOutputFiles(
|
|
|
| // static
|
| SourceFile SubstitutionWriter::ApplyPatternToSource(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SubstitutionPattern& pattern,
|
| const SourceFile& source) {
|
| std::string result_value = ApplyPatternToSourceAsString(
|
| - settings, pattern, source);
|
| + target, settings, pattern, source);
|
| CHECK(!result_value.empty() && result_value[0] == '/')
|
| << "The result of the pattern \""
|
| << pattern.AsString()
|
| @@ -210,6 +218,7 @@ SourceFile SubstitutionWriter::ApplyPatternToSource(
|
|
|
| // static
|
| std::string SubstitutionWriter::ApplyPatternToSourceAsString(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SubstitutionPattern& pattern,
|
| const SourceFile& source) {
|
| @@ -219,7 +228,7 @@ std::string SubstitutionWriter::ApplyPatternToSourceAsString(
|
| result_value.append(subrange.literal);
|
| } else {
|
| result_value.append(
|
| - GetSourceSubstitution(settings, source, subrange.type,
|
| + GetSourceSubstitution(target, settings, source, subrange.type,
|
| OUTPUT_ABSOLUTE, SourceDir()));
|
| }
|
| }
|
| @@ -228,78 +237,89 @@ std::string SubstitutionWriter::ApplyPatternToSourceAsString(
|
|
|
| // static
|
| OutputFile SubstitutionWriter::ApplyPatternToSourceAsOutputFile(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SubstitutionPattern& pattern,
|
| const SourceFile& source) {
|
| - SourceFile result_as_source = ApplyPatternToSource(settings, pattern, source);
|
| + SourceFile result_as_source = ApplyPatternToSource(
|
| + target, settings, pattern, source);
|
| return OutputFile(settings->build_settings(), result_as_source);
|
| }
|
|
|
| // static
|
| void SubstitutionWriter::ApplyListToSource(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SubstitutionList& list,
|
| const SourceFile& source,
|
| std::vector<SourceFile>* output) {
|
| for (const auto& item : list.list())
|
| - output->push_back(ApplyPatternToSource(settings, item, source));
|
| + output->push_back(ApplyPatternToSource(target, settings, item, source));
|
| }
|
|
|
| // static
|
| void SubstitutionWriter::ApplyListToSourceAsString(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SubstitutionList& list,
|
| const SourceFile& source,
|
| std::vector<std::string>* output) {
|
| for (const auto& item : list.list())
|
| - output->push_back(ApplyPatternToSourceAsString(settings, item, source));
|
| + output->push_back(ApplyPatternToSourceAsString(
|
| + target, settings, item, source));
|
| }
|
|
|
| // static
|
| void SubstitutionWriter::ApplyListToSourceAsOutputFile(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SubstitutionList& list,
|
| const SourceFile& source,
|
| std::vector<OutputFile>* output) {
|
| for (const auto& item : list.list())
|
| - output->push_back(ApplyPatternToSourceAsOutputFile(settings, item, source));
|
| + output->push_back(ApplyPatternToSourceAsOutputFile(
|
| + target, settings, item, source));
|
| }
|
|
|
| // static
|
| void SubstitutionWriter::ApplyListToSources(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SubstitutionList& list,
|
| const std::vector<SourceFile>& sources,
|
| std::vector<SourceFile>* output) {
|
| output->clear();
|
| for (const auto& source : sources)
|
| - ApplyListToSource(settings, list, source, output);
|
| + ApplyListToSource(target, settings, list, source, output);
|
| }
|
|
|
| // static
|
| void SubstitutionWriter::ApplyListToSourcesAsString(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SubstitutionList& list,
|
| const std::vector<SourceFile>& sources,
|
| std::vector<std::string>* output) {
|
| output->clear();
|
| for (const auto& source : sources)
|
| - ApplyListToSourceAsString(settings, list, source, output);
|
| + ApplyListToSourceAsString(target, settings, list, source, output);
|
| }
|
|
|
| // static
|
| void SubstitutionWriter::ApplyListToSourcesAsOutputFile(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SubstitutionList& list,
|
| const std::vector<SourceFile>& sources,
|
| std::vector<OutputFile>* output) {
|
| output->clear();
|
| for (const auto& source : sources)
|
| - ApplyListToSourceAsOutputFile(settings, list, source, output);
|
| + ApplyListToSourceAsOutputFile(target, settings, list, source, output);
|
| }
|
|
|
| // static
|
| void SubstitutionWriter::WriteNinjaVariablesForSource(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SourceFile& source,
|
| const std::vector<SubstitutionType>& types,
|
| @@ -314,7 +334,8 @@ void SubstitutionWriter::WriteNinjaVariablesForSource(
|
| out << " " << kSubstitutionNinjaNames[type] << " = ";
|
| EscapeStringToStream(
|
| out,
|
| - GetSourceSubstitution(settings, source, type, OUTPUT_RELATIVE,
|
| + GetSourceSubstitution(target, settings, source, type,
|
| + OUTPUT_RELATIVE,
|
| settings->build_settings()->build_dir()),
|
| escape_options);
|
| out << std::endl;
|
| @@ -324,6 +345,7 @@ void SubstitutionWriter::WriteNinjaVariablesForSource(
|
|
|
| // static
|
| std::string SubstitutionWriter::GetSourceSubstitution(
|
| + const Target* target,
|
| const Settings* settings,
|
| const SourceFile& source,
|
| SubstitutionType type,
|
| @@ -366,6 +388,16 @@ std::string SubstitutionWriter::GetSourceSubstitution(
|
| BuildDirContext(settings), source.GetDir(), BuildDirType::OBJ));
|
| break;
|
|
|
| + case SUBSTITUTION_SOURCE_TARGET_RELATIVE:
|
| + if (target) {
|
| + return RebasePath(source.value(), target->label().dir(),
|
| + settings->build_settings()->root_path_utf8());
|
| + }
|
| + NOTREACHED()
|
| + << "Cannot use substitution " << kSubstitutionNames[type]
|
| + << " without target";
|
| + return std::string();
|
| +
|
| default:
|
| NOTREACHED()
|
| << "Unsupported substitution for this function: "
|
| @@ -502,7 +534,7 @@ std::string SubstitutionWriter::GetCompilerSubstitution(
|
|
|
| // Fall-through to the source ones.
|
| return GetSourceSubstitution(
|
| - target->settings(), source, type, OUTPUT_RELATIVE,
|
| + target, target->settings(), source, type, OUTPUT_RELATIVE,
|
| target->settings()->build_settings()->build_dir());
|
| }
|
|
|
|
|