【问题标题】:Null check and empty string check in makefilemakefile 中的空值检查和空字符串检查
【发布时间】:2017-03-09 10:57:50
【问题描述】:

我在 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

【问题讨论】:

    标签: linux makefile gnu-make


    【解决方案1】:

    为了清楚起见,make 不关心引号。当 make 谈论“空”变量时,它意味着没有值的变量。如果你写:

    ABC := ""
    

    那么该变量有一个值,即文字字符""。要制作,这与分配 ab 等没有什么不同(至少在 make 如何解释这些值方面)。

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

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

    这将用任何内容替换所有引号;如果结果是一个空字符串,那么你知道变量要么是空的,要么只包含引号。

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

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

    也将被视为空。如果您真的只想将两个引号视为空,那么您需要更花哨的东西。

    【讨论】:

    • 感谢您的回复,我会检查并回复。但是我更喜欢更清洁的解决方案。
    • 您必须定义“更清洁的解决方案”的含义。您觉得该解决方案的哪一部分不足?
    • 道歉我误解了如果 value 包含 values 引号,例如"value" 那也会被认为是空的。我测试了你的建议,似乎没问题。只有一个问题,只有当两者都为null时才报告错误,我想在其中一个变量为null时出错。我知道这可以通过单独的 ifeqs 来完成,但是想检查它是否可以在单个 ifeq 中完成。
    【解决方案2】:

    Ack,我没有足够的声誉来制作 cmets,但似乎以上都没有真正回答您的问题。串联是$(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 以仅简化带引号的空字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-01
      • 2017-11-25
      • 2021-12-07
      • 2017-01-30
      • 1970-01-01
      • 2015-05-29
      • 2014-02-20
      • 2015-06-12
      相关资源
      最近更新 更多