From: Evan Martin Date: Mon, 18 Oct 2010 06:34:15 +0000 (-0700) Subject: wip simplistic shell implementation X-Git-Tag: release-120715~760 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=27b925a2efb51c4998d1d1a71690257a7ee830eb;p=platform%2Fupstream%2Fninja.git wip simplistic shell implementation --- diff --git a/ninja.cc b/ninja.cc index 5d00454..b5c1a59 100644 --- 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 --- 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() {}