[C++] Fix envvar.mk
diff --git a/log.h b/log.h
index e1afe44..000d8db 100644
--- a/log.h
+++ b/log.h
@@ -6,32 +6,27 @@
#include <stdlib.h>
#include <string.h>
-#define LOG(args...) do { \
- char log_buf[999]; \
- sprintf(log_buf, args); \
- fprintf(stderr, "*kati*: %s\n", log_buf); \
+#include "stringprintf.h"
+
+#define LOG(args...) do { \
+ fprintf(stderr, "*kati*: %s\n", StringPrintf(args).c_str()); \
} while(0)
-#define PERROR(...) do { \
- char log_buf[999]; \
- sprintf(log_buf, __VA_ARGS__); \
- fprintf(stderr, "%s: %s\n", log_buf, strerror(errno)); \
+#define PERROR(...) do { \
+ fprintf(stderr, "%s: %s\n", StringPrintf(__VA_ARGS__).c_str(), \
+ strerror(errno)); \
+ exit(1); \
+ } while (0)
+
+#define WARN(...) do { \
+ fprintf(stderr, "%s\n", StringPrintf(__VA_ARGS__).c_str()); \
+ } while (0)
+
+#define ERROR(...) do { \
+ fprintf(stderr, "%s\n", StringPrintf(__VA_ARGS__).c_str()); \
exit(1); \
} while (0)
-#define WARN(...) do { \
- char log_buf[999]; \
- sprintf(log_buf, __VA_ARGS__); \
- fprintf(stderr, "%s\n", log_buf); \
- } while (0)
-
-#define ERROR(...) do { \
- char log_buf[999]; \
- sprintf(log_buf, __VA_ARGS__); \
- fprintf(stderr, "%s\n", log_buf); \
- exit(1); \
- } while (0)
-
#define CHECK(c) if (!(c)) ERROR("%s:%d: %s", __FILE__, __LINE__, #c)
#endif // LOG_H_
diff --git a/main.cc b/main.cc
index 1a5e0cf..000fd28 100644
--- a/main.cc
+++ b/main.cc
@@ -21,7 +21,8 @@
static const char* g_makefile;
static void ParseCommandLine(int argc, char* argv[],
- vector<StringPiece>* targets) {
+ vector<StringPiece>* targets,
+ vector<StringPiece>* cl_vars) {
for (int i = 1; i < argc; i++) {
const char* arg = argv[i];
if (!strcmp(arg, "-f")) {
@@ -29,7 +30,11 @@
} else if (arg[0] == '-') {
ERROR("Unknown flag: %s", arg);
} else {
- targets->push_back(Intern(arg));
+ if (strchr(arg, '=')) {
+ cl_vars->push_back(arg);
+ } else {
+ targets->push_back(Intern(arg));
+ }
}
}
}
@@ -93,11 +98,30 @@
Parse(Intern(bootstrap), Loc("*bootstrap*", 0), asts);
}
-static int Run(const vector<StringPiece>& targets) {
+static void SetVar(StringPiece l, const char* origin, Vars* vars) {
+ size_t found = l.find('=');
+ CHECK(found != string::npos);
+ StringPiece lhs = Intern(l.substr(0, found));
+ StringPiece rhs = l.substr(found + 1);
+ vars->Assign(lhs, new RecursiveVar(NewLiteral(rhs.data()), origin));
+}
+
+extern "C" char** environ;
+static void FillDefaultVars(const vector<StringPiece>& cl_vars, Vars* vars) {
+ for (char** p = environ; *p; p++) {
+ SetVar(*p, "environment", vars);
+ }
+ for (StringPiece l : cl_vars) {
+ SetVar(l, "command line", vars);
+ }
+}
+
+static int Run(const vector<StringPiece>& targets,
+ const vector<StringPiece>& cl_vars) {
MakefileCacheManager* cache_mgr = NewMakefileCacheManager();
- // TODO: Fill env, etc.
Vars* vars = new Vars();
+ FillDefaultVars(cl_vars, vars);
Evaluator* ev = new Evaluator(vars);
vector<AST*> bootstrap_asts;
@@ -133,14 +157,15 @@
delete vars;
delete cache_mgr;
- return mk != 0;
+ return mk == 0;
}
int main(int argc, char* argv[]) {
Init();
vector<StringPiece> targets;
- ParseCommandLine(argc, argv, &targets);
- int r = Run(targets);
+ vector<StringPiece> cl_vars;
+ ParseCommandLine(argc, argv, &targets, &cl_vars);
+ int r = Run(targets, cl_vars);
Quit();
return r;
}