web-dev-qa-db-ja.com

同じレシピを共有する複数のルールを持つMakefile

複数のルールを使用してMakefileを作成できるかどうかを知りたいのですが、各ルールは独自の前提条件を定義し、レシピを複製せずにすべて同じレシピを実行します。例:

TARGETS= file1 file2 file3

all: $(TARGETS)

file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
    cat $^ > $@

ありがとう!

26
superruzafa

はい、それはかなり明白な方法で書かれています:

TARGETS= file1 file2 file3

all: $(TARGETS)

file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1

$(TARGETS):
    cat $^ > $@

UPD。

明確にするために。

Generic make rule は次のようになります:

targets... : prerequisites...
    recipe
    ...

ルールのどの部分も省略できます。レシピがないと、メイクファイルのどこにでも前提条件のリストを入力でき、複数のルールステートメントの左側にターゲットが発生する可能性があります。

たとえば、以下は上記の例と同等です(Makefileが適切に設計されているため、前提条件の順序が重要ではないと仮定します)。

file1 file3       : dep1
file1 file2 file3 : dep2
file2             : dep3 dep4

リストの前提条件とは異なり、ターゲットごとに最大で1つの明示的なレシピが存在できます。レシピ内では、 自動変数 を使用して、ターゲット名、前提条件のリストなどを取得できます。

UPD。 2

@Calmariusがコメントで言及しているように、これは%.txt: %.fooのように パターンルール には適用されません。ターゲット内の複数のパターンは、ルールがこれらすべてのターゲットを一度に生成することを意味します。

このパターンルールには2つのターゲットがあります。

%.tab.c %.tab.h: %.y
    bison -d $<

これは、レシピbison -d x.yx.tab.cx.tab.hの両方を作成することをmakeに伝えます。ファイルfooがファイルparse.tab.oscan.oに依存し、ファイルscan.oがファイルparse.tab.hに依存する場合、parse.yが変更されると、レシピbison -d parse.yは1回だけ実行され、parse.tab.oscan.oの両方の前提条件が満たされます。

ただし、パターンルールで複数の前提条件を定義することもできます(つまり、ターゲットに%ステムが含まれている場合、それ以外の場合は通常のルールになります)。

43