Index: tools/gn/ninja_script_target_writer.cc |
diff --git a/tools/gn/ninja_script_target_writer.cc b/tools/gn/ninja_script_target_writer.cc |
index 55d8b922d4d6611e13dfcae1581052785eeb65b7..34913a38031de3391320ad0d98f2c026f1563056 100644 |
--- a/tools/gn/ninja_script_target_writer.cc |
+++ b/tools/gn/ninja_script_target_writer.cc |
@@ -21,26 +21,7 @@ NinjaScriptTargetWriter::~NinjaScriptTargetWriter() { |
void NinjaScriptTargetWriter::Run() { |
WriteEnvironment(); |
- // Run the script from the dir of the BUILD file. This has no trailing |
- // slash. |
- const SourceDir& script_cd = target_->label().dir(); |
- std::string script_cd_to_root = InvertDir(script_cd); |
- if (script_cd_to_root.empty()) { |
- script_cd_to_root = "."; |
- } else { |
- // Remove trailing slash. |
- DCHECK(script_cd_to_root[script_cd_to_root.size() - 1] == '/'); |
- script_cd_to_root.resize(script_cd_to_root.size() - 1); |
- } |
- |
- // Compute the relative script file name. The script string should start with |
- // 2 slashes, and we trim 1. |
- DCHECK(target_->script_values().script().is_source_absolute()); |
- std::string script_relative_to_cd = script_cd_to_root; |
- const std::string& script_string = target_->script_values().script().value(); |
- script_relative_to_cd.append(&script_string[1], script_string.size() - 1); |
- |
- std::string custom_rule_name = WriteRuleDefinition(script_relative_to_cd); |
+ std::string custom_rule_name = WriteRuleDefinition(); |
std::string implicit_deps = GetSourcesImplicitDeps(); |
// Collects all output files for writing below. |
@@ -48,8 +29,7 @@ void NinjaScriptTargetWriter::Run() { |
if (has_sources()) { |
// Write separate rules for each input source file. |
- WriteSourceRules(custom_rule_name, implicit_deps, script_cd, |
- script_cd_to_root, &output_files); |
+ WriteSourceRules(custom_rule_name, implicit_deps, &output_files); |
} else { |
// No sources, write a rule that invokes the script once with the |
// outputs as outputs, and the data as inputs. |
@@ -70,18 +50,17 @@ void NinjaScriptTargetWriter::Run() { |
WriteStamp(output_files); |
} |
-std::string NinjaScriptTargetWriter::WriteRuleDefinition( |
- const std::string& script_relative_to_cd) { |
+std::string NinjaScriptTargetWriter::WriteRuleDefinition() { |
// Make a unique name for this rule. |
+ // |
+ // Use a unique name for the response file when there are multiple build |
+ // steps so that they don't stomp on each other. When there are no sources, |
+ // there will be only one invocation so we can use a simple name. |
std::string target_label = target_->label().GetUserVisibleName(true); |
std::string custom_rule_name(target_label); |
ReplaceChars(custom_rule_name, ":/()", "_", &custom_rule_name); |
custom_rule_name.append("_rule"); |
- // Use a unique name for the response file when there are multiple build |
- // steps so that they don't stomp on each other. When there are no sources, |
- // there will be only one invocation so we can use a simple name. |
- |
if (settings_->IsWin()) { |
// Send through gyp-win-tool and use a response file. |
std::string rspfile = custom_rule_name; |
@@ -91,16 +70,14 @@ std::string NinjaScriptTargetWriter::WriteRuleDefinition( |
out_ << "rule " << custom_rule_name << std::endl; |
out_ << " command = $pythonpath gyp-win-tool action-wrapper $arch " |
- << rspfile << " "; |
- path_output_.WriteDir(out_, target_->label().dir(), |
- PathOutput::DIR_NO_LAST_SLASH); |
- out_ << std::endl; |
+ << rspfile << std::endl; |
out_ << " description = CUSTOM " << target_label << std::endl; |
out_ << " restat = 1" << std::endl; |
out_ << " rspfile = " << rspfile << std::endl; |
// The build command goes in the rsp file. |
- out_ << " rspfile_content = $pythonpath " << script_relative_to_cd; |
+ out_ << " rspfile_content = $pythonpath "; |
+ path_output_.WriteFile(out_, target_->script_values().script()); |
for (size_t i = 0; i < target_->script_values().args().size(); i++) { |
const std::string& arg = target_->script_values().args()[i]; |
out_ << " "; |
@@ -112,7 +89,8 @@ std::string NinjaScriptTargetWriter::WriteRuleDefinition( |
out_ << " command = cd "; |
path_output_.WriteDir(out_, target_->label().dir(), |
PathOutput::DIR_NO_LAST_SLASH); |
- out_ << "; $pythonpath " << script_relative_to_cd; |
+ out_ << "; $pythonpath "; |
+ path_output_.WriteFile(out_, target_->script_values().script()); |
for (size_t i = 0; i < target_->script_values().args().size(); i++) { |
const std::string& arg = target_->script_values().args()[i]; |
out_ << " "; |
@@ -145,8 +123,6 @@ void NinjaScriptTargetWriter::WriteArg(const std::string& arg) { |
void NinjaScriptTargetWriter::WriteSourceRules( |
const std::string& custom_rule_name, |
const std::string& implicit_deps, |
- const SourceDir& script_cd, |
- const std::string& script_cd_to_root, |
std::vector<OutputFile>* output_files) { |
// Construct the template for generating the output files from each source. |
const Target::FileList& outputs = target_->script_values().outputs(); |
@@ -162,9 +138,6 @@ void NinjaScriptTargetWriter::WriteSourceRules( |
// Prevent re-allocating each time by initializing outside the loop. |
std::vector<std::string> output_template_result; |
- // Path output formatter for wrigin source paths passed to the script. |
- PathOutput script_source_path_output(script_cd, ESCAPE_SHELL, true); |
- |
const Target::FileList& sources = target_->sources(); |
for (size_t i = 0; i < sources.size(); i++) { |
// Write outputs for this source file computed by the template. |
@@ -188,7 +161,7 @@ void NinjaScriptTargetWriter::WriteSourceRules( |
// OutputFile object by putting a non-output-relative path in it to signal |
// that the PathWriter should not prepend directories. |
out_ << " source = "; |
- script_source_path_output.WriteFile(out_, sources[i]); |
+ path_output_.WriteFile(out_, sources[i]); |
out_ << std::endl; |
out_ << " source_name_part = " |