makefile では、${CC} -o myfile myfile.c
CC$(CC) -o myfile myfile.c
の定義がなくても両方とも正常に動作します。私の質問は次のとおりです:
$(..)
と の使い方は${..}
?
- 文字列が定義されていない場合は、文字列を小文字に
{}
変換するだけですか?()
- なぜ
$${dir}
2つ必要なの$$
か
for dir in ${DIR}; do (cd $${dir}; ${MAKE}); done
${}
との間には何か違いがありますか$()
?
ベストアンサー1
()
Make の場合、 との間に違いはありません{}
。
$$
レシピで を使用する場合、 は「エスケープ」されてシェルに渡されます。シェルはと$
を区別する場合があります。ただし、これは完全にシェル次第であり、Make や makefile とは何の関係もありません。$()
${}
引用したレシピコマンドでは
for dir in ${DIR}; do (cd $${dir}; ${MAKE}); done
Make はこれを実行します:
- の値を に代入する
DIR
と${DIR}
、それは$(DIR)
- を(「エスケープ」してシェルに渡せるように)
$$
に置き換えます$
$
MAKE
はの値を に置き換えます${MAKE}
が、これも にすることができます$(MAKE)
。 の値はMAKE
、使用されている make 実行ファイルに Make によって自動的に設定されます。- 結果の文字列は実行のためにシェルに渡され、シェルは残りの文字列を
${}
必要に応じて解釈します。
CC
は、MAKE
Make によってデフォルトで事前定義されている変数の 1 つであるため、自分で設定しなくても「機能」します。
ちなみに、このレシピを「ターゲット」として書くより良い方法は
.PHONY: $(DIR)
target: $(DIR)
$(DIR):
$(MAKE) -C $@
不明な点についてはマニュアルを参照してください。