summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEvan Martin <martine@danga.com>2013-03-10 17:03:55 (GMT)
committerEvan Martin <martine@danga.com>2013-03-10 17:03:55 (GMT)
commita3bf38cac72303bf6a288c26ccc71b1ba9de2b47 (patch)
treeea488f106cfa81039ff1a735b0318d91586b7183 /src
parentdad0649d4ba0ee4a74ed15360801e7e11f251907 (diff)
parente99c493bc7a7d06cd0de91c3ac670315800e760b (diff)
downloadNinja-a3bf38cac72303bf6a288c26ccc71b1ba9de2b47.zip
Ninja-a3bf38cac72303bf6a288c26ccc71b1ba9de2b47.tar.gz
Ninja-a3bf38cac72303bf6a288c26ccc71b1ba9de2b47.tar.bz2
Merge pull request #512 from pcc/compilation-database
Add compdb tool
Diffstat (limited to 'src')
-rw-r--r--src/ninja.cc45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/ninja.cc b/src/ninja.cc
index cc43325..b24ac33 100644
--- a/src/ninja.cc
+++ b/src/ninja.cc
@@ -486,6 +486,49 @@ int ToolClean(Globals* globals, int argc, char* argv[]) {
}
}
+void EncodeJSONString(const char *str) {
+ while (*str) {
+ if (*str == '"' || *str == '\\')
+ putchar('\\');
+ putchar(*str);
+ str++;
+ }
+}
+
+int ToolCompilationDatabase(Globals* globals, int argc, char* argv[]) {
+ bool first = true;
+ char cwd[PATH_MAX];
+
+ if (!getcwd(cwd, PATH_MAX)) {
+ Error("cannot determine working directory: %s", strerror(errno));
+ return 1;
+ }
+
+ putchar('[');
+ for (vector<Edge*>::iterator e = globals->state->edges_.begin();
+ e != globals->state->edges_.end(); ++e) {
+ for (int i = 0; i != argc; ++i) {
+ if ((*e)->rule_->name() == argv[i]) {
+ if (!first)
+ putchar(',');
+
+ printf("\n {\n \"directory\": \"");
+ EncodeJSONString(cwd);
+ printf("\",\n \"command\": \"");
+ EncodeJSONString((*e)->EvaluateCommand().c_str());
+ printf("\",\n \"file\": \"");
+ EncodeJSONString((*e)->inputs_[0]->path().c_str());
+ printf("\"\n }");
+
+ first = false;
+ }
+ }
+ }
+
+ puts("\n]");
+ return 0;
+}
+
int ToolUrtle(Globals* globals, int argc, char** argv) {
// RLE encoded.
const char* urtle =
@@ -534,6 +577,8 @@ int ChooseTool(const string& tool_name, const Tool** tool_out) {
Tool::RUN_AFTER_LOAD, ToolQuery },
{ "targets", "list targets by their rule or depth in the DAG",
Tool::RUN_AFTER_LOAD, ToolTargets },
+ { "compdb", "dump JSON compilation database to stdout",
+ Tool::RUN_AFTER_LOAD, ToolCompilationDatabase },
{ "urtle", NULL,
Tool::RUN_AFTER_FLAGS, ToolUrtle },
{ NULL, NULL, Tool::RUN_AFTER_FLAGS, NULL }