getopt for input file
authorEvan Martin <martine@danga.com>
Thu, 21 Oct 2010 15:16:07 +0000 (08:16 -0700)
committerEvan Martin <martine@danga.com>
Thu, 21 Oct 2010 15:19:33 +0000 (08:19 -0700)
ninja.cc

index 71af097..396d102 100644 (file)
--- a/ninja.cc
+++ b/ninja.cc
@@ -1,22 +1,53 @@
 #include "ninja.h"
 
+#include <getopt.h>
+
+option options[] = {
+  { "help", no_argument, NULL, 'h' },
+  { }
+};
+
+void usage() {
+  fprintf(stderr,
+"usage: ninja [options] target\n"
+"\n"
+"options:\n"
+"  -i FILE  specify input build file [default=build.ninja]\n"
+          );
+}
+
 int main(int argc, char** argv) {
+  const char* input_file = "build.ninja";
+
+  int opt;
+  while ((opt = getopt_long(argc, argv, "hi:", options, NULL)) != -1) {
+    switch (opt) {
+      case 'i':
+        input_file = optarg;
+        break;
+      case 'h':
+      default:
+        usage();
+        return 1;
+    }
+  }
+  if (optind >= argc) {
+    fprintf(stderr, "expected target to build\n");
+    usage();
+    return 1;
+  }
+
   State state;
   ManifestParser parser(&state);
   string err;
-  if (!parser.Load("build.ninja", &err)) {
+  if (!parser.Load(input_file, &err)) {
     fprintf(stderr, "error loading: %s\n", err.c_str());
     return 1;
   }
-
-  if (argc < 2) {
-    fprintf(stderr, "usage: %s target\n", argv[0]);
-    return 1;
-  }
-
   Shell shell;
   Builder builder(&state);
-  builder.AddTarget(argv[1]);
+  for (int i = optind; i < argc; ++i)
+    builder.AddTarget(argv[i]);
   state.stat_cache()->Dump();
 
   bool success = builder.Build(&shell, &err);