From 27b925a2efb51c4998d1d1a71690257a7ee830eb Mon Sep 17 00:00:00 2001 From: Evan Martin Date: Sun, 17 Oct 2010 23:34:15 -0700 Subject: [PATCH] wip simplistic shell implementation --- ninja.cc | 14 ++++++++++++++ ninja.h | 18 +++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) 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() {} -- 2.7.4