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;