aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bootstrap.go12
-rw-r--r--main.cc31
-rw-r--r--testcase/builtin_vars.mk1
-rw-r--r--testcase/flavor.mk1
4 files changed, 23 insertions, 22 deletions
diff --git a/bootstrap.go b/bootstrap.go
index 91cac40..cdacd8c 100644
--- a/bootstrap.go
+++ b/bootstrap.go
@@ -24,13 +24,13 @@ const bootstrapMakefileName = "*bootstrap*"
func bootstrapMakefile(targets []string) (makefile, error) {
bootstrap := `
-CC:=cc
-CXX:=g++
-AR:=ar
-MAKE:=kati
+CC?=cc
+CXX?=g++
+AR?=ar
+MAKE?=kati
# Pretend to be GNU make 3.81, for compatibility.
-MAKE_VERSION:=3.81
-SHELL:=/bin/sh
+MAKE_VERSION?=3.81
+SHELL=/bin/sh
# TODO: Add more builtin vars.
# http://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules
diff --git a/main.cc b/main.cc
index d3404fb..734b22a 100644
--- a/main.cc
+++ b/main.cc
@@ -179,17 +179,18 @@ static void Quit() {
static void ReadBootstrapMakefile(const vector<Symbol>& targets,
vector<AST*>* asts) {
string bootstrap = (
- "CC:=cc\n"
+ "CC?=cc\n"
#if defined(__APPLE__)
- "CXX:=c++\n"
+ "CXX?=c++\n"
#else
- "CXX:=g++\n"
+ "CXX?=g++\n"
#endif
- "AR:=ar\n"
- "MAKE:=kati\n"
+ "AR?=ar\n"
+ "MAKE?=kati\n"
// Pretend to be GNU make 3.81, for compatibility.
- "MAKE_VERSION:=3.81\n"
- "SHELL:=/bin/sh\n"
+ "MAKE_VERSION?=3.81\n"
+ // Overwrite $SHELL environment variable.
+ "SHELL=/bin/sh\n"
// TODO: Add more builtin vars.
// http://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules
@@ -223,14 +224,6 @@ static void SetVar(StringPiece l, VarOrigin origin, Vars* vars) {
}
extern "C" char** environ;
-static void FillDefaultVars(const vector<StringPiece>& cl_vars, Vars* vars) {
- for (char** p = environ; *p; p++) {
- SetVar(*p, VarOrigin::ENVIRONMENT, vars);
- }
- for (StringPiece l : cl_vars) {
- SetVar(l, VarOrigin::COMMAND_LINE, vars);
- }
-}
static int Run(const vector<Symbol>& targets,
const vector<StringPiece>& cl_vars,
@@ -256,7 +249,9 @@ static int Run(const vector<Symbol>& targets,
MakefileCacheManager* cache_mgr = NewMakefileCacheManager();
Vars* vars = new Vars();
- FillDefaultVars(cl_vars, vars);
+ for (char** p = environ; *p; p++) {
+ SetVar(*p, VarOrigin::ENVIRONMENT, vars);
+ }
Evaluator* ev = new Evaluator(vars);
vector<AST*> bootstrap_asts;
@@ -268,6 +263,10 @@ static int Run(const vector<Symbol>& targets,
}
ev->set_is_bootstrap(false);
+ for (StringPiece l : cl_vars) {
+ SetVar(l, VarOrigin::COMMAND_LINE, ev->mutable_vars());
+ }
+
vars->Assign(Intern("MAKEFILE_LIST"),
new SimpleVar(StringPrintf(" %s", g_makefile),
VarOrigin::FILE));
diff --git a/testcase/builtin_vars.mk b/testcase/builtin_vars.mk
index 455001b..1625c85 100644
--- a/testcase/builtin_vars.mk
+++ b/testcase/builtin_vars.mk
@@ -1,5 +1,6 @@
test:
echo $(CC)
echo $(CXX)
+ echo $(SHELL)
# TODO: Add more builtin vars.
diff --git a/testcase/flavor.mk b/testcase/flavor.mk
index 86a84d5..ee82a30 100644
--- a/testcase/flavor.mk
+++ b/testcase/flavor.mk
@@ -11,6 +11,7 @@ all:
echo $(flavor PATH)
echo $(flavor MAKEFILE_LIST)
echo $(flavor $(AREF))
+ echo $(flavor CC)
# For some reason, $(flavor MAKECMDGOALS) should be "undefined"
# echo $(flavor MAKECMDGOALS)