Makefile 目标名称与字符串的比较

Dan*_*Dan 2 makefile

在 makefile 中,我尝试将目标名称与字符串进行比较,并根据此设置带有字符串或其他变量的变量。这个例子说明了我正在尝试做的事情:

ifeq ($@,"Target_A")
 THE_PATH="Path_a"
 THE_TARGET=$@
else
 THE_PATH="Path_b"
 THE_TARGET=$@
endif

Target_A:
    @echo $(THE_PATH)
    @echo $(THE_TARGET)

Target_B:
    @echo $(THE_PATH)
    @echo $(THE_TARGET)
Run Code Online (Sandbox Code Playgroud)

这是我调用 make 传递 Target_A 和调用它传递 Target_B 时的输出:

$ make Target_A
Path_b
Target_A

$ make Target_B
Path_b
Target_B
Run Code Online (Sandbox Code Playgroud)

事实上,我总是得到“Path_b”,这表明 ifeq 的计算结果始终为 false,但您可以看到 $@ 包含正确的字符串。

为什么这不起作用?

Hol*_*Cat 5

您可能需要特定于目标的变量:

Target_A: THE_PATH="Path_a"
Target_A:
    @echo $(THE_PATH)
Run Code Online (Sandbox Code Playgroud)

由于(常规)变量的内容在每次使用时都会扩展,因此THE_TARGET=$@可以使其成为全局变量。


特定于目标的变量只能在它们所属的目标及其依赖项中访问。

通常这已经足够了,但是如果您需要全局变量,您可以使用问题中的相同代码,并将条件更改为:

ifneq ($(filter Target_A,$(MAKECMDGOALS)),)
Run Code Online (Sandbox Code Playgroud)

$@(您尝试使用的)仅在配方内部起作用,并扩展为配方构建的目标名称。

$(MAKECMDGOALS)是一个全局变量,包含调用时指定的所有目标(作为命令行参数)make

仅当您要查找的目标被指定为命令行参数时,此选项才有效。