Index: tools/gn/builder.cc |
diff --git a/tools/gn/builder.cc b/tools/gn/builder.cc |
index 93aec154fa6f4d7d2d091ae8fce324d70ffcfc02..bb3f834f6cb21970950f89cae1ae2821832e7556 100644 |
--- a/tools/gn/builder.cc |
+++ b/tools/gn/builder.cc |
@@ -404,9 +404,15 @@ bool Builder::AddToolchainDep(BuilderRecord* record, |
void Builder::RecursiveSetShouldGenerate(BuilderRecord* record, |
bool force) { |
- if (!force && record->should_generate()) |
- return; // Already set. |
- record->set_should_generate(true); |
+ if (!record->should_generate()) { |
+ record->set_should_generate(true); |
+ |
+ // This may have caused the item to go into "resolved and generated" state. |
+ if (record->resolved() && !resolved_and_generated_callback_.is_null()) |
+ resolved_and_generated_callback_.Run(record); |
+ } else if (!force) { |
+ return; // Already set and we're not required to iterate dependencies. |
+ } |
for (auto* cur : record->all_deps()) { |
if (!cur->should_generate()) { |
@@ -451,8 +457,8 @@ bool Builder::ResolveItem(BuilderRecord* record, Err* err) { |
if (!record->item()->OnResolved(err)) |
return false; |
- if (!resolved_callback_.is_null()) |
- resolved_callback_.Run(record); |
+ if (record->should_generate() && !resolved_and_generated_callback_.is_null()) |
+ resolved_and_generated_callback_.Run(record); |
// Recursively update everybody waiting on this item to be resolved. |
for (BuilderRecord* waiting : record->waiting_on_resolution()) { |