Delay expansion of command specific variables such as $@
diff --git a/eval.go b/eval.go
index c3dfd96..a07be29 100644
--- a/eval.go
+++ b/eval.go
@@ -70,8 +70,9 @@
var varname string
switch ex[i] {
- case '@':
- buf.WriteString(ev.curRule.output)
+ case '@', '$':
+ buf.WriteByte('$')
+ buf.WriteByte(ex[i])
i++
continue
case '(', '{':
@@ -104,7 +105,7 @@
return buf.String(), i
}
-func (ev *Evaluator) evalExpr(ex string) string {
+func (ev *Evaluator) evalExprCommand(ex string) string {
r, i := ev.evalExprSlice(ex)
if len(ex) != i {
panic(fmt.Sprintf("Had a null character? %q, %d", ex, i))
@@ -112,6 +113,39 @@
return r
}
+func expandCommandVars(cmd string, output string) string {
+ // Fast path.
+ if strings.IndexByte(cmd, '$') < 0 {
+ return cmd
+ }
+
+ var buf bytes.Buffer
+ i := 0
+ for i < len(cmd) {
+ ch := cmd[i]
+ i++
+ if ch != '$' || i >= len(cmd) {
+ buf.WriteByte(ch)
+ continue
+ }
+ switch cmd[i] {
+ case '@':
+ buf.WriteString(output)
+ case '$':
+ buf.WriteByte('$')
+ default:
+ panic(fmt.Sprintf("TODO: not implemented yet: $%c", cmd[i]))
+ }
+ i++
+ }
+ return buf.String()
+}
+
+func (ev *Evaluator) evalExpr(ex string) string {
+ ex = ev.evalExprCommand(ex)
+ return expandCommandVars(ex, "")
+}
+
func (ev *Evaluator) evalAssign(ast *AssignAST) {
ev.filename = ast.filename
ev.lineno = ast.lineno
@@ -144,7 +178,7 @@
var cmds []string
for _, cmd := range ast.cmds {
- cmds = append(cmds, ev.evalExpr(cmd))
+ cmds = append(cmds, ev.evalExprCommand(cmd))
}
// TODO: Pretty print.
diff --git a/exec.go b/exec.go
index 4180ca8..f9b14a8 100644
--- a/exec.go
+++ b/exec.go
@@ -27,8 +27,9 @@
return st.ModTime().Unix()
}
-func (ex *Executor) runCommands(cmds []string) error {
+func (ex *Executor) runCommands(cmds []string, output string) error {
for _, cmd := range cmds {
+ cmd = expandCommandVars(cmd, output)
fmt.Printf("%s\n", cmd)
args := []string{"/bin/sh", "-c", cmd}
@@ -80,7 +81,7 @@
return outputTs, nil
}
- err := ex.runCommands(rule.cmds)
+ err := ex.runCommands(rule.cmds, output)
if err != nil {
return outputTs, err
}
diff --git a/test/recipe_var.mk b/test/recipe_var.mk
new file mode 100644
index 0000000..6ea33e0
--- /dev/null
+++ b/test/recipe_var.mk
@@ -0,0 +1,4 @@
+foo=FAIL
+
+$$:
+ echo "$@"