diff options
author | Evan Martin <martine@danga.com> | 2013-03-10 17:03:55 (GMT) |
---|---|---|
committer | Evan Martin <martine@danga.com> | 2013-03-10 17:03:55 (GMT) |
commit | a3bf38cac72303bf6a288c26ccc71b1ba9de2b47 (patch) | |
tree | ea488f106cfa81039ff1a735b0318d91586b7183 /src/ninja.cc | |
parent | dad0649d4ba0ee4a74ed15360801e7e11f251907 (diff) | |
parent | e99c493bc7a7d06cd0de91c3ac670315800e760b (diff) | |
download | Ninja-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/ninja.cc')
-rw-r--r-- | src/ninja.cc | 45 |
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 } |