Bash makefile:如果变量为空,则单个make目标失败

Bash makefile:如果变量为空,则单个make目标失败,bash,makefile,build,scripting,gnu-make,Bash,Makefile,Build,Scripting,Gnu Make,我对构建makefile还不熟悉,并且正在尝试确定如果变量为空,构建目标将如何失败。我希望能够将变量作为环境变量或make参数传入 假设我有这样一个makefile: VER ?= step0: echo "step0 should work" step1: echo "step1 should enforce variable" ifeq($(VER), "") $(error VER is not set) endif echo "Su

我对构建makefile还不熟悉,并且正在尝试确定如果变量为空,构建目标将如何失败。我希望能够将变量作为环境变量或make参数传入

假设我有这样一个makefile:

VER ?=

step0:
    echo "step0 should work"

step1: 
    echo "step1 should enforce variable"
    ifeq($(VER), "")
    $(error VER is not set)
    endif 
    echo "Success: Value of Ver ${VER}"

step2:
    echo "step2 should work"
step1:
    some command
ifeq ($(A),$(B))
    another command
endif
    yet another command
我希望能够运行以下测试用例:

VER="foo" make step1  
# should result in printing the "Success:" line

但是,当我使用上述任何一种方法运行
make步骤
时,我总是会得到
VER未设置
错误

简单地说,如何在特定的make目标中测试变量,并在未设置时以错误消息响应?(但其他make目标并不关心是否设置了变量)

以下几点:

首先,必须将Make命令和shell命令整齐地分开。这:

ifeq ($(A),$(B))
...
endif
是Make语法。如果将
ifeq(…)
传递给shell,您可能会遇到问题。makefile配方中的命令是要传递给shell的shell命令。若要在规则的中间使用“生成<代码> IFEQ 条件”,请这样做:

VER ?=

step0:
    echo "step0 should work"

step1: 
    echo "step1 should enforce variable"
    ifeq($(VER), "")
    $(error VER is not set)
    endif 
    echo "Success: Value of Ver ${VER}"

step2:
    echo "step2 should work"
step1:
    some command
ifeq ($(A),$(B))
    another command
endif
    yet another command
请注意,
ifeq
endif
前面没有选项卡;这些不是要传递给shell的命令,而是供Make使用的命令

第二,这:

ifeq(...)
ifeq ($(VER), "")
应该是这样的:

ifeq (...)
ifeq ($(VER),)
空间很重要(至少在我的Make版本中是如此)

第三,这:

ifeq(...)
ifeq ($(VER), "")
应该是这样的:

ifeq (...)
ifeq ($(VER),)
除非您确实希望变量包含字符串'''''

(你可以自己最后一次发现它们,单独使用
ifeq
;总是单独测试新工具。)

在这些更改之后,makefile对我有效。如果对您不起作用,请告诉我,我们会解决的。

有几件事:

首先,必须将Make命令和shell命令整齐地分开。这:

ifeq ($(A),$(B))
...
endif
是Make语法。如果将
ifeq(…)
传递给shell,您可能会遇到问题。makefile配方中的命令是要传递给shell的shell命令。若要在规则的中间使用“生成<代码> IFEQ 条件”,请这样做:

VER ?=

step0:
    echo "step0 should work"

step1: 
    echo "step1 should enforce variable"
    ifeq($(VER), "")
    $(error VER is not set)
    endif 
    echo "Success: Value of Ver ${VER}"

step2:
    echo "step2 should work"
step1:
    some command
ifeq ($(A),$(B))
    another command
endif
    yet another command
请注意,
ifeq
endif
前面没有选项卡;这些不是要传递给shell的命令,而是供Make使用的命令

第二,这:

ifeq(...)
ifeq ($(VER), "")
应该是这样的:

ifeq (...)
ifeq ($(VER),)
空间很重要(至少在我的Make版本中是如此)

第三,这:

ifeq(...)
ifeq ($(VER), "")
应该是这样的:

ifeq (...)
ifeq ($(VER),)
除非您确实希望变量包含字符串'''''

(你可以自己最后一次发现它们,单独使用
ifeq
;总是单独测试新工具。)


在这些更改之后,makefile对我有效。如果对您不起作用,请告诉我,我们会解决的。

谢谢您帮助我解决这个问题。这有助于了解make语法的缩进与目标块无关。有了你的建议,我得以使它发挥作用。再次感谢。谢谢你帮我解决这个问题。这有助于了解make语法的缩进与目标块无关。有了你的建议,我得以使它发挥作用。再次感谢。