From 652345f7fccbc4f3db3700f576b4b5b8e0768fc2 Mon Sep 17 00:00:00 2001 From: Nicolas Despres Date: Sun, 10 Apr 2011 18:18:31 +0200 Subject: graph: Assume all root nodes if no target given. This way we can generate the complete graph. --- manual.asciidoc | 3 ++- src/ninja.cc | 26 ++++++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/manual.asciidoc b/manual.asciidoc index 7ea3da8..cf7b2c8 100644 --- a/manual.asciidoc +++ b/manual.asciidoc @@ -311,7 +311,8 @@ feature requires a Python installation. `graph`:: output a file in the syntax used by `graphviz`, a automatic graph layout tool. Use it like: +ninja -t graph _target_ | dot -Tpng -ograph.png /dev/stdin+ . In the Ninja source tree, `ninja graph` -generates an image for Ninja itself. +generates an image for Ninja itself. If no target is given generate a +graph for all root targets. `targets`:: output a list of targets either by rule or by depth. If used like this +ninja -t targets rule _name_+ it prints the list of targets diff --git a/src/ninja.cc b/src/ninja.cc index 5a0c00d..c4f78ab 100644 --- a/src/ninja.cc +++ b/src/ninja.cc @@ -106,14 +106,28 @@ int CmdGraph(State* state, int argc, char* argv[]) { int status = 0; GraphViz graph; graph.Start(); - for (int i = 0; i < argc; ++i) { - Node* node = state->LookupNode(argv[i]); - if (node) - graph.AddTarget(node); - else { - Error("unknown target '%s'", argv[i]); + if (argc == 0) { + string err; + vector root_nodes = state->RootNodes(&err); + if (err.empty()) { + for (vector::const_iterator n = root_nodes.begin(); + n != root_nodes.end(); + ++n) + graph.AddTarget(*n); + } else { + Error("%s", err.c_str()); status = 1; } + } else { + for (int i = 0; i < argc; ++i) { + Node* node = state->LookupNode(argv[i]); + if (node) + graph.AddTarget(node); + else { + Error("unknown target '%s'", argv[i]); + status = 1; + } + } } graph.Finish(); return status; -- cgit v0.12