Makefile の $() と ${} の機能と違い 質問する

Makefile の $() と ${} の機能と違い 質問する

makefile では、${CC} -o myfile myfile.cCC$(CC) -o myfile myfile.cの定義がなくても両方とも正常に動作します。私の質問は次のとおりです:

  1. $(..)と の使い方は${..}
  • 文字列が定義されていない場合は、文字列を小文字に{}変換するだけですか?()
  • なぜ$${dir}2つ必要なの$$
    for dir in ${DIR}; do (cd $${dir}; ${MAKE}); done
  1. ${}との間には何か違いがありますか$()?

ベストアンサー1

()Make の場合、 との間に違いはありません{}

$$レシピで を使用する場合、 は「エスケープ」されてシェルに渡されます。シェルはと$を区別する場合があります。ただし、これは完全にシェル次第であり、Make や makefile とは何の関係もありません。$()${}

引用したレシピコマンドでは

for dir in ${DIR}; do (cd $${dir}; ${MAKE}); done

Make はこれを実行します:

  • の値を に代入するDIR${DIR}、それは$(DIR)
  • を(「エスケープ」してシェルに渡せるように)$$に置き換えます$$
  • MAKEはの値を に置き換えます${MAKE}が、これも にすることができます$(MAKE)。 の値はMAKE、使用されている make 実行ファイルに Make によって自動的に設定されます。
  • 結果の文字列は実行のためにシェルに渡され、シェルは残りの文字列を${}必要に応じて解釈します。

CCは、MAKEMake によってデフォルトで事前定義されている変数の 1 つであるため、自分で設定しなくても「機能」します。

ちなみに、このレシピを「ターゲット」として書くより良い方法は

.PHONY: $(DIR)
target: $(DIR)
$(DIR):
    $(MAKE) -C $@

不明な点についてはマニュアルを参照してください。

おすすめ記事