Very naive implementation of include
diff --git a/eval.go b/eval.go
index 040995a..acaf588 100644
--- a/eval.go
+++ b/eval.go
@@ -31,11 +31,11 @@
 	lineno   int
 }
 
-func newEvaluator() *Evaluator {
+func newEvaluator(vars map[string]string) *Evaluator {
 	return &Evaluator{
 		outVars: make(map[string]string),
 		refs:    make(map[string]bool),
-		vars:    make(map[string]string),
+		vars:    vars,
 		funcs: map[string]Func{
 			"wildcard": funcWildcard,
 			"shell":    funcShell,
@@ -153,12 +153,56 @@
 	}
 }
 
+func (ev *Evaluator) getVars() map[string]string {
+	vars := make(map[string]string)
+	for k, v := range ev.vars {
+		vars[k] = v
+	}
+	for k, v := range ev.outVars {
+		vars[k] = v
+	}
+	return vars
+}
+
+func (ev *Evaluator) evalInclude(ast *IncludeAST) {
+	ev.filename = ast.filename
+	ev.lineno = ast.lineno
+
+	// TODO: Handle glob
+	files := strings.Split(ev.evalExpr(ast.expr), " ")
+	for _, file := range files {
+		mk, err := ParseMakefile(file)
+		if err != nil {
+			if ast.op == "include" {
+				panic(err)
+			} else {
+				continue
+			}
+		}
+
+		er, err2 := Eval(mk, ev.getVars())
+		if err2 != nil {
+			panic(err2)
+		}
+
+		for k, v := range er.vars {
+			ev.outVars[k] = v
+		}
+		for _, r := range er.rules {
+			ev.outRules = append(ev.outRules, r)
+		}
+		for r, _ := range er.refs {
+			ev.refs[r] = true
+		}
+	}
+}
+
 func (ev *Evaluator) eval(ast AST) {
 	ast.eval(ev)
 }
 
-func Eval(mk Makefile) (er *EvalResult, err error) {
-	ev := newEvaluator()
+func Eval(mk Makefile, vars map[string]string) (er *EvalResult, err error) {
+	ev := newEvaluator(vars)
 	defer func() {
 		if r := recover(); r != nil {
 			err = fmt.Errorf("panic: %v", r)