複数のルールを使用してMakefileを作成できるかどうかを知りたいのですが、各ルールは独自の前提条件を定義し、レシピを複製せずにすべて同じレシピを実行します。例:
TARGETS= file1 file2 file3
all: $(TARGETS)
file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
cat $^ > $@
ありがとう!
はい、それはかなり明白な方法で書かれています:
TARGETS= file1 file2 file3
all: $(TARGETS)
file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
$(TARGETS):
cat $^ > $@
明確にするために。
Generic make rule は次のようになります:
targets... : prerequisites...
recipe
...
ルールのどの部分も省略できます。レシピがないと、メイクファイルのどこにでも前提条件のリストを入力でき、複数のルールステートメントの左側にターゲットが発生する可能性があります。
たとえば、以下は上記の例と同等です(Makefileが適切に設計されているため、前提条件の順序が重要ではないと仮定します)。
file1 file3 : dep1
file1 file2 file3 : dep2
file2 : dep3 dep4
リストの前提条件とは異なり、ターゲットごとに最大で1つの明示的なレシピが存在できます。レシピ内では、 自動変数 を使用して、ターゲット名、前提条件のリストなどを取得できます。
@Calmariusがコメントで言及しているように、これは%.txt: %.foo
のように パターンルール には適用されません。ターゲット内の複数のパターンは、ルールがこれらすべてのターゲットを一度に生成することを意味します。
このパターンルールには2つのターゲットがあります。
%.tab.c %.tab.h: %.y bison -d $<
これは、レシピ
bison -d x.y
がx.tab.c
とx.tab.h
の両方を作成することをmakeに伝えます。ファイルfooがファイルparse.tab.o
とscan.o
に依存し、ファイルscan.oがファイルparse.tab.h
に依存する場合、parse.y
が変更されると、レシピbison -d parse.y
は1回だけ実行され、parse.tab.o
とscan.o
の両方の前提条件が満たされます。
ただし、パターンルールで複数の前提条件を定義することもできます(つまり、ターゲットに%
ステムが含まれている場合、それ以外の場合は通常のルールになります)。