我有一些基于某些变量存在的灵活的Makefile,可以使用ifdef
来检查它们。有点烦人的是我必须在命令行上实际设置变量等于某个东西。 make all DEBUG
不会触发ifdef
但make all DEBUG=1
会触发{{1}}。也许我只是使用不属于它的C预处理器方法。
Q1)是否可以在命令行上指定一个变量为空?没有更多的人物? Q2)make的这种布尔参数的首选方法是什么?
答案 0 :(得分:3)
我认为你的意思是make all DEBUG=
,对吗?如果没有=
make,则会将DEBUG
视为要构建的目标,而不是变量赋值。
手册指定具有非空值的变量会导致ifdef
返回true。不存在或存在但包含空字符串的变量会导致ifdef
返回false。注意ifdef
不会展开变量,只是测试变量是否有任何值。
您可以使用$(origin ...)
函数来测试变量是否真的没有定义,或者是否已定义但是为空,如下所示:
ifeq ($(origin DEBUG),undefined)
$(info Variable DEBUG is not defined)
else
$(info Variable DEBUG is defined)
endif
答案 1 :(得分:1)
正如@MadScientist在几分钟前解释的那样,
make all DEBUG
为您的品牌添加目标DEBUG
。幸运的是,有一个解决方法:
ifneq (,$(filter DEBUG,$(MAKECMDGOALS)))
DEBUG:=1 # or do whatever you want
DEBUG: all; @echo -n
endif
必须向虚拟目标提供虚拟规则(例如,如上所述,不回显)。并将此语句放在makefile的底部,或者在示例中明确指定先决条件目标。否则,make
可能错误地选择 DEBUG 目标 全部。
请注意,这不是首选方法;惯例就像使用V=1
来启用回声。
另一个警告是make
按顺序处理命令行目标,例如make A B
将首先处理 A 目标,然后处理 B 目标,无论这些目标是独立的还是依赖于另一个目标。因此,撰写make DEBUG PERFECT
和make PERFECT DEBUG
会产生不同的结果。但参数的顺序无关紧要,因此make PERFECT=1 DEBUG=1
和make DEBUG=1 PERFECT=1
是等效的。
答案 2 :(得分:0)
已经澄清了为什么你不能只使用DEBUG。但我想补充一点。
您可以在运行 make 之前使用shell脚本来设置所需的所有变量,例如在linux shell中它将如下所示:
$source debug_setup.sh
$make all
Make is starting...
Debug is enabled
...
其中 debug_setup.sh 包含您需要设置的所有环境变量:
export DEBUG=1
export DEBUG_OPTION=some_option
这很好,因为你可以在那里发表评论,如果你现在不需要什么,你可以评论,并希望保留未来,等等。
然后,您可以拥有几个必须/可以用作标准例程的一部分的设置脚本。这一切都取决于您需要设置多少变量,您希望拥有多少组变量等等。
请注意,最好以某种方式通知用户选择了哪组变量。