Makefile $(命令)不工作但是`command`没有

时间:2013-03-31 12:44:50

标签: git makefile backticks

当我为我的项目编写Makefile时,当我需要检测当前分支名称时,在make规则中我这样做了:

check_branch:
    if [ "$(git rev-parse --abbrev-ref HEAD)" == "master" ]; then \
    echo "In master"
    else \
    echo "Not in master"; \
    fi

当我调用make check_branch时,“$(git rev-parse --abbrev-ref HEAD)”不起作用,它返回“”空字符串。 但是当我将 $()更改为``时,它完美地工作了。

check_branch:
    if [ "`git rev-parse --abbrev-ref HEAD`" == "master" ]; then \
    echo "In master"
    else \
    echo "Not in master"; \
    fi

为什么$()没有工作但是``呢?仅适用于“git”命令。

请注意,在我的Makefile中,我在许多规则中通常使用 $()

谢谢:)

2 个答案:

答案 0 :(得分:10)

在食谱中你必须逃避美元符号才能让它们被shell解释。否则,Make将$(git ...)视为内置命令或变量并尝试对其进行评估(当然,不成功)。

check_branch:
    if [ "$$(git rev-parse --abbrev-ref HEAD)" == "master" ]; then \
    ...

答案 1 :(得分:4)

在shell行中,您可以像在shell脚本中一样编写shell命令。这就是第二次操作有效的原因。

如果希望Make在shell外部评估git命令,可以将操作包含在shell函数中,如:

$(shell git rev-parse --abbrev-ref HEAD)

你应该好好去,虽然我经常实施这样的事情:

branch := $(shell git rev-parse --abbrev-ref HEAD)
target:dep
     mkdir -p build/$(branch)

或类似的东西。

相关问题