条件付きディレクティブifeq
は、しばしば空白を含む変数から展開されたワードを比較するために頻繁に使用されるため、必要な場合があり、実際にはが必要です、Makeでleadingまたはtrailing空白を削除します。
実際、あなたは反対の見方をしているかもしれません。つまり、makeはifeqの条件のすべての引数を逐語的に保つべきです。このifeq
ディレクティブをtrueまたはfalseとして評価するときの係数。
moreどちらが正しいかはわかりません。
実際、私は一人ではありません!
自分自身を作るできませんどちらが正しいかを決定します。したがって、leadingまたはtrailingの空白を取り除く場合とそうでない場合があります。
実際、時々それは先行する空白のみを削除します。
がっかりさせないでください、Makeは時々末尾の空白のみを削除します.
もちろん、チェックするケースが多すぎるので、そのうちのいくつかだけを「実行」します。
Makefile(VERSION 1)、is:
ifeq ( a, a)
all::
echo 'true'
else
all::
echo 'false'
endif
実行すると、次のようになります:
$ make -r
echo 'false'
false
Makefile(VERSION 2)、is:
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
Makefile(VERSION 5)、is:
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 をお読みください:
カンマと一致しない括弧または中括弧は、書かれているとおりに引数のテキストに表示できません。書かれているように、最初の引数のテキストに先行スペースを含めることはできません。これらの文字は、変数置換によって引数値に入れることができます。最初に変数
comma
とspace
を定義します。これらの値は分離されたコンマとスペース文字です。次に、このような文字が必要な場所でこれらの変数を次のように置き換えます:
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