[swift] List all outputs as deps of "source_set" stamp file Since a swift target generates more than object files, and since some of those outputs are input dependencies for other .swift files, explicitly list them as part of the "source_set" stamp file dependencies. Also change NinjaBinaryTargetWriter::AddSourceSetFiles() to use the shared code from SwiftValues to compute the outputs instead of duplicating the effort (incorrectly). Bug: none Change-Id: I6e6c9091aaa34369fda20ba3cbae37df88454374 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/16880 Reviewed-by: David Turner <digit@google.com> Commit-Queue: Sylvain Defresne <sdefresne@chromium.org>
diff --git a/src/gn/ninja_binary_target_writer.cc b/src/gn/ninja_binary_target_writer.cc index b47c2e4..7dc6ea8 100644 --- a/src/gn/ninja_binary_target_writer.cc +++ b/src/gn/ninja_binary_target_writer.cc
@@ -206,12 +206,8 @@ // Swift files may generate one object file per module or one per source file // depending on how the compiler is invoked (whole module optimization). if (source_set->source_types_used().SwiftSourceUsed()) { - const Tool* tool = source_set->toolchain()->GetToolForSourceTypeAsC( - SourceFile::SOURCE_SWIFT); - std::vector<OutputFile> outputs; - SubstitutionWriter::ApplyListToLinkerAsOutputFile( - source_set, tool, tool->outputs(), &outputs); + source_set->swift_values().GetOutputs(source_set, &outputs); for (const OutputFile& output : outputs) { SourceFile output_as_source =
diff --git a/src/gn/ninja_c_binary_target_writer.cc b/src/gn/ninja_c_binary_target_writer.cc index 9b656bf..5e2be80 100644 --- a/src/gn/ninja_c_binary_target_writer.cc +++ b/src/gn/ninja_c_binary_target_writer.cc
@@ -195,12 +195,15 @@ // - GCC .gch files are not object files, therefore they are not added to the // object file list. std::vector<OutputFile> obj_files; + std::vector<OutputFile> extra_files; std::vector<SourceFile> other_files; + std::vector<OutputFile>* stamp_files = &obj_files; // default if (!target_->source_types_used().SwiftSourceUsed()) { WriteSources(*pch_files, input_deps, order_only_deps, module_dep_info, &obj_files, &other_files); } else { - WriteSwiftSources(input_deps, order_only_deps, &obj_files); + stamp_files = &extra_files; // Swift generates more than object files + WriteSwiftSources(input_deps, order_only_deps, &obj_files, &extra_files); } // Link all MSVC pch object files. The vector will be empty on GCC toolchains. @@ -209,7 +212,7 @@ return; if (target_->output_type() == Target::SOURCE_SET) { - WriteSourceSetStamp(obj_files); + WriteSourceSetStamp(*stamp_files); #ifndef NDEBUG // Verify that the function that separately computes a source set's object // files match the object files just computed. @@ -503,14 +506,13 @@ void NinjaCBinaryTargetWriter::WriteSwiftSources( const std::vector<OutputFile>& input_deps, const std::vector<OutputFile>& order_only_deps, - std::vector<OutputFile>* object_files) { + std::vector<OutputFile>* object_files, + std::vector<OutputFile>* output_files) { DCHECK(target_->builds_swift_module()); - - std::vector<OutputFile> outputs; - target_->swift_values().GetOutputs(target_, &outputs); + target_->swift_values().GetOutputs(target_, output_files); const BuildSettings* build_settings = settings_->build_settings(); - for (const OutputFile& output : outputs) { + for (const OutputFile& output : *output_files) { const SourceFile output_as_source = output.AsSourceFile(build_settings); if (output_as_source.IsObjectType()) { object_files->push_back(output); @@ -528,7 +530,8 @@ const Tool* tool = target_->swift_values().GetTool(target_); WriteCompilerBuildLine(target_->sources(), input_deps, - swift_order_only_deps.vector(), tool->name(), outputs, + swift_order_only_deps.vector(), tool->name(), + *output_files, /*can_write_source_info=*/false, /*restat_output_allowed=*/true);
diff --git a/src/gn/ninja_c_binary_target_writer.h b/src/gn/ninja_c_binary_target_writer.h index 17615cc..a50d8c9 100644 --- a/src/gn/ninja_c_binary_target_writer.h +++ b/src/gn/ninja_c_binary_target_writer.h
@@ -82,7 +82,8 @@ std::vector<SourceFile>* other_files); void WriteSwiftSources(const std::vector<OutputFile>& input_deps, const std::vector<OutputFile>& order_only_deps, - std::vector<OutputFile>* object_files); + std::vector<OutputFile>* object_files, + std::vector<OutputFile>* output_files); // Writes the stamp line for a source set. These are not linked. void WriteSourceSetStamp(const std::vector<OutputFile>& object_files);
diff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc index 3815ab4..9fb8ff3 100644 --- a/src/gn/ninja_c_binary_target_writer_unittest.cc +++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
@@ -2336,6 +2336,7 @@ " restat = 1\n" "\n" "build obj/foo/foo.stamp: stamp" + " gen/foo/foo.h obj/foo/Foo.swiftmodule" " obj/foo/file1.o obj/foo/file2.o\n"; const std::string out_str = out.str(); @@ -2372,7 +2373,8 @@ "../../bar/bar.swift || obj/foo/foo.stamp\n" " restat = 1\n" "\n" - "build obj/bar/bar.stamp: stamp obj/bar/bar.o " + "build obj/bar/bar.stamp: stamp" + " gen/bar/bar.h obj/bar/Bar.swiftmodule obj/bar/bar.o " "|| obj/foo/foo.stamp\n"; const std::string out_str = out.str(); @@ -2417,7 +2419,8 @@ "../../bar/bar.swift || obj/bar/group.stamp obj/foo/foo.stamp\n" " restat = 1\n" "\n" - "build obj/bar/bar.stamp: stamp obj/bar/bar.o " + "build obj/bar/bar.stamp: stamp" + " gen/bar/bar.h obj/bar/Bar.swiftmodule obj/bar/bar.o " "|| obj/bar/group.stamp obj/foo/foo.stamp\n"; const std::string out_str = out.str();