Makefile:包含字符串

Pab*_*blo 65 string makefile conditional-statements

变量返回MINGW32_NT-5.1CYGWIN_NT-5.1.(是,最后点)

需要比较给定的var包含NT-5.1位于任何地方.

使用cygwin并希望与几乎任何*nix兼容.

Joh*_*ica 106

findtring函数是你的心愿:

$(findstring 发现,)

搜索为发生的发现.如果发生,则值为find ; 否则,该值为空.您可以在条件中使用此函数来测试给定字符串中是否存在特定子字符串.因此,这两个例子,

$(findstring a,a b c)
$(findstring a,b c)
Run Code Online (Sandbox Code Playgroud)

分别产生值"a"""(空字符串).有关实际应用,请参阅测试标志findstring.

就像是:

ifneq (,$(findstring NT-5.1,$(VARIABLE)))
    # Found
else
    # Not found
endif
Run Code Online (Sandbox Code Playgroud)

  • 将其解析为`ifneq(A,B)`其中A是空字符串,B是`$(findstring ...)`.它看起来很奇怪,因为你没有在Makefile中引用字符串. (5认同)
  • 很棒,正是我想要的.只有一个问题 - 这里的逗号是什么`ifneq(,$(......`) (3认同)
  • `findstring` 是否区分大小写?如果是这样,是否有一种简单的方法来进行不区分大小写的匹配?说明书没说清楚... (3认同)
  • @IsaacTurner:是的,`make`函数是_invariably_ case-_sensitive_.遗憾的是,没有不区分大小写的变体,但作为一种解决方法,您可以使用`$(shell ...)`函数来使用shell命令进行大小写转换 - 笨重,但它有效; 例如:`$(findstring $(shell echo'BC'| tr'[:upper:]''[:lower:]'),'abcd')`.如果你不介意指定`SHELL:= bash`让`make`使用bash作为shell,你可以利用`shopt -s nocasematch`并在单个`$(shell)中不区分大小写地执行整个比较. ..)`电话. (3认同)

小智 18

VARIABLE=NT-5.1_Can_be_any_string
ifeq ($(findstring NT-5.1,$(VARIABLE)),NT-5.1)
    # Found
    RESULT=found
else
    # Not found
    RESULT=notfound
endif

all:
    @echo "RESULT=${RESULT} , output=$(findstring NT-5.1,$(VARIABLE))"
Run Code Online (Sandbox Code Playgroud)

它匹配给定的字符串并返回

  • 这比IMO接受的答案更有效. (7认同)
  • @JavidJamae它可能更具可读性,但你重复"NT-5.1" (3认同)