需要在Makefile目标中设置环境变量

时间:2016-03-16 19:05:10

标签: makefile environment-variables gnu-make

我正在尝试在运行特定目标时要求在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.

我做错了什么?我怎样才能让它发挥作用?

1 个答案:

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