diff options
author | tzik <mail@tzik.jp> | 2017-10-25 13:17:40 (GMT) |
---|---|---|
committer | tzik <mail@tzik.jp> | 2017-10-25 14:07:49 (GMT) |
commit | 0b6be4353e4ee330e9b72228ba768b4f2cb56399 (patch) | |
tree | 4a2ca23cf7a422cd5c271c627cfc0fbd15dea98d /src/ninja.cc | |
parent | e234a7bdb6c42f4539c0ab09b624f191287c2c10 (diff) | |
download | Ninja-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.cc | 21 |
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 { |