我有以下Makefile:
build: clean
${GOPATH}/bin/dep ensure
env GOOS=linux go build -o ./bin/status ./lib/status/main.go
elm-app build
init:
${GOPATH}/bin/dep init -v
test:
env GOOS=linux go test -v ./lib/status
strip:
strip ./bin/status
clean:
if [ -f ./bin/status ]; then
rm -f ./bin/status
fi
但我知道
if [ -f ./bin/status ]; then
/bin/sh: 1: Syntax error: end of file unexpected
Makefile:16: recipe for target 'clean' failed
make: *** [clean] Error 2
我想念什么?
非常感谢任何建议
答案 0 :(得分:2)
makefile的每一行都在单独的shell中运行。这意味着您的规则在这里:
clean:
if [ -f ./bin/status ]; then
rm -f ./bin/status
fi
实际上运行以下命令:
/bin/sh -c "if [ -f ./bin/status ]; then"
/bin/sh -c "rm -f ./bin/status"
/bin/sh -c "fi"
您可以看到收到此消息的原因。为了确保所有行都发送到单个外壳中,您需要使用反斜杠来继续以下行:
clean:
if [ -f ./bin/status ]; then \
rm -f ./bin/status; \
fi
请注意,这意味着您还需要在rm
命令后加上分号,以便将其与结尾的fi
分开。
现在,您将得到如下的shell调用:
/bin/sh -c "if [ -f ./bin/status ]; then \
rm -f ./bin/status; \
fi"