Implement $(SHELL)
diff --git a/exec.go b/exec.go
index 2092cb3..15a9b24 100644
--- a/exec.go
+++ b/exec.go
@@ -15,6 +15,7 @@
implicitRules []*Rule
suffixRules map[string][]*Rule
firstRule *Rule
+ shell string
// target -> timestamp
done map[string]int64
@@ -59,10 +60,11 @@
echo bool
dryRun bool
ignoreError bool
+ shell string
}
-func evalCmd(ev *Evaluator, r runner, s string) []runner {
- r = newRunner(r, s)
+func evalCmd(ev *Evaluator, r runner, s string, shell string) []runner {
+ r = newRunner(r, s, shell)
if strings.IndexByte(r.cmd, '$') < 0 {
// fast path
return []runner{r}
@@ -70,12 +72,13 @@
cmds := ev.evalExpr(r.cmd)
var runners []runner
for _, cmd := range strings.Split(cmds, "\n") {
- runners = append(runners, newRunner(r, cmd))
+ runners = append(runners, newRunner(r, cmd, shell))
}
return runners
}
-func newRunner(r runner, s string) runner {
+func newRunner(r runner, s string, shell string) runner {
+ r.shell = shell
for {
s = strings.TrimLeft(s, " \t")
if s == "" {
@@ -106,7 +109,7 @@
if r.dryRun {
return nil
}
- args := []string{"/bin/sh", "-c", r.cmd}
+ args := []string{r.shell, "-c", r.cmd}
cmd := exec.Cmd{
Path: args[0],
Args: args,
@@ -315,7 +318,7 @@
dryRun: dryRunFlag,
}
for _, cmd := range rule.cmds {
- runners = append(runners, evalCmd(ev, r, cmd)...)
+ runners = append(runners, evalCmd(ev, r, cmd, ex.shell)...)
}
for _, r := range runners {
err := r.run()
@@ -445,6 +448,11 @@
}
func (ex *Executor) exec(er *EvalResult, targets []string, vars *VarTab) error {
+ // TODO: We should move this to somewhere around evalCmd so that
+ // we can handle SHELL in target specific variables.
+ shellVar := vars.Lookup("SHELL")
+ ex.shell = shellVar.String()
+
ex.populateRules(er)
if len(targets) == 0 {
diff --git a/func.go b/func.go
index 1f404e1..73dd8da 100644
--- a/func.go
+++ b/func.go
@@ -547,7 +547,9 @@
func (f *funcShell) Eval(w io.Writer, ev *Evaluator) {
assertArity("shell", 1, len(f.args))
arg := ev.Value(f.args[0])
- cmdline := []string{"/bin/sh", "-c", string(arg)}
+ shellVar := ev.LookupVar("SHELL")
+ // TODO: Should be Eval, not String.
+ cmdline := []string{shellVar.String(), "-c", string(arg)}
cmd := exec.Cmd{
Path: cmdline[0],
Args: cmdline,
diff --git a/main.go b/main.go
index 6ab0aff..3470909 100644
--- a/main.go
+++ b/main.go
@@ -46,6 +46,7 @@
MAKE:=kati
# Pretend to be GNU make 3.81, for compatibility.
MAKE_VERSION:=3.81
+SHELL:=/bin/sh
# TODO: Add more builtin vars.
# http://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules