我正在使用GNU Make 3.80。在我的Makefile中,我使用自动变量$ @来引用当前目标。
@echo current target is ... [$@]
ifeq ($@,sms)
@echo yep, they are equal
else
@echo no, they are not equal
endif
似乎$ @扩展为短信,如下面的输出所示。
输出是:
current target is ... [sms]
no, they are not equal
我的问题:因为$ @(显然)扩展为sms,不应该执行ifeq条件的“true”分支(结果是输出应该读取,它们是相等的)? [我不知道为什么输出不是,它们不相等。]
答案 0 :(得分:4)
10.5.3自动变量 ... 你认识到这一点非常重要 自动范围有限 变量值可用:它们 只有配方中的值。 ...... GNU有一个特殊功能 制造,二次扩张(见 二级扩展),这将允许 要使用的自动变量值 在先决条件清单中。
也就是说,$@
只能在包含命令的部分内部用于构建目标,并且在先决条件列表中有一些限制。
但是,您可以使用shell命令在用于构建目标的命令列表中实现条件:
@echo current target is ... [$@]
if [[ "$@" == "sms" ]]; then \
echo yep, they are equal; \
else \
echo no, they are not equal; \
fi
另外,如果要检查命令行中指定的目标,请使用MAKECMDGOALS变量。