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;
 }
