Makefile avec plusieurs règles partageant la même recette

j'aimerais savoir s'il est possible d'écrire un Makefile avec plusieurs règles, chacune définissant ses propres prérequis et les exécutant toutes la même recette sans dupliquer la recette. Exemple:

TARGETS= file1 file2 file3

all: $(TARGETS)

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

Merci!

21
demandé sur Eldar Abusalimov 2012-07-12 00:37:29

1 réponses

Oui, c'est écrit d'une façon assez évidente:

TARGETS= file1 file2 file3

all: $(TARGETS)

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

$(TARGETS):
    cat $^ > $@

UPD.

Juste pour clarifier.

Générique règle ressemble à ceci:

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

toute partie de la règle peut être omise. Sans la recette, on peut remplir la liste des prérequis n'importe où dans le makefile, une cible peut apparaître dans le côté gauche de plusieurs énoncés de règles.

par exemple, ce qui suit est équivalent à l'exemple ci-dessus (bien, en supposant que le Makefile est correctement conçu de sorte que l'ordre des prérequis n'importe pas):

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

contrairement à la liste des prérequis, il peut y avoir au plus une recette explicite pour chaque cible. À l'intérieur de la recette, vous pouvez utiliser variables automatiques pour obtenir le nom de la cible, la liste des conditions préalables, etc.

UPD. 2

comme @Calmarius le mentionne dans les commentaires, cela ne s'applique pas à règles, comme %.txt: %.foo. Des motifs multiples au sein des cibles signifient que la règle produit toutes ces cibles à la fois.

Ce modèle la règle a deux objectifs:

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

cela indique faire que la recette bison -d x.y va faire à la fois x.tab.c et x.tab.h. Si le fichier foo dépend les fichiers parse.tab.o et scan.o et le fichier d'analyse.o dépend de la le fichier parse.tab.h lorsque parse.y est changée, la recette bison -d parse.y sera exécutée qu'une seule fois, et la conditions préalables à la fois parse.tab.o et scan.o seront satisfaits.

on peut définir plusieurs prérequis dans une règle de pattern (c'est-à-dire, à condition que ses cibles contiennent un % tige, sinon ce serait une règle régulière).

39
répondu Eldar Abusalimov 2014-07-22 08:49:49