如果我有一个带有可选参数的makefile,我通常会使用:
make target
但有时(如果我认为汇编器优化可能有问题)我想传递一个额外的命令行参数,例如
make target VERIFY_ASSEMBLY_OPTIMISATIONS=1
有时我可能在命令行参数中输入拼写错误,例如
make target VERIFY_ASSEMBLY_OPTIMIZATIONS=1
这可能会让我浪费很多时间,因为错误的事情已经建立。
是否有一种验证Makefile命令行参数的简单方法?
换句话说,如果使用了无法识别的命令行参数,我希望Makefile立即引发错误。
我尝试了以下代码来检测意外变量:
ALLOWED_VARS := foo bar
$(foreach v, \
$(filter-out $(ALLOWED_VARS),$(.VARIABLES)), \
$(info $(v) = $($(v))))
不幸的是,这似乎检测到了许多我没有在命令行中指定的额外变量(例如LANG,TERM,LEX)。
答案 0 :(得分:3)
有一个未记录的变量包含所有命令行变量赋值-*-command-variables-*-
(是的,这是变量的实际名称)。
所以如果你有这个makefile:
all:
@echo '$(-*-command-variables-*-)'
并且您运行make
,它将不会打印任何内容。如果您运行make FOO=bar BIZ=baz
,则会打印FOO=bar BIZ=baz
。这不是100%可靠的,因为这是一个未记录的变量,因此可以想象有一天它可能会发生变化,而且由于它引用了空格,所以它有点问题,所以带有上述makefile的make FOO='foo bar'
将会打印FOO=foo\ bar
。但它可能已经足够好了。
如果您希望它是防弹的,我建议的唯一选择是循环遍历$(.VARIABLES)
值,该值包含已定义的变量列表,将每个变量传递给$(origin ...)
函数并查找以command line
作为值。像这样:
CMDVARS := $(strip $(foreach V,$(.VARIABLES),$(if $(findstring command,$(origin $V)),$V)))