Include your own modulemap files in module_deps_no_self. The reason for the existence of module_deps_no_self is to ensure you don't depend upon the PCM that you're generating at this very moment. But the same issue doesn't apply to the modulemap file, and it is neccesary for the layering check. Bug: b:500845363 Change-Id: I90b97445e96bea008587d6dd907679dc6a6a6964 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/21800 Reviewed-by: Takuto Ikuta <tikuta@google.com> Commit-Queue: Matt Stark <msta@google.com>
diff --git a/src/gn/compile_commands_writer.cc b/src/gn/compile_commands_writer.cc index 2ec76a8..f5f55f9 100644 --- a/src/gn/compile_commands_writer.cc +++ b/src/gn/compile_commands_writer.cc
@@ -106,16 +106,14 @@ if (!module_dep_info.empty()) { std::ostringstream module_deps_out; for (const auto& module_dep : module_dep_info) { - module_dep.Write(module_deps_out, path_output); + module_dep.Write(module_deps_out, path_output, true); } base::EscapeJSONString(module_deps_out.str(), false, &flags.clang_module_deps); std::ostringstream module_deps_no_self_out; for (const auto& module_dep : module_dep_info) { - if (!module_dep.is_self) { - module_dep.Write(module_deps_no_self_out, path_output); - } + module_dep.Write(module_deps_no_self_out, path_output, false); } base::EscapeJSONString(module_deps_no_self_out.str(), false, &flags.clang_module_deps_no_self);
diff --git a/src/gn/compile_commands_writer_unittest.cc b/src/gn/compile_commands_writer_unittest.cc index 0011f84..8069d0f 100644 --- a/src/gn/compile_commands_writer_unittest.cc +++ b/src/gn/compile_commands_writer_unittest.cc
@@ -671,7 +671,8 @@ " {\r\n" " \"file\": \"../../foo/foo.modulemap\",\r\n" " \"directory\": \"out/Debug\",\r\n" - " \"command\": \"c++ ../../foo/foo.modulemap " + " \"command\": \"c++ ../../foo/foo.modulemap " + "-fmodule-map-file=../../foo/foo.modulemap " "-fmodule-name=//foo:module(//toolchain:withmodules) -c -x c++ -Xclang " "-emit-module -o " "withmodules/obj/foo/module.foo.pcm\"\r\n" @@ -692,7 +693,8 @@ " {\n" " \"file\": \"../../foo/foo.modulemap\",\n" " \"directory\": \"out/Debug\",\n" - " \"command\": \"c++ ../../foo/foo.modulemap " + " \"command\": \"c++ ../../foo/foo.modulemap " + "-fmodule-map-file=../../foo/foo.modulemap " "-fmodule-name=//foo:module(//toolchain:withmodules) -c -x c++ -Xclang " "-emit-module -o " "withmodules/obj/foo/module.foo.pcm\"\n"
diff --git a/src/gn/ninja_c_binary_target_writer.cc b/src/gn/ninja_c_binary_target_writer.cc index 64f4ee9..9a9e834 100644 --- a/src/gn/ninja_c_binary_target_writer.cc +++ b/src/gn/ninja_c_binary_target_writer.cc
@@ -212,9 +212,7 @@ out_ << substitution->ninja_name << " ="; for (const auto& module_dep : module_dep_info) { - if (!module_dep.is_self || include_self) { - module_dep.Write(out_, path_output_); - } + module_dep.Write(out_, path_output_, include_self); } out_ << std::endl;
diff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc index dae7692..ccda8f9 100644 --- a/src/gn/ninja_c_binary_target_writer_unittest.cc +++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
@@ -2590,7 +2590,7 @@ cflags_cc = cc_module_name = blah_a module_deps = -fmodule-map-file=../../blah/a.modulemap -fmodule-file=blah_a=obj/blah/liba.a.pcm -module_deps_no_self = +module_deps_no_self = -fmodule-map-file=../../blah/a.modulemap root_out_dir = withmodules target_out_dir = obj/blah target_output_name = liba @@ -2639,7 +2639,7 @@ cflags_cc = cc_module_name = //stuff$:b(//toolchain$:default) module_deps = -fmodule-map-file=../../stuff/b.modulemap -fmodule-file=//stuff:b(//toolchain:default)=obj/stuff/libb.b.pcm -fmodule-map-file=../../blah/a.modulemap -fmodule-file=blah_a=obj/blah/liba.a.pcm -module_deps_no_self = -fmodule-map-file=../../blah/a.modulemap -fmodule-file=blah_a=obj/blah/liba.a.pcm +module_deps_no_self = -fmodule-map-file=../../stuff/b.modulemap -fmodule-map-file=../../blah/a.modulemap -fmodule-file=blah_a=obj/blah/liba.a.pcm root_out_dir = withmodules target_out_dir = obj/stuff target_output_name = libb @@ -2686,7 +2686,7 @@ cflags_cc = cc_module_name = //things$:c module_deps = -fmodule-map-file=../../stuff/b.modulemap -fmodule-file=//stuff:b(//toolchain:default)=obj/stuff/libb.b.pcm -fmodule-map-file=../../stuff/c.modulemap -fmodule-file=//things:c=obj/stuff/libc.c.pcm -fmodule-map-file=../../blah/a.modulemap -fmodule-file=blah_a=obj/blah/liba.a.pcm -module_deps_no_self = -fmodule-map-file=../../stuff/b.modulemap -fmodule-file=//stuff:b(//toolchain:default)=obj/stuff/libb.b.pcm -fmodule-map-file=../../blah/a.modulemap -fmodule-file=blah_a=obj/blah/liba.a.pcm +module_deps_no_self = -fmodule-map-file=../../stuff/b.modulemap -fmodule-file=//stuff:b(//toolchain:default)=obj/stuff/libb.b.pcm -fmodule-map-file=../../stuff/c.modulemap -fmodule-map-file=../../blah/a.modulemap -fmodule-file=blah_a=obj/blah/liba.a.pcm root_out_dir = withmodules target_out_dir = obj/things target_output_name = libc
diff --git a/src/gn/ninja_module_writer_util.cc b/src/gn/ninja_module_writer_util.cc index 7c8b0ca..3fc6a2e 100644 --- a/src/gn/ninja_module_writer_util.cc +++ b/src/gn/ninja_module_writer_util.cc
@@ -80,12 +80,12 @@ } void ClangModuleDep::Write(std::ostream& out, - const PathOutput& path_output) const { + const PathOutput& path_output, bool include_self) const { if (modulemap) { out << " -fmodule-map-file="; path_output.WriteFile(out, *modulemap); } - if (pcm) { + if (pcm && (include_self || !is_self)) { out << " -fmodule-file=" << module_name << "="; path_output.WriteFile(out, *pcm); }
diff --git a/src/gn/ninja_module_writer_util.h b/src/gn/ninja_module_writer_util.h index 911a98f..8239ac8 100644 --- a/src/gn/ninja_module_writer_util.h +++ b/src/gn/ninja_module_writer_util.h
@@ -25,7 +25,7 @@ std::strong_ordering operator<=>(const ClangModuleDep& other) const; bool operator==(const ClangModuleDep& other) const = default; - void Write(std::ostream& out, const PathOutput& path_output) const; + void Write(std::ostream& out, const PathOutput& path_output, bool include_self) const; // The input module.modulemap source file. const SourceFile* modulemap;