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


回答:


95

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

私は考えて$(round brackets)見て整然とし、それは単なる個人的な好みです。

(他の回答は、GNU Makeのドキュメントの関連セクションを示しており、単一の式内で構文を混在させるべきではないことに注意してください)


11
私は$()in make を使用して、make変数とシェル変数の間で(すでに存在している以上の)混乱を引き起こさないようにしています。変数参照に関するGNU Makeドキュメント
Etan Reisner、2014

ユーザー@Eloyにこの回答の拡張を提案してくれたことに感謝します。ただし、他の回答で貴重な追加ポイントを単に指摘することを支持して彼らの概要を拒否しましたが。
ノーマングレイ

1
一部のツールは、それらの同一性を尊重しない場合があります。IntelliJ IDEA deploy: ${DEPS}は構文エラーとして強調表示されましたがdeploy: $(DEPS)、両方のスペルがで呼び出されmakeたときに同じ効果があるにもかかわらず、正しく表示されました。
amacleod


13

すでに正しく指摘されているように、違いはありません、2つの種類の区切り文字を混在させないように注意してください。unomadhGNU makeの例のように、不可解なエラーが発生する可能性があります。

関数呼び出し構文に関するGNU makeマニュアルから(私の強調):

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


11

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

, = ,
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.

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


GNU makeのドキュメンテーションは違いはないと述べていると述べているエドゥアールの答えに基づいて、私はこれがただのバグであると思います。
キースM

7
Alexandre Perrinの回答で指摘されているように、2つの構文を同じ行に混在させないでください。
レンツ

11

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


3

式に不等括弧が含まれていると、違いが生じます。

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

->

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.