Makefile检查文件夹和/或文件是否存在

时间:2018-11-23 18:34:38

标签: makefile

我有以下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

我想念什么?

非常感谢任何建议

1 个答案:

答案 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"