gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:55:50 27 4
gpt4 key购买 nike

背景

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

最佳答案

有一个未记录的变量,其中包含所有命令行变量赋值,-*-command-variables-*-(是的,这是变量的实际名称)。

所以如果你有这个 makefile:

all:
@echo '$(-*-command-variables-*-)'

然后你运行make,它不会打印任何东西。如果您运行 make FOO=bar BIZ=baz,它将打印 FOO=bar BIZ=baz。这不是 100% 可靠,因为这是一个未记录的变量,所以可以想象有一天它可能会改变,而且它有点问题,因为它引用了空格,所以 make FOO='foo bar' 用上面的 makefile将打印 FOO=foo\bar。但这可能已经足够好了。

如果您希望它是防弹的,我可以建议的唯一选择是遍历 $(.VARIABLES) 值,其中包含已定义的变量列表,将每个变量传递给 $(origin ...) 函数并寻找 command line 作为值。像这样:

CMDVARS := $(strip $(foreach V,$(.VARIABLES),$(if $(findstring command,$(origin $V)),$V)))

关于makefile - 检测未使用的 makefile 命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23919199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com