| 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 6aff197c5832c17d146b950ec3148c6cbc287820..8ebe6ff42e9280e07b0f7152edf14f3945b39a9d 100644
|
| --- a/tools/gn/ninja_action_target_writer.cc
|
| +++ b/tools/gn/ninja_action_target_writer.cc
|
| @@ -40,7 +40,7 @@ void NinjaActionTargetWriter::Run() {
|
| // build rule. This should probably be handled by WriteInputDepsStampAndGetDep
|
| // automatically if we supply a count of sources (so it can optimize based on
|
| // how many times things would be duplicated).
|
| - std::string implicit_deps = WriteInputDepsStampAndGetDep(extra_hard_deps);
|
| + OutputFile input_dep = WriteInputDepsStampAndGetDep(extra_hard_deps);
|
| out_ << std::endl;
|
|
|
| // Collects all output files for writing below.
|
| @@ -48,7 +48,7 @@ void NinjaActionTargetWriter::Run() {
|
|
|
| if (target_->output_type() == Target::ACTION_FOREACH) {
|
| // Write separate build lines for each input source file.
|
| - WriteSourceRules(custom_rule_name, implicit_deps, &output_files);
|
| + WriteSourceRules(custom_rule_name, input_dep, &output_files);
|
| } else {
|
| DCHECK(target_->output_type() == Target::ACTION);
|
|
|
| @@ -59,7 +59,14 @@ void NinjaActionTargetWriter::Run() {
|
| settings_, target_->action_values().outputs(), &output_files);
|
| path_output_.WriteFiles(out_, output_files);
|
|
|
| - out_ << ": " << custom_rule_name << implicit_deps << std::endl;
|
| + out_ << ": " << custom_rule_name;
|
| + if (!input_dep.value().empty()) {
|
| + // As in WriteSourceRules, we want to force this target to rebuild any
|
| + // time any of its dependencies change.
|
| + out_ << " | ";
|
| + path_output_.WriteFile(out_, input_dep);
|
| + }
|
| + out_ << std::endl;
|
| if (target_->action_values().has_depfile()) {
|
| out_ << " depfile = ";
|
| WriteDepfile(SourceFile());
|
| @@ -144,7 +151,7 @@ std::string NinjaActionTargetWriter::WriteRuleDefinition() {
|
|
|
| void NinjaActionTargetWriter::WriteSourceRules(
|
| const std::string& custom_rule_name,
|
| - const std::string& implicit_deps,
|
| + const OutputFile& input_dep,
|
| std::vector<OutputFile>* output_files) {
|
| EscapeOptions args_escape_options;
|
| args_escape_options.mode = ESCAPE_NINJA_COMMAND;
|
| @@ -162,7 +169,15 @@ void NinjaActionTargetWriter::WriteSourceRules(
|
|
|
| out_ << ": " << custom_rule_name << " ";
|
| path_output_.WriteFile(out_, sources[i]);
|
| - out_ << implicit_deps << std::endl;
|
| + if (!input_dep.value().empty()) {
|
| + // Using "|" for the dependencies forces all implicit dependencies to be
|
| + // fully up-to-date before running the action, and will re-run this
|
| + // action if any input dependencies change. This is important because
|
| + // this action may consume the outputs of previous steps.
|
| + out_ << " | ";
|
| + path_output_.WriteFile(out_, input_dep);
|
| + }
|
| + out_ << std::endl;
|
|
|
| // Windows needs a unique ID for the response file.
|
| if (target_->settings()->IsWin())
|
|
|