我正在尝试在运行特定目标时要求在Makefile中设置环境变量。我正在使用the answer to this question中的技术,您可以在其中设置另一个目标,以确保设置环境变量。
我的样子如下:require-%:
@ if [ "${${*}}" = "" ]; then \
$(error You must pass the $* environment variable); \
fi
使用该目标设置,这是预期的:
$ make require-FOO
Makefile:3: *** You must pass the FOO environment variable. Stop.
然而,在测试时,我永远不会错误地发现:
$ make require-FOO FOO=something
Makefile:3: *** You must pass the FOO environment variable. Stop.
$ make require-FOO FOO=true
Makefile:3: *** You must pass the FOO environment variable. Stop.
$ make require-FOO FOO='a string'
Makefile:3: *** You must pass the FOO environment variable. Stop.
即使我在目标中注释掉if
块:
require-%:
# @ if [ "${${*}}" = "" ]; then \
# $(error You must pass the $* environment variable); \
# fi
运行时我仍然遇到错误:
$ make require-FOO FOO=something
Makefile:3: *** You must pass the FOO environment variable. Stop.
我做错了什么?我怎样才能让它发挥作用?
答案 0 :(得分:5)
您修改了该链接答案中显示的解决方案,但未理解其中的差异。
链接的答案使用 shell echo
和 shell exit
来执行消息输出并退出。
您的修改使用 make $(error)
函数。
不同之处在于shell命令仅在shell逻辑说明它们应该执行但make函数执行之前 make运行shell命令(并且始终展开/执行)。 (即使在shell注释中,因为它们是 shell 注释。)
如果你想在 shell 时断言,那么你需要使用shell结构来测试和退出。像原来的答案一样。
如果您希望在配方扩展时断言,那么您需要使用make构造来测试和退出。像这样(未经测试):
require-%:
@: $(if ${${*}},,$(error You must pass the $* environment variable))
@echo 'Had the variable (in make).'