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());
+}