在make命令行上指定空变量

时间:2013-05-31 19:27:50

标签: command-line makefile

我有一些基于某些变量存在的灵活的Makefile,可以使用ifdef来检查它们。有点烦人的是我必须在命令行上实际设置变量等于某个东西。 make all DEBUG不会触发ifdefmake all DEBUG=1会触发{{1}}。也许我只是使用不属于它的C预处理器方法。

Q1)是否可以在命令行上指定一个变量为空?没有更多的人物? Q2)make的这种布尔参数的首选方法是什么?

3 个答案:

答案 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 PERFECTmake PERFECT DEBUG会产生不同的结果。但参数的顺序无关紧要,因此make PERFECT=1 DEBUG=1make 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

这很好,因为你可以在那里发表评论,如果你现在不需要什么,你可以评论,并希望保留未来,等等。

然后,您可以拥有几个必须/可以用作标准例程的一部分的设置脚本。这一切都取决于您需要设置多少变量,您希望拥有多少组变量等等。

请注意,最好以某种方式通知用户选择了哪组变量。