[解決済み] makefile の "ifeq" 条件構文
質問
条件付きディレクティブとして
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"!
賛成ですか?
解決方法は?
をお読みください。 これ :
カンマと一致しない括弧または中括弧は、記述された引数のテキストには現れません。また、先頭の空白は、記述された最初の引数のテキストには現れません。これらの文字は、変数の代入によって引数の値に入れることができます。まず、変数を定義します。
comma
とspace
という変数があり,その値がカンマとスペースの孤立文字である場合,そのような文字が必要な場所で,このように代入します.
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
関連
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】Makefileの中の.PHONYの目的は何ですか?
-
[解決済み] GNU make で "commands commence before first target" エラーが発生する。
-
[解決済み] Makefile のターゲットとしてグロブパターンを指定する
-
[解決済み] GNU Makefile の変数割り当て =, ?=, :=, += の違いは何ですか?
-
[解決済み] makefile の記号 $@ と $< はどういう意味ですか?
-
[解決済み】makefileに'cd'コマンドを記述するには?
-
[解決済み】ルール実行時にmake変数を定義する。
-
[解決済み] ってなんですか?(アットマークコロン)はMakefileの中でどういう意味ですか?
-
[解決済み] 別のMakefileからMakefileを呼び出すには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Makeエラー:セパレータがない
-
[解決済み】「make」と「make all」の違いとは?
-
[解決済み] makefile の "ifeq" 条件構文
-
[解決済み] makefileの "all "は何の略ですか?
-
[解決済み] makefileでLDFLAGSを使用する方法
-
[解決済み] PATH "文字列を表示するエコーファイルの作成
-
[解決済み】Makeでレシピ行の接頭辞として@、-、+がありますが、これは何でしょうか?
-
[解決済み] 変数が設定されていない場合、makefileを中断させるには?
-
[解決済み] CLionでCMakeの代わりにローカルのmakefileを使用する
-
[解決済み] GNU MakeのCPPFLAGSとCXXFLAGSの違いについて