web-dev-qa-db-ja.com

Makefileの括弧$()と中括弧$ {}構文の違いは何ですか?

構文_${var}_と$(var)を使用した変数の呼び出しに違いはありますか?たとえば、変数が展開される方法などで?

83
Édouard Lopez

違いはありません-それらはまったく同じ意味です(GNU MakeとPOSIX make))。

$(round brackets)はきれいに見えると思いますが、それは個人的な好みです。

(他の答えは、GNUドキュメントを作成し、単一の式内で構文を混同しないように注意してください。

67
Norman Gray

変数参照の基本GNU makeドキュメンテーション状態のセクション違いなし

変数の値を置換するには、ドル記号の後に括弧または中括弧で変数の名前を記述します。$(foo)または${foo}は有効な参照です変数foo 。

34
Édouard Lopez

既に正しく指摘されているように、違いはありませんが、nomadhのような不可解なエラーにつながる可能性があるため、2種類の区切り文字を混ぜないように注意してくださいGNU make example。

から GNU関数呼び出し構文のマニュアルを作成 (エンファシス鉱山):

[…]引数自体に他の関数呼び出しまたは変数参照が含まれる場合、すべての参照に同じ種類の区切り文字を使用するのが賢明です。 $(subst a,b,$(x))ではなく、$(subst a,b,${x})と書きます。これはより明確であり、参照の終わりを見つけるために1つのタイプの区切り文字のみが一致するためです

12

実際、それはかなり異なっているようです:

, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)

出力

a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.

しかし、これまでのところ、$ {...}への変数名にコンマが含まれている場合にのみこの違いが見つかりました。私は最初、$ {...}が値としてではなく一部としてコンマを展開していると考えましたが、このようにハックできないことがわかりました。私はまだこれを理解していません...説明があったら、私は喜んで知りたいです!

11
unomadh

$ {}スタイルでは、対応する環境変数が設定されている場合、bashと互換性があるため、シェルでmakeルールをテストできます。

9
Warren MacEvoy

式に不均衡な括弧が含まれている場合、違いが生じます。

${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))

->

:-(
*** insufficient number of arguments (1) to function 'subst'.  Stop.

変数参照の場合、これは関数、または括弧を含む変数名に違いをもたらします(悪い考え)

2
Erik Carstensen