web-dev-qa-db-ja.com

makefileの「ifeq」条件構文

条件付きディレクティブ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条件付きディレクティブの真実性を評価するために使用するこの方法は、間違いなく次のようになります。

  • 一貫性が低い。
  • 保守性が低い。
  • デバッグが難しい。
  • エラーが発生しやすい。
  • 最後に、たくさんの「楽しい」!

同意しますか?

11
Ji Cha

this をお読みください:

カンマと一致しない括弧または中括弧は、書かれているとおりに引数のテキストに表示できません。書かれているように、最初の引数のテキストに先行スペースを含めることはできません。これらの文字は、変数置換によって引数値に入れることができます。最初に変数commaspaceを定義します。これらの値は分離されたコンマとスペース文字です。次に、このような文字が必要な場所でこれらの変数を次のように置き換えます:

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
9
jml