检测未使用的makefile命令行参数

时间:2014-05-28 18:27:46

标签: makefile command-line-arguments

背景

如果我有一个带有可选参数的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)。

1 个答案:

答案 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)))