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)

这是当我调用make passing Target_A和当我调用它passing Target_B:时的输出

$ make Target_A
Path_b
Target_A
$ make Target_B
Path_b
Target_B

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

为什么不起作用?

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

Target_A: THE_PATH="Path_a"
Target_A:
@echo $(THE_PATH)

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


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

通常这就足够了,但如果你需要全局变量,你可以使用问题中的相同代码,条件改为:

ifneq ($(filter Target_A,$(MAKECMDGOALS)),)

$@(您尝试使用它(只在配方内部工作,并扩展到配方构建的目标名称。

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

只有当您要查找的目标被指定为命令行参数时,此选项才会起作用。

最新更新