Pass location of build.ninja file to browse script
authorColin Cross <ccross@android.com>
Mon, 7 Mar 2016 21:37:11 +0000 (13:37 -0800)
committerColin Cross <ccross@android.com>
Tue, 19 Apr 2016 20:34:16 +0000 (13:34 -0700)
Pass the value of -f to the browse python script so it can be passed
back to ninja -t query.

src/browse.cc
src/browse.h
src/browse.py
src/ninja.cc

index 46434d7..14900f8 100644 (file)
@@ -22,7 +22,7 @@
 #include "build/browse_py.h"
 
 void RunBrowsePython(State* state, const char* ninja_command,
-                     int argc, char* argv[]) {
+                     const char* input_file, int argc, char* argv[]) {
   // Fork off a Python process and have it run our code via its stdin.
   // (Actually the Python process becomes the parent.)
   int pipefd[2];
@@ -50,6 +50,8 @@ void RunBrowsePython(State* state, const char* ninja_command,
       command.push_back("-");
       command.push_back("--ninja-command");
       command.push_back(ninja_command);
+      command.push_back("-f");
+      command.push_back(input_file);
       for (int i = 0; i < argc; i++) {
           command.push_back(argv[i]);
       }
index 842c6ff..8d6d285 100644 (file)
@@ -23,6 +23,6 @@ struct State;
 /// \a argv are arguments to be passed to the Python script.
 /// This function does not return if it runs successfully.
 void RunBrowsePython(State* state, const char* ninja_command,
-                     int argc, char* argv[]);
+                     const char* input_file, int argc, char* argv[]);
 
 #endif  // NINJA_BROWSE_H_
index 63c60aa..32792f3 100755 (executable)
@@ -150,8 +150,8 @@ def generate_html(node):
     return '\n'.join(document)
 
 def ninja_dump(target):
-    proc = subprocess.Popen([args.ninja_command, '-t', 'query', target],
-                            stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+    cmd = [args.ninja_command, '-f', args.f, '-t', 'query', target]
+    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                             universal_newlines=True)
     return proc.communicate() + (proc.returncode,)
 
@@ -194,6 +194,8 @@ parser.add_argument('--no-browser', action='store_true',
 
 parser.add_argument('--ninja-command', default='ninja',
     help='Path to ninja binary (default %(default)s)')
+parser.add_argument('-f', default='build.ninja',
+    help='Path to build.ninja file (default %(default)s)')
 parser.add_argument('initial_target', default='all', nargs='?',
     help='Initial target to show (default %(default)s)')
 
index b3b9bed..25eafe8 100644 (file)
@@ -97,7 +97,7 @@ struct NinjaMain : public BuildLogUser {
   DepsLog deps_log_;
 
   /// The type of functions that are the entry points to tools (subcommands).
-  typedef int (NinjaMain::*ToolFunc)(int, char**);
+  typedef int (NinjaMain::*ToolFunc)(const Options*, int, char**);
 
   /// Get the Node for a given command-line path, handling features like
   /// spell correction.
@@ -108,17 +108,17 @@ struct NinjaMain : public BuildLogUser {
                               vector<Node*>* targets, string* err);
 
   // The various subcommands, run via "-t XXX".
-  int ToolGraph(int argc, char* argv[]);
-  int ToolQuery(int argc, char* argv[]);
-  int ToolDeps(int argc, char* argv[]);
-  int ToolBrowse(int argc, char* argv[]);
-  int ToolMSVC(int argc, char* argv[]);
-  int ToolTargets(int argc, char* argv[]);
-  int ToolCommands(int argc, char* argv[]);
-  int ToolClean(int argc, char* argv[]);
-  int ToolCompilationDatabase(int argc, char* argv[]);
-  int ToolRecompact(int argc, char* argv[]);
-  int ToolUrtle(int argc, char** argv);
+  int ToolGraph(const Options* options, int argc, char* argv[]);
+  int ToolQuery(const Options* options, int argc, char* argv[]);
+  int ToolDeps(const Options* options, int argc, char* argv[]);
+  int ToolBrowse(const Options* options, int argc, char* argv[]);
+  int ToolMSVC(const Options* options, int argc, char* argv[]);
+  int ToolTargets(const Options* options, int argc, char* argv[]);
+  int ToolCommands(const Options* options, int argc, char* argv[]);
+  int ToolClean(const Options* options, int argc, char* argv[]);
+  int ToolCompilationDatabase(const Options* options, int argc, char* argv[]);
+  int ToolRecompact(const Options* options, int argc, char* argv[]);
+  int ToolUrtle(const Options* options, int argc, char** argv);
 
   /// Open the build log.
   /// @return false on error.
@@ -314,7 +314,7 @@ bool NinjaMain::CollectTargetsFromArgs(int argc, char* argv[],
   return true;
 }
 
-int NinjaMain::ToolGraph(int argc, char* argv[]) {
+int NinjaMain::ToolGraph(const Options* options, int argc, char* argv[]) {
   vector<Node*> nodes;
   string err;
   if (!CollectTargetsFromArgs(argc, argv, &nodes, &err)) {
@@ -331,7 +331,7 @@ int NinjaMain::ToolGraph(int argc, char* argv[]) {
   return 0;
 }
 
-int NinjaMain::ToolQuery(int argc, char* argv[]) {
+int NinjaMain::ToolQuery(const Options* options, int argc, char* argv[]) {
   if (argc == 0) {
     Error("expected a target to query");
     return 1;
@@ -370,15 +370,15 @@ int NinjaMain::ToolQuery(int argc, char* argv[]) {
 }
 
 #if defined(NINJA_HAVE_BROWSE)
-int NinjaMain::ToolBrowse(int argc, char* argv[]) {
-  RunBrowsePython(&state_, ninja_command_, argc, argv);
+int NinjaMain::ToolBrowse(const Options* options, int argc, char* argv[]) {
+  RunBrowsePython(&state_, ninja_command_, options->input_file, argc, argv);
   // If we get here, the browse failed.
   return 1;
 }
 #endif  // _WIN32
 
 #if defined(_MSC_VER)
-int NinjaMain::ToolMSVC(int argc, char* argv[]) {
+int NinjaMain::ToolMSVC(const Options* options, int argc, char* argv[]) {
   // Reset getopt: push one argument onto the front of argv, reset optind.
   argc++;
   argv--;
@@ -453,7 +453,7 @@ int ToolTargetsList(State* state) {
   return 0;
 }
 
-int NinjaMain::ToolDeps(int argc, char** argv) {
+int NinjaMain::ToolDeps(const Options* options, int argc, char** argv) {
   vector<Node*> nodes;
   if (argc == 0) {
     for (vector<Node*>::const_iterator ni = deps_log_.nodes().begin();
@@ -493,7 +493,7 @@ int NinjaMain::ToolDeps(int argc, char** argv) {
   return 0;
 }
 
-int NinjaMain::ToolTargets(int argc, char* argv[]) {
+int NinjaMain::ToolTargets(const Options* options, int argc, char* argv[]) {
   int depth = 1;
   if (argc >= 1) {
     string mode = argv[0];
@@ -547,7 +547,7 @@ void PrintCommands(Edge* edge, set<Edge*>* seen) {
     puts(edge->EvaluateCommand().c_str());
 }
 
-int NinjaMain::ToolCommands(int argc, char* argv[]) {
+int NinjaMain::ToolCommands(const Options* options, int argc, char* argv[]) {
   vector<Node*> nodes;
   string err;
   if (!CollectTargetsFromArgs(argc, argv, &nodes, &err)) {
@@ -562,7 +562,7 @@ int NinjaMain::ToolCommands(int argc, char* argv[]) {
   return 0;
 }
 
-int NinjaMain::ToolClean(int argc, char* argv[]) {
+int NinjaMain::ToolClean(const Options* options, int argc, char* argv[]) {
   // The clean tool uses getopt, and expects argv[0] to contain the name of
   // the tool, i.e. "clean".
   argc++;
@@ -620,7 +620,7 @@ void EncodeJSONString(const char *str) {
   }
 }
 
-int NinjaMain::ToolCompilationDatabase(int argc, char* argv[]) {
+int NinjaMain::ToolCompilationDatabase(const Options* options, int argc, char* argv[]) {
   bool first = true;
   vector<char> cwd;
 
@@ -660,7 +660,7 @@ int NinjaMain::ToolCompilationDatabase(int argc, char* argv[]) {
   return 0;
 }
 
-int NinjaMain::ToolRecompact(int argc, char* argv[]) {
+int NinjaMain::ToolRecompact(const Options* options, int argc, char* argv[]) {
   if (!EnsureBuildDirExists())
     return 1;
 
@@ -671,7 +671,7 @@ int NinjaMain::ToolRecompact(int argc, char* argv[]) {
   return 0;
 }
 
-int NinjaMain::ToolUrtle(int argc, char** argv) {
+int NinjaMain::ToolUrtle(const Options* options, int argc, char** argv) {
   // RLE encoded.
   const char* urtle =
 " 13 ,3;2!2;\n8 ,;<11!;\n5 `'<10!(2`'2!\n11 ,6;, `\\. `\\9 .,c13$ec,.\n6 "
@@ -1097,7 +1097,7 @@ int real_main(int argc, char** argv) {
     // None of the RUN_AFTER_FLAGS actually use a NinjaMain, but it's needed
     // by other tools.
     NinjaMain ninja(ninja_command, config);
-    return (ninja.*options.tool->func)(argc, argv);
+    return (ninja.*options.tool->func)(&options, argc, argv);
   }
 
   // Limit number of rebuilds, to prevent infinite loops.
@@ -1116,7 +1116,7 @@ int real_main(int argc, char** argv) {
     }
 
     if (options.tool && options.tool->when == Tool::RUN_AFTER_LOAD)
-      return (ninja.*options.tool->func)(argc, argv);
+      return (ninja.*options.tool->func)(&options, argc, argv);
 
     if (!ninja.EnsureBuildDirExists())
       return 1;
@@ -1125,7 +1125,7 @@ int real_main(int argc, char** argv) {
       return 1;
 
     if (options.tool && options.tool->when == Tool::RUN_AFTER_LOGS)
-      return (ninja.*options.tool->func)(argc, argv);
+      return (ninja.*options.tool->func)(&options, argc, argv);
 
     // Attempt to rebuild the manifest before building anything else
     if (ninja.RebuildManifest(options.input_file, &err)) {