build: Propagate module dependencies through group targets This change ensures that C++ module dependencies are correctly propagated through `group` targets when using `public_deps`. Previously, `group` targets were not considered in `ComputeModuleDepsInformationFor`, leading to incomplete dependency resolution. A new unit test has been added to verify this functionality. This is to remove `alias` template in https://source.chromium.org/chromium/chromium/src/+/main:buildtools/third_party/libc++/modules.gni;l=79;drc=3296f9068c5d6ac4ac42124ee2338dc36443df8b Bug: 40440396 Change-Id: Ibb2e62af1a43df1223275176c8b204b0c359f299 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/19680 Reviewed-by: David Turner <digit@google.com> Reviewed-by: Matt Stark <msta@google.com> Commit-Queue: Takuto Ikuta <tikuta@google.com>
diff --git a/src/gn/resolved_target_data.cc b/src/gn/resolved_target_data.cc index 30433b0..201f655 100644 --- a/src/gn/resolved_target_data.cc +++ b/src/gn/resolved_target_data.cc
@@ -191,7 +191,8 @@ for (const Target* dep : deps) { if (dep->output_type() != Target::STATIC_LIBRARY && dep->output_type() != Target::SHARED_LIBRARY && - dep->output_type() != Target::SOURCE_SET) { + dep->output_type() != Target::SOURCE_SET && + dep->output_type() != Target::GROUP) { continue; }
diff --git a/src/gn/resolved_target_data_unittest.cc b/src/gn/resolved_target_data_unittest.cc index d4f60b4..92b965d 100644 --- a/src/gn/resolved_target_data_unittest.cc +++ b/src/gn/resolved_target_data_unittest.cc
@@ -408,3 +408,35 @@ EXPECT_EQ(&inter, exe_inherited[0].target()); EXPECT_EQ(&pub, exe_inherited[1].target()); } + +TEST(ResolvedTargetDataTest, ModuleDepsInheritance) { + TestWithScope setup; + Err err; + + // Create a dependency chain: + // A (executable) -> G (group) -> B (static_library) -> C (source_set) + TestTarget a(setup, "//foo:a", Target::EXECUTABLE); + TestTarget g(setup, "//foo:g", Target::GROUP); + TestTarget b(setup, "//foo:b", Target::STATIC_LIBRARY); + TestTarget c(setup, "//foo:c", Target::SOURCE_SET); + + c.sources().push_back(SourceFile("//foo/c.modulemap")); + c.source_types_used().Set(SourceFile::SOURCE_MODULEMAP); + + a.public_deps().push_back(LabelTargetPair(&g)); + g.public_deps().push_back(LabelTargetPair(&b)); + b.public_deps().push_back(LabelTargetPair(&c)); + + ASSERT_TRUE(c.OnResolved(&err)); + ASSERT_TRUE(b.OnResolved(&err)); + ASSERT_TRUE(g.OnResolved(&err)); + ASSERT_TRUE(a.OnResolved(&err)); + + ResolvedTargetData resolved; + + const auto& a_module_deps = resolved.GetModuleDepsInformation(&a); + ASSERT_EQ(3u, a_module_deps.size()); + EXPECT_EQ(&g, a_module_deps[0].target()); + EXPECT_EQ(&b, a_module_deps[1].target()); + EXPECT_EQ(&c, a_module_deps[2].target()); +}