それはががこれを解析して作る方法を見ておくと便利です。
SOURCES = $(wildcard *.c)
dummytgt: $(OBJ)/tier.o
$(GCC) $(CFLAGS) -c $(filter [email protected],$(SOURCES)).c -o [email protected]
まず第一に、 それが行くようにマクロを定義し、拡大する、メイクファイルを読み込みますが。
SOURCES = $(wildcard *.c)
は${SOURCES}
が定義$(wildcard *.c)
と怠惰な変数であることを意味しています。 Lazy?はい、これらの回帰変数(はマニュアルになります)は、拡張されたときにのみ右側が拡大されます。
- にはファイルの読み込み時に依存関係が必要なため、
$(OBJ)
が展開されます。 ${OBJ}
の拡張がobjs
(たとえば)としましょう。
- シェルコマンドブロックは、単一の遅延変数のままです。 はまで拡張されています。になります。は、
dmmytgt
をビルドすることを決定します。
あなたはまったく同じ効果にこれを書かれている可能性:このフラグメントが機能するためには
dummytgt: objs/tier.o
$(GCC) $(CFLAGS) -c $(filter [email protected],$(wildcard *.c)).c -o [email protected]
、 ファイルobjs/tier.o
はすでに存在している必要があります。 そうだとしましょう。
を作るには、今では、今ではコマンドブロックを展開する(メイクファイルに応じて)それはdummytgt
を構築するために必要なすべて、 を持っています。
gcc
です。 結果のエラーはとなり、が実行されます。
ここでは好きでないことがいくつかあります: $(wildcard)
は、hacky one-liner makefiles IMHOのみです。 dummytgt
にはobjs/tier.o
が必要ですが、そのビルド手順は決して参照しません。 $(filter)
は常に何も展開されません。