空检查和空字符串检查makefile

时间:2017-03-09 10:57:50

标签: linux makefile gnu-make

我在makefile中有两个变量,它们可以是emptyempty stringvalid string

如果变量为emptyempty string

,我需要输出错误

这是我正在使用的简单makefile

ABC := ""
XYZ := hello

all:
ifeq ($(and $(ABC),$(XYZ)),)
    $(error "Either of var is null")
endif
    @echo "Done"

有了这个,我得到输出Done虽然我希望它失败。

如果我更改ifeq条件如下, ifeq ($(and $(ABC),$(XYZ)),"")然后在以下条件make中没有错误退出

ABC :=
XYZ := hello

all:
ifeq ($(and $(ABC),$(XYZ)),"")
    $(error "Either of var is null")
endif
    @echo "Done"

一个解决方案如下,(?)

ABC := hello
XYZ := hello

all:
ifeq ($(and $(ABC),$(XYZ)),)
    $(error "Var is null")
endif
ifeq ($(and $(ABC),$(XYZ)),"")
    $(error "Var is null2")
endif

    @echo "Done"

但我觉得有更好的方法可以做,有什么建议吗?

修改

只是解释我想要的是

if ABC is empty string(ABC := "") OR empty(ABC := )  OR
   XYZ is empty string(XYZ := "") OR empty(XYZ := )
   $(error "empty string or null")
endif

2 个答案:

答案 0 :(得分:1)

为了清楚起见,请不要以任何方式关注报价。当谈到"空"变量它意味着没有价值的变量。如果你写:

ABC := ""

然后该变量有一个值,即文字字符""。要做的是,这与分配ab等没有什么不同(至少在如何解释这些值时)。

对于您的问题,您可以使用以下内容:

ifeq (,$(subst ",,$(ABC)$(XYZ)))
    $(error empty string or null)
endif

将取代所有引号;如果结果是空字符串,那么你知道变量是空的或只包含引号。

请注意,这也会导致只包含一个引号或两个以上引号的变量被视为空;如,

ABC := "
XYZ := """""""""""""

也将被视为空。如果你真的只想要考虑两个引号是空的那么你需要一些更加花哨的东西。

答案 1 :(得分:0)

Ack,我没有足够的声誉来发表评论,但似乎以上都没有真正回答你的问题。连接是$(or的功能等价物,而不是$(and,因此$(ABC)$(XYZ)不等同于$(and $(ABC),$(XYZ))(并且$(subst ",,""xxx)也不会是空白的。)

此外,您问题中的第二个示例将无法正常工作,如$(ABC)"",则$(and $ABC,xxx)将为xxx,而非""

你需要的是一个宏,比如unquote删除qoutes,然后执行:

unquote=$(subst ",,$(1))
ifeq ($(and $(call unquote,$(ABC)),$(call unquote,$(XYZ))),)

哪个有点难看。您当然可以将unquote更改为仅简化空引用的字符串。