| Index: tools/gn/ninja_action_target_writer.cc
|
| diff --git a/tools/gn/ninja_action_target_writer.cc b/tools/gn/ninja_action_target_writer.cc
|
| index e2440a49c869548e1ccf18c53d96379c725a70ff..d0edc34ff1c502dc86a3e83781bcb19a535e4f1f 100644
|
| --- a/tools/gn/ninja_action_target_writer.cc
|
| +++ b/tools/gn/ninja_action_target_writer.cc
|
| @@ -105,52 +105,42 @@ std::string NinjaActionTargetWriter::WriteRuleDefinition() {
|
| EscapeOptions args_escape_options;
|
| args_escape_options.mode = ESCAPE_NINJA_COMMAND;
|
|
|
| - if (settings_->IsWin()) {
|
| - // Send through gyp-win-tool and use a response file.
|
| + out_ << "rule " << custom_rule_name << std::endl;
|
| +
|
| + if (target_->action_values().uses_rsp_file()) {
|
| + // Needs a response file. The unique_name part is for action_foreach so
|
| + // each invocation of the rule gets a different response file. This isn't
|
| + // strictly necessary for regular one-shot actions, but it's easier to
|
| + // just always define unique_name.
|
| std::string rspfile = custom_rule_name;
|
| if (!target_->sources().empty())
|
| rspfile += ".$unique_name";
|
| rspfile += ".rsp";
|
| -
|
| - out_ << "rule " << custom_rule_name << std::endl;
|
| - out_ << " command = ";
|
| - path_output_.WriteFile(out_, settings_->build_settings()->python_path());
|
| - // TODO(brettw) this hardcodes "environment.x86" which is something that
|
| - // the Chrome Windows toolchain writes. We should have a way to invoke
|
| - // python without requiring this gyp_win_tool thing.
|
| - out_ << " gyp-win-tool action-wrapper environment.x86 " << rspfile
|
| - << std::endl;
|
| - out_ << " description = ACTION " << 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 = ";
|
| - path_output_.WriteFile(out_, settings_->build_settings()->python_path());
|
| - out_ << " ";
|
| - path_output_.WriteFile(out_, target_->action_values().script());
|
| - for (const auto& arg : args.list()) {
|
| + // Response file contents.
|
| + out_ << " rspfile_content =";
|
| + for (const auto& arg :
|
| + target_->action_values().rsp_file_contents().list()) {
|
| out_ << " ";
|
| SubstitutionWriter::WriteWithNinjaVariables(
|
| arg, args_escape_options, out_);
|
| }
|
| out_ << std::endl;
|
| - } else {
|
| - // Posix can execute Python directly.
|
| - out_ << "rule " << custom_rule_name << std::endl;
|
| - out_ << " command = ";
|
| - path_output_.WriteFile(out_, settings_->build_settings()->python_path());
|
| + }
|
| +
|
| + out_ << " command = ";
|
| + path_output_.WriteFile(out_, settings_->build_settings()->python_path());
|
| + out_ << " ";
|
| + path_output_.WriteFile(out_, target_->action_values().script());
|
| + for (const auto& arg : args.list()) {
|
| out_ << " ";
|
| - path_output_.WriteFile(out_, target_->action_values().script());
|
| - for (const auto& arg : args.list()) {
|
| - out_ << " ";
|
| - SubstitutionWriter::WriteWithNinjaVariables(
|
| - arg, args_escape_options, out_);
|
| - }
|
| - out_ << std::endl;
|
| - out_ << " description = ACTION " << target_label << std::endl;
|
| - out_ << " restat = 1" << std::endl;
|
| + SubstitutionWriter::WriteWithNinjaVariables(
|
| + arg, args_escape_options, out_);
|
| }
|
| + out_ << std::endl;
|
| + out_ << " description = ACTION " << target_label << std::endl;
|
| + out_ << " restat = 1" << std::endl;
|
|
|
| return custom_rule_name;
|
| }
|
| @@ -165,9 +155,6 @@ void NinjaActionTargetWriter::WriteSourceRules(
|
| // they will get pasted into the real command line.
|
| args_escape_options.inhibit_quoting = true;
|
|
|
| - const std::vector<SubstitutionType>& args_substitutions_used =
|
| - target_->action_values().args().required_types();
|
| -
|
| const Target::FileList& sources = target_->sources();
|
| for (size_t i = 0; i < sources.size(); i++) {
|
| out_ << "build";
|
| @@ -185,12 +172,22 @@ void NinjaActionTargetWriter::WriteSourceRules(
|
| }
|
| out_ << std::endl;
|
|
|
| - // Windows needs a unique ID for the response file.
|
| - if (target_->settings()->IsWin())
|
| + // Response files require a unique name be defined.
|
| + if (target_->action_values().uses_rsp_file())
|
| out_ << " unique_name = " << i << std::endl;
|
|
|
| + // The required types is the union of the args and response file. This
|
| + // might theoretically duplicate a definition if the same substitution is
|
| + // used in both the args and the reponse file. However, this should be
|
| + // very unusual (normally the substitutions will go in one place or the
|
| + // other) and the redundant assignment won't bother Ninja.
|
| + SubstitutionWriter::WriteNinjaVariablesForSource(
|
| + settings_, sources[i],
|
| + target_->action_values().args().required_types(),
|
| + args_escape_options, out_);
|
| SubstitutionWriter::WriteNinjaVariablesForSource(
|
| - settings_, sources[i], args_substitutions_used,
|
| + settings_, sources[i],
|
| + target_->action_values().rsp_file_contents().required_types(),
|
| args_escape_options, out_);
|
|
|
| if (target_->action_values().has_depfile()) {
|
|
|