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;
}
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() {}