Create a global function table
diff --git a/eval.go b/eval.go
index 282f58d..a55093e 100644
--- a/eval.go
+++ b/eval.go
@@ -17,54 +17,56 @@
 	vars     *VarTab
 	lastRule *Rule
 
-	funcs map[string]Func
-
 	filename string
 	lineno   int
 }
 
+var makeFuncTable map[string]Func
+
+func InitMakeFuncTable() {
+	makeFuncTable = map[string]Func{
+		"subst":      funcSubst,
+		"patsubst":   funcPatsubst,
+		"strip":      funcStrip,
+		"findstring": funcFindstring,
+		"filter":     funcFilter,
+		"filter-out": funcFilterOut,
+		"sort":       funcSort,
+		"word":       funcWord,
+		"wordlist":   funcWordlist,
+		"words":      funcWords,
+		"firstword":  funcFirstword,
+		"lastword":   funcLastword,
+		"join":       funcJoin,
+		"wildcard":   funcWildcard,
+		"dir":        funcDir,
+		"notdir":     funcNotdir,
+		"suffix":     funcSuffix,
+		"basename":   funcBasename,
+		"addsuffix":  funcAddsuffix,
+		"addprefix":  funcAddprefix,
+		"realpath":   funcRealpath,
+		"abspath":    funcAbspath,
+		"if":         funcIf,
+		"and":        funcAnd,
+		"or":         funcOr,
+		"foreach":    funcForeach,
+		"value":      funcValue,
+		"eval":       funcEval,
+		"origin":     funcOrigin,
+		"shell":      funcShell,
+		"call":       funcCall,
+		"flavor":     funcFlavor,
+		"info":       funcInfo,
+		"warning":    funcWarning,
+		"error":      funcError,
+	}
+}
+
 func newEvaluator(vars *VarTab) *Evaluator {
 	return &Evaluator{
 		outVars: NewVarTab(nil),
 		vars:    vars,
-		// TODO(ukai): use singleton global func tab?
-		funcs: map[string]Func{
-			"subst":      funcSubst,
-			"patsubst":   funcPatsubst,
-			"strip":      funcStrip,
-			"findstring": funcFindstring,
-			"filter":     funcFilter,
-			"filter-out": funcFilterOut,
-			"sort":       funcSort,
-			"word":       funcWord,
-			"wordlist":   funcWordlist,
-			"words":      funcWords,
-			"firstword":  funcFirstword,
-			"lastword":   funcLastword,
-			"join":       funcJoin,
-			"wildcard":   funcWildcard,
-			"dir":        funcDir,
-			"notdir":     funcNotdir,
-			"suffix":     funcSuffix,
-			"basename":   funcBasename,
-			"addsuffix":  funcAddsuffix,
-			"addprefix":  funcAddprefix,
-			"realpath":   funcRealpath,
-			"abspath":    funcAbspath,
-			"if":         funcIf,
-			"and":        funcAnd,
-			"or":         funcOr,
-			"foreach":    funcForeach,
-			"value":      funcValue,
-			"eval":       funcEval,
-			"origin":     funcOrigin,
-			"shell":      funcShell,
-			"call":       funcCall,
-			"flavor":     funcFlavor,
-			"info":       funcInfo,
-			"warning":    funcWarning,
-			"error":      funcError,
-		},
 	}
 }
 
@@ -78,7 +80,7 @@
 	}
 	cmd := strings.TrimSpace(args[0][:i])
 	args[0] = strings.TrimLeft(args[0][i+1:], " \t")
-	if f, ok := ev.funcs[cmd]; ok {
+	if f, ok := makeFuncTable[cmd]; ok {
 		return f(ev, args), true
 	}
 	return "", false
diff --git a/main.go b/main.go
index cf97860..b97f8e6 100644
--- a/main.go
+++ b/main.go
@@ -78,6 +78,8 @@
 
 	clvars, targets := parseCommandLine()
 
+	InitMakeFuncTable()
+
 	bmk := getBootstrapMakefile(targets)
 
 	var mk Makefile