Move runtime_deps file for phony targets to /obj For targets that use phony aliases, we generate a dependency_output in the PHONY BuildDir. Since this doesn't actually create any files, the "phony" directory is never actually generated. However, when the caller requests runtime_deps files to be written, the phony target path was being used to generate the runtime_deps file name. This resulted in out/phony/foo/bar.runtime_deps being generated. This CL fixes the runtime_deps file path for phony targets to be in the OBJ BuildDir. Change-Id: I3ac9fcc2597241b1bb4ce85cf8c57ad2a1b1e24c Reviewed-on: https://gn-review.googlesource.com/c/gn/+/10181 Commit-Queue: Petr Hosek <phosek@google.com> Reviewed-by: Brett Wilson <brettw@chromium.org>
diff --git a/docs/reference.md b/docs/reference.md index 7438d9c..93cba60 100644 --- a/docs/reference.md +++ b/docs/reference.md
@@ -2658,7 +2658,7 @@ process_file_template"). source sets and groups: this will return a list containing the path of the - "stamp" file that Ninja will produce once all outputs are generated. This + phony target that Ninja completes once all outputs are generated. This probably isn't very useful. ```
diff --git a/src/gn/runtime_deps.cc b/src/gn/runtime_deps.cc index d002458..1213c35 100644 --- a/src/gn/runtime_deps.cc +++ b/src/gn/runtime_deps.cc
@@ -185,9 +185,15 @@ CHECK(!target->computed_outputs().empty()); output_file = OutputFile(target->computed_outputs()[0].value() + extension); - } else if (target->dependency_output_file_or_phony()) { - output_file = OutputFile( - target->dependency_output_file_or_phony()->value() + extension); + } else if (target->dependency_output_file()) { + output_file = + OutputFile(target->dependency_output_file()->value() + extension); + } else if (target->dependency_output_phony()) { + // If the dependency is a phony target, there is no file to add an additional + // extension to, so we should compute our own name in the OBJ BuildDir. + output_file = GetBuildDirForTargetAsOutputFile(target, BuildDirType::OBJ); + output_file->value().append(target->GetComputedOutputName()); + output_file->value().append(extension); } if (output_file) files_to_write->push_back(std::make_pair(*output_file, target));
diff --git a/src/gn/switches.cc b/src/gn/switches.cc index abbc0e4..2b42e13 100644 --- a/src/gn/switches.cc +++ b/src/gn/switches.cc
@@ -198,10 +198,12 @@ an output file "bar.so", GN will create a file "bar.so.runtime_deps" in the build directory. - If a source set, action, copy, or group is listed, the runtime deps file will - correspond to the phony alias rule corresponding to that target. This is - probably not useful; the use-case for this feature is generally executable - targets. + For targets that don't generate an output file (such as source set, action, + copy or group), the runtime deps file will be in the output directory where an + output file would have been located. For example, the source_set target + "//foo:bar" would result in a runtime dependency file being written to + "<output_dir>/obj/foo/bar.runtime_deps". This is probably not useful; the + use-case for this feature is generally executable targets. The runtime dependency file will list one file per line, with no escaping. The files will be relative to the root_build_dir. The first line of the file