wip simplistic shell implementation
authorEvan Martin <martine@danga.com>
Mon, 18 Oct 2010 06:34:15 +0000 (23:34 -0700)
committerEvan Martin <martine@danga.com>
Mon, 18 Oct 2010 06:36:31 +0000 (23:36 -0700)
ninja.cc
ninja.h

index 5d00454..b5c1a59 100644 (file)
--- a/ninja.cc
+++ b/ninja.cc
@@ -8,5 +8,19 @@ int main(int argc, char** argv) {
     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]);
+  if (!builder.Build(&shell, &err)) {
+    printf("%s\n", err.c_str());
+    return 1;
+  }
+
   return 0;
 }
diff --git a/ninja.h b/ninja.h
index b98ba4f..126cfb9 100644 (file)
--- a/ninja.h
+++ b/ninja.h
@@ -326,9 +326,25 @@ void Plan::NodeFinished(Node* node) {
 
 struct Shell {
   virtual ~Shell() {}
-  virtual bool RunCommand(Edge* edge) = 0;
+  virtual bool RunCommand(Edge* edge);
 };
 
+bool Shell::RunCommand(Edge* edge) {
+  string err;
+  string command = edge->EvaluateCommand();
+  printf("  %s\n", command.c_str());
+  int ret = system(command.c_str());
+  if (WIFEXITED(ret)) {
+    int exit = WEXITSTATUS(ret);
+    if (exit == 0)
+      return true;
+    err = "nonzero exit status";
+  } else {
+    err = "something else went wrong";
+  }
+  return false;
+}
+
 struct Builder {
   Builder(State* state) : plan_(state) {}
   virtual ~Builder() {}