Fix missing public_inputs in the action's own inputs dependency When a target defines `public_inputs`, those files should be treated as inputs of the target itself. Otherwise, the action won't rebuild when the public inputs change. Bug: 531579666 Change-Id: Ia247e5bd7a683ad69953b11611a92f82ff2b6ff4 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/23860 Reviewed-by: David Turner <digit@google.com> Reviewed-by: Junji Watanabe <jwata@google.com> Commit-Queue: Takuto Ikuta <tikuta@google.com>
diff --git a/src/gn/ninja_target_writer.cc b/src/gn/ninja_target_writer.cc index abdbffc..4f3e80d 100644 --- a/src/gn/ninja_target_writer.cc +++ b/src/gn/ninja_target_writer.cc
@@ -581,6 +581,10 @@ InputDeps deps; // Inherited public_inputs target dependencies. std::vector<OutputFile> public_inputs_deps; + if (!target_->public_inputs().empty()) { + public_inputs_deps.push_back( + GetPublicInputsOutputFile(target_, settings_->build_settings())); + } for (const auto& pair : target_->public_deps()) { if (resolved().ExportsPublicInputs(pair.ptr)) { public_inputs_deps.push_back(
diff --git a/src/gn/ninja_target_writer_unittest.cc b/src/gn/ninja_target_writer_unittest.cc index c4fdbd8..ac5b154 100644 --- a/src/gn/ninja_target_writer_unittest.cc +++ b/src/gn/ninja_target_writer_unittest.cc
@@ -696,4 +696,19 @@ << out; EXPECT_TRUE(out.find("../../foo/a.in") == std::string::npos) << out; } + + // 3. Verify A's own action build definition includes its public_inputs. + { + std::ostringstream stream; + // B's target needs output defined, let's configure A as well + a.action_values().outputs() = + SubstitutionList::MakeForTest("//out/Debug/a.out"); + NinjaActionTargetWriter writer(&a, stream); + writer.Run(); + std::string out = stream.str(); + // out should contain "phony/foo/a.public_inputs" as an input dependency + // instead of "../../foo/a.in". + EXPECT_TRUE(out.contains("phony/foo/a.public_inputs")) << out; + EXPECT_FALSE(out.contains("../../foo/a.in")) << out; + } }