1. ホーム
  2. メイクファイル

[解決済み] makefile の "ifeq" 条件構文

2022-03-03 04:04:36

質問

条件付きディレクティブとして ifeq は、変数から展開された単語を比較するために頻繁に使用されます。 必要 を取り除くために、Makeは 先行 または トレーリング というホワイトスペースがあります。

なぜなら、ユーザーはこれらの空白を "test"の一部として持っていて、これらの空白が評価する際に決定要因になることを意図しているかもしれないからです。 ifeq ディレクティブのように または 虚偽 .

どれがそうなのか、判断がつきません。 より を正します。

実は、私だけじゃないんです!

自分自身を作る できない は、どちらが正しいかを判断します。だから、剥がれたり剥がれなかったり リーディング または トレーリング という空白があります。

実際には、時々、次のようになります。 先頭の空白文字だけを取り除く .

がっかりさせない、Make will sometimes 末尾の空白だけを取り除く .

もちろん、確認するケースが多すぎるので、そのうちのいくつかだけを"do"します。


makefile (VERSION 1)、とは。

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


実行すると、出る。

$ make -r
echo 'false'
false


makefile (VERSION 2)、です。

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


実行すると、出る。

$ make -r
echo 'false'
false


makefile (VERSION 3)、です。

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


実行すると、出る。

$ make -r
echo 'false'
false


makefile (VERSION 4)、です。

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


実行すると、出る。

$ make -r
echo 'true'
true


makefile (VERSION 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 という条件付きディレクティブは、間違いなく化けています。

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

賛成ですか?

解決方法は?

をお読みください。 これ :

カンマと一致しない括弧または中括弧は、記述された引数のテキストには現れません。また、先頭の空白は、記述された最初の引数のテキストには現れません。これらの文字は、変数の代入によって引数の値に入れることができます。まず、変数を定義します。 commaspace という変数があり,その値がカンマとスペースの孤立文字である場合,そのような文字が必要な場所で,このように代入します.

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

また ストリップ という関数があります。


以下はその例です。 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