Partially implement $(origin)
diff --git a/ast.go b/ast.go
index b8ee55c..8689b70 100644
--- a/ast.go
+++ b/ast.go
@@ -26,14 +26,13 @@
 func (ast *AssignAST) evalRHS(ev *Evaluator, lhs string) Var {
 	switch ast.op {
 	case ":=":
-		// TODO: origin
-		return SimpleVar{value: ev.evalExpr(ast.rhs)}
+		return SimpleVar{value: ev.evalExpr(ast.rhs), origin: "file"}
 	case "=":
-		return RecursiveVar{expr: ast.rhs}
+		return RecursiveVar{expr: ast.rhs, origin: "file"}
 	case "+=":
 		prev := ev.LookupVar(lhs)
 		if !prev.IsDefined() {
-			return RecursiveVar{expr: ast.rhs}
+			return RecursiveVar{expr: ast.rhs, origin: "file"}
 		}
 		return prev.Append(ev, ast.rhs)
 	case "?=":
@@ -41,7 +40,7 @@
 		if prev.IsDefined() {
 			return prev
 		}
-		return RecursiveVar{expr: ast.rhs}
+		return RecursiveVar{expr: ast.rhs, origin: "file"}
 	default:
 		panic(fmt.Sprintf("unknown assign op: %q", ast.op))
 	}
diff --git a/eval.go b/eval.go
index c27b7a9..0c75755 100644
--- a/eval.go
+++ b/eval.go
@@ -55,6 +55,7 @@
 			"foreach":    funcForeach,
 			"value":      funcValue,
 			"eval":       funcEval,
+			"origin":     funcOrigin,
 			"shell":      funcShell,
 			"call":       funcCall,
 			"flavor":     funcFlavor,
diff --git a/func.go b/func.go
index 3a6bc37..da17a31 100644
--- a/func.go
+++ b/func.go
@@ -382,6 +382,12 @@
 	return ""
 }
 
+// http://www.gnu.org/software/make/manual/make.html#Origin-Function
+func funcOrigin(ev *Evaluator, args []string) string {
+	v := ev.LookupVar(strings.Join(args, ","))
+	return v.Origin()
+}
+
 // http://www.gnu.org/software/make/manual/make.html#Shell-Function
 func funcShell(ev *Evaluator, args []string) string {
 	args = arity("shell", 1, args)
diff --git a/var.go b/var.go
index ebe1494..2973f91 100644
--- a/var.go
+++ b/var.go
@@ -50,7 +50,7 @@
 type UndefinedVar struct{}
 
 func (_ UndefinedVar) Flavor() string  { return "undefined" }
-func (_ UndefinedVar) Origin() string  { return "" }
+func (_ UndefinedVar) Origin() string  { return "undefined" }
 func (_ UndefinedVar) IsDefined() bool { return false }
 func (_ UndefinedVar) String() string  { return "" }
 func (_ UndefinedVar) Eval(ev *Evaluator) string {