由于条件指令ifeq
经常用于比较从变量扩展的单词,这些单词通常包含空格,因此我们可能希望并且事实上需要让Make去除任何前导或尾随空格。
事实上,您可能持有相反的观点,即Make应保留ifeq条件中的所有参数,因为用户可能将这些空格作为"测试"的一部分,并打算让这些空格在评估此ifeq
指令时扮演决定性因素,是true还是false。
我无法决定哪个观点更正确。
事实上,我不是唯一一个这样想的人!
Make本身也无法决定哪个观点是正确的。因此,它可能会或可能不会删除前导或尾随空格。
事实上,有时它只会删除前导空格。
令人欣慰的是,Make有时会仅删除尾随空格。
当然,要检查的情况太多了,因此我只会“做”其中的一些。
一个Makefile(版本1)如下:
ifeq ( a, a)
all::
echo 'true'
else
all::
echo 'false'
endif
执行时,我得到:
$ make -r
echo 'false'
false
一个 Makefile(版本 2)是:
ifeq (a ,a )
all::
echo 'true'
else
all::
echo 'false'
endif
执行时,我得到:
$ make -r
echo 'false'
false
一个makefile(版本3)是:
ifeq ( a , a )
all::
echo 'true'
else
all::
echo 'false'
endif
执行后,我得到:
$ make -r
echo 'false'
false
一个 makefile(版本 4)是:
ifeq (a , a)
all::
echo 'true'
else
all::
echo 'false'
endif
执行时,我得到:
$ make -r
echo 'true'
true
一个Makefile(版本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
条件指令的真实性,这绝对会使它变得:
- 不那么一致。
- 不易于维护。
- 更难调试。
- 容易出错。
- 最后,非常“有趣”!
我们同意吗?
$(func arg)
的第一个arg
中,您不能输入空格(WS),但没有任何规定ifeq (arg arg)
中的arg
不能包含空格。实际上,示例表明我们可以这样做。但是,您指出的是对的,变量扩展产生的空格(不是字面输入的)总是重要的!谢谢 - Ji Cha