makefile
GNUパターンルール
サーチ…
基本パターンルール
パターンルールは、ターゲット内の単一の%
文字で示されます。 %
は、 ステムと呼ばれる空でない文字列と一致します。次に、前提条件リストに表示されるすべての%
代わりにステムが使用されます。
たとえば、このルールは次のとおりです。
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
.o
終わるターゲットと一致します。ターゲットがfoo.o
場合、ステムはfoo
なり、 foo.c
をfoo.o
コンパイルします。ターゲットと前提条件は、自動変数を使用してアクセスできます。
複数のパターンルールに一致するターゲット
ターゲットが複数のパターンルールに一致する場合、makeは前提条件が存在するか構築可能なルールを使用します。例えば:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
foo.c
またはfoo.s
が存在するかに応じて、 foo.c
をfoo.o
コンパイルするか、 foo.s
をfoo.o
にfoo.s
ます。
複数のルールが存在する、またはビルドできる前提条件がある場合、makeは最も短いステムに一致するルールを使用します。例えば:
f%r:
@echo Stem is: $*
fo%r:
@echo Stem is: $*
2番目のルールを使用してターゲットfoo.bar
を作成し、 Stem is: o.ba
エコーしStem is: o.ba
。
複数のルールが最短のステムに一致する場合、makeはMakefileの最初のステートメントを使用します。
パターンルールのディレクトリ
ターゲットパターンにスラッシュが含まれていない場合、makeはマッチする前にビルドしようとしているターゲットからディレクトリ部分を削除します。ディレクトリはステムの前に置かれます。ステムを使用してターゲット名と前提条件を構築すると、ディレクトリ部分が削除され、 %
代わりにステムが置換され、最後にディレクトリが文字列の前に置かれます。例えば:
foo%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
lib/foobar.o
と一致する:
- ステム(
$*
):lib/bar
- ターゲット名(
$@
):lib/foobar.o
- 前提条件(
$<
、$^
):lib/foobar.c
この例では、 lib/foo%.o
ルールが優先さを取るfoo%.o
それは短いステムに一致するためのルール。
複数のターゲットを持つパターンルール
パターンルールは複数のターゲットを持つことができますが、通常のルールとは異なり、レシピはすべてのターゲットを作成する責任があります。例えば:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o
$(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o
有効なルールは、デバッグオブジェクトとリリースオブジェクトのいずれかをビルドする必要がある場合にそれらを両方ともビルドします。私たちが次のように書いたのなら、
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
これは、 debug/*.o
またはrelease/*.o
debug/*.o
うちの1つだけがビルドされているときに機能しますが、両方をビルドする必要がある場合は、最初のターゲットをビルドします(そして、2番目のターゲットを最新のものにします)。