gpt4 book ai didi

makefile - "ifeq"生成文件中的条件语法

转载 作者:行者123 更新时间:2023-12-04 02:14:55 27 4
gpt4 key购买 nike

作为条件指令 ifeq经常用于比较从变量扩展的单词,这些变量通常包含空格,我们可能希望并且实际上需要 Make 去除任何前导或尾随的空格。

事实上,您可能有相反的看法,即 Make 应该将所有参数逐字保留为 ifeq 条件,因为用户可能将这些空格作为“测试”的一部分,目的是让这些空格发挥决定性作用因素,在评估此 ifeq 时指令,为真或假。

我无法决定,其中哪一个是 更多 正确的。

事实上,我并不孤单!

自己做 不能 决定,哪一个是正确的。因此,它可能会或可能不会去除前导或尾随空格。

其实有时候会仅去除前导空格 .

不令人失望,Make有时会仅去除尾随空格 .

当然,要检查的案例太多了,所以我只会“做”其中的几个。


生成文件(版本 1)是:

ifeq ( a, a)
all::
echo 'true'
else
all::
echo 'false'
endif


执行,我得到:

$ make -r
echo 'false'
false


生成文件(版本 2)是:

ifeq (a ,a )
all::
echo 'true'
else
all::
echo 'false'
endif


执行,我得到:

$ make -r
echo 'false'
false


生成文件(版本 3)是:

ifeq ( a , a )
all::
echo 'true'
else
all::
echo 'false'
endif


执行,我得到:

$ make -r
echo 'false'
false


生成文件(版本 4)是:

ifeq (a , a)
all::
echo 'true'
else
all::
echo 'false'
endif


执行,我得到:

$ make -r
echo 'true'
true

生成文件(版本 5)是:

ifeq (a, a)
all::
echo 'true'
else
all::
echo 'false'
endif


执行,我得到:

$ make -r
echo 'true'
true


总结起来,只是其中的几个案例,我们有:

# Both, have only leading whitespace.
ifeq( a, a) as: false.

# Both, have only trailing whitespace.
ifeq(a ,a ) as: false.

# Both, have trailing AND trailing whitespace.
ifeq( a , a ) as: false.

# Left-hand-size has only trailing, and right-hand-size has only leading whitepsace.
ifeq(a , a) as: true.

# Left-hand-size has NO whitespace at-all, and right-hand-size has only leading whitepsace.
ifeq(a, a) as: true.

因此,Make 使用这种方法来评估 ifeq 的真实性。条件指令,肯定是把它变成:
  • 不太一致。
  • 不易维护。
  • 更难调试。
  • 容易出错。
  • 最后,很多“乐趣”!

  • 我们同意吗?

    最佳答案

    您应该阅读 this :

    Commas and unmatched parentheses or braces cannot appear in the text of an argument as written; leading spaces cannot appear in the text of the first argument as written. These characters can be put into the argument value by variable substitution. First define variables comma and space whose values are isolated comma and space characters, then substitute these variables where such characters are wanted, like this:



    comma:= ,
    empty:=
    space:= $(empty) $(empty)
    foo:= a b c
    bar:= $(subst $(space),$(comma),$(foo))
    # bar is now ‘a,b,c’.

    您还应该使用 strip功能有疑问时。

    这里有一个例子 Makefile :

    empty:=
    space:= $(empty) $(empty)

    x := $(space)a$(space)
    y := $(space)a$(space)

    ifeq ($(x),$(y))
    all::
    @echo 'regular: true'
    else
    all::
    @echo 'regular: false'
    endif

    ifeq ($(strip $(x)),$(strip $(y)))
    all::
    @echo 'strip: true'
    else
    all::
    @echo 'strip: false'
    endif

    结果:

    1:

    x = $(space)a
    y = $(space)a

    regular: true
    strip: true

    2:

    x = a$(space)
    y = a$(space)

    regular: true
    strip: true

    3:

    x = $(space)a$(space)
    y = $(space)a$(space)

    regular: true
    strip: true

    4:

    x = a$(space)
    y = $(space)a

    regular: false
    strip: true

    4:

    x = a
    y = $(space)a

    regular: false
    strip: true

    关于makefile - "ifeq"生成文件中的条件语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32177046/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com