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 {