summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Despres <nicolas.despres@gmail.com>2011-04-10 16:18:31 (GMT)
committerNicolas Despres <nicolas.despres@gmail.com>2011-04-26 11:23:07 (GMT)
commit652345f7fccbc4f3db3700f576b4b5b8e0768fc2 (patch)
tree301b335a37ce628ff8a7e18268f5af2c886f2c49
parenta9c54d0413fd0a320d4df789183332ccad39b1db (diff)
downloadNinja-652345f7fccbc4f3db3700f576b4b5b8e0768fc2.zip
Ninja-652345f7fccbc4f3db3700f576b4b5b8e0768fc2.tar.gz
Ninja-652345f7fccbc4f3db3700f576b4b5b8e0768fc2.tar.bz2
graph: Assume all root nodes if no target given.
This way we can generate the complete graph.
-rw-r--r--manual.asciidoc3
-rw-r--r--src/ninja.cc26
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<Node*> root_nodes = state->RootNodes(&err);
+ if (err.empty()) {
+ for (vector<Node*>::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;