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

phn*_*nah 7 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
Run Code Online (Sandbox Code Playgroud)

当我调用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
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢 :)

Eld*_*mov 10

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

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


小智 5

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

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

$(shell git rev-parse --abbrev-ref HEAD)
Run Code Online (Sandbox Code Playgroud)

你应该很高兴去,尽管我经常将这种事情实现为:

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

或类似的规定。