summaryrefslogtreecommitdiffstats
path: root/src/ninja.cc
diff options
context:
space:
mode:
authortzik <mail@tzik.jp>2017-10-25 13:17:40 (GMT)
committertzik <mail@tzik.jp>2017-10-25 14:07:49 (GMT)
commit0b6be4353e4ee330e9b72228ba768b4f2cb56399 (patch)
tree4a2ca23cf7a422cd5c271c627cfc0fbd15dea98d /src/ninja.cc
parente234a7bdb6c42f4539c0ab09b624f191287c2c10 (diff)
downloadNinja-0b6be4353e4ee330e9b72228ba768b4f2cb56399.zip
Ninja-0b6be4353e4ee330e9b72228ba768b4f2cb56399.tar.gz
Ninja-0b6be4353e4ee330e9b72228ba768b4f2cb56399.tar.bz2
Look up header dependencies on the first-output build
Ninja has special syntax to specify the first output of the given node. E.g. it builds foo.o for foo.cc^. However, it doesn't work for headers, as headers usually doesn't appear in the regular dependency tree. After this change, Ninja looks up header dependencies from .ninja_deps to pick up a build target, so that it builds foo.o for foo.h^.
Diffstat (limited to 'src/ninja.cc')
-rw-r--r--src/ninja.cc21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/ninja.cc b/src/ninja.cc
index 30f89c2..3a7ebbc 100644
--- a/src/ninja.cc
+++ b/src/ninja.cc
@@ -282,15 +282,20 @@ Node* NinjaMain::CollectTarget(const char* cpath, string* err) {
if (node) {
if (first_dependent) {
if (node->out_edges().empty()) {
- *err = "'" + path + "' has no out edge";
- return NULL;
- }
- Edge* edge = node->out_edges()[0];
- if (edge->outputs_.empty()) {
- edge->Dump();
- Fatal("edge has no outputs");
+ Node* rev_deps = deps_log_.GetFirstReverseDepsNode(node);
+ if (!rev_deps) {
+ *err = "'" + path + "' has no out edge";
+ return NULL;
+ }
+ node = rev_deps;
+ } else {
+ Edge* edge = node->out_edges()[0];
+ if (edge->outputs_.empty()) {
+ edge->Dump();
+ Fatal("edge has no outputs");
+ }
+ node = edge->outputs_[0];
}
- node = edge->outputs_[0];
}
return node;
} else {