Command line 在make命令行上指定空变量

Command line 在make命令行上指定空变量,command-line,makefile,Command Line,Makefile,我有一些Makefiles,它们根据某些变量的存在灵活地使用ifdef检查它们。我不得不在命令行中将变量设置为某个值,这有点烦人。make all DEBUG不会触发ifdef,但make all DEBUG=1会触发ifdef。也许我只是在使用C预处理器的方法,而它并不属于这种方法 Q1是否可以在命令行中将变量指定为空?没有更多的角色? Q2对于这样的布尔参数,make的首选方法是什么?我想你的意思是make all DEBUG=在这里,对吗?没有=将考虑调试是要建立的目标,而不是变量赋值。<

我有一些Makefiles,它们根据某些变量的存在灵活地使用ifdef检查它们。我不得不在命令行中将变量设置为某个值,这有点烦人。make all DEBUG不会触发ifdef,但make all DEBUG=1会触发ifdef。也许我只是在使用C预处理器的方法,而它并不属于这种方法

Q1是否可以在命令行中将变量指定为空?没有更多的角色? Q2对于这样的布尔参数,make的首选方法是什么?

我想你的意思是make all DEBUG=在这里,对吗?没有=将考虑调试是要建立的目标,而不是变量赋值。< /P> 手册指定具有非空值的变量会导致ifdef返回true。不存在或不存在但包含空字符串的变量会导致ifdef返回false。注意:ifdef不展开变量,它只是测试变量是否有任何值

您可以使用$origin。。。函数来测试变量是否真的没有定义,或者定义为空,如下所示:

ifeq ($(origin DEBUG),undefined)
  $(info Variable DEBUG is not defined)
else
  $(info Variable DEBUG is defined)
endif
我想你的意思是让所有的调试都在这里,对吗?没有=将考虑调试是要建立的目标,而不是变量赋值。< /P> 手册指定具有非空值的变量会导致ifdef返回true。不存在或不存在但包含空字符串的变量会导致ifdef返回false。注意:ifdef不展开变量,它只是测试变量是否有任何值

您可以使用$origin。。。函数来测试变量是否真的没有定义,或者定义为空,如下所示:

ifeq ($(origin DEBUG),undefined)
  $(info Variable DEBUG is not defined)
else
  $(info Variable DEBUG is defined)
endif

正如@MadScientist几分钟前解释的那样

make all DEBUG
将目标调试添加到make。幸运的是,有一个解决办法:

ifneq (,$(filter DEBUG,$(MAKECMDGOALS)))
    DEBUG:=1 # or do whatever you want
    DEBUG: all; @echo -n
endif
必须向虚拟目标提供一个虚拟规则,如无回声,如上所述。并将此语句放在makefile的底部,或者像示例中那样显式指定先决条件目标。否则,make可能会错误地选择调试目标而不是全部

请注意,这不是首选方法;该约定类似于使用V=1打开echo


另一个警告是,make按顺序处理命令行目标,例如,make A B将首先处理一个目标,然后处理B目标,无论这些目标是独立的还是相互依赖的。因此,编写makedebug-PERFECT和makeperfect-DEBUG可能会产生不同的结果。但是参数的顺序是不相关的,因此make-PERFECT=1 DEBUG=1和make-DEBUG=1 PERFECT=1是等价的。

正如@MadScientist几分钟前解释的那样

make all DEBUG
将目标调试添加到make。幸运的是,有一个解决办法:

ifneq (,$(filter DEBUG,$(MAKECMDGOALS)))
    DEBUG:=1 # or do whatever you want
    DEBUG: all; @echo -n
endif
必须向虚拟目标提供一个虚拟规则,如无回声,如上所述。并将此语句放在makefile的底部,或者像示例中那样显式指定先决条件目标。否则,make可能会错误地选择调试目标而不是全部

请注意,这不是首选方法;该约定类似于使用V=1打开echo


另一个警告是,make按顺序处理命令行目标,例如,make A B将首先处理一个目标,然后处理B目标,无论这些目标是独立的还是相互依赖的。因此,编写makedebug-PERFECT和makeperfect-DEBUG可能会产生不同的结果。但是参数的顺序是不相关的,因此make PERFECT=1 DEBUG=1和make DEBUG=1 PERFECT=1是等价的。

已经阐明了为什么不能只使用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
这是很好的,因为你可以在那里发表评论,如果你现在不需要什么,你可以发表评论,如果你想为将来保留,等等

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


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

已经阐明了为什么不能只使用调试。但我想补充一点

您可以在运行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
这是很好的,因为你可以在那里发表评论,如果你现在不需要什么,你可以发表评论,如果你想为将来保留,等等

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


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

创意要点。。。但正如您所说,这不是一种更可取的方法谢谢。你问了两个问题,我都回答了。创意要点。。。但正如您所说,这不是一种更可取的方法谢谢。你问了两个问题,我都回答了。