ifdef - Makefile con regole multiple che condividono la stessa ricetta



makefile macros (1)

Sì, è scritto in modo piuttosto ovvio:

TARGETS= file1 file2 file3

all: $(TARGETS)

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

$(TARGETS):
    cat $^ > [email protected]

UPD.

Solo per chiarire.

La regola di produzione generica si presenta così:

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

Qualsiasi parte della regola può essere omessa. Senza la ricetta, si può compilare l'elenco di prerequisiti in qualsiasi punto del makefile, un obiettivo può verificarsi nella parte sinistra di più istruzioni di regole.

Ad esempio, quanto segue è equivalente all'esempio precedente (beh, supponendo che il Makefile sia progettato correttamente in modo che l'ordine dei prerequisiti non sia rilevante):

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

A differenza dei prerequisiti di elencazione, può esserci al massimo una ricetta esplicita per ciascun target. All'interno della ricetta è possibile utilizzare le variabili automatiche per ottenere il nome del target, l'elenco dei prerequisiti, ecc.

UPD. 2

Come @Calmarius menziona nei commenti questo non si applica alle regole del modello , come %.txt: %.foo . Modelli multipli all'interno dei bersagli significano che la regola produce tutti questi bersagli contemporaneamente .

Questa regola del modello ha due obiettivi:

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

Questo dice che la ricetta bison -d xy renderà sia x.tab.c sia x.tab.c Se il file pippo dipende dai file parse.tab.o e scan.o e il file scan.o dipende dal file parse.tab.h , quando parse.y viene cambiato, la ricetta bison -d parse.y sarà eseguito solo una volta e i prerequisiti di parse.tab.o e scan.o saranno soddisfatti.

Si può definire più prerequisiti in una regola del modello (purché i suoi obiettivi contengano una radice % , altrimenti sarebbe una regola regolare).

Mi piacerebbe sapere se è possibile scrivere un Makefile con diverse regole, ognuna delle quali definisce i propri prerequisiti ed eseguendo tutti la stessa ricetta senza duplicare la ricetta. Esempio:

TARGETS= file1 file2 file3

all: $(TARGETS)

file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
    cat $^ > [email protected]

Grazie!





rules