Makefile con multipli regole di condivisione di una stessa ricetta

Vorrei sapere se è possibile scrivere un Makefile con diverse regole, ognuno che definiscono la sua prerequisiti e l’esecuzione di tutti loro 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!

 

One Reply
  1. 43

    Sì, è scritto in un modo piuttosto ovvio:

    TARGETS= file1 file2 file3
    
    all: $(TARGETS)
    
    file1: dep1 dep2
    file2: dep2 dep3 dep4
    file3: dep2 dep1
    
    $(TARGETS):
        cat $^ > [email protected]
    

    UPD.

    Giusto per chiarire.

    Generico rendere la regola assomiglia a questo:

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

    Qualsiasi parte della regola può essere omesso. Senza la ricetta, si può compilare l’elenco dei prerequisiti ovunque nel makefile, una destinazione può verificarsi nel lato sinistro della regola più consolidato.

    Per esempio, il seguente è equivalente all’esempio di cui sopra (beh, supponendo che il Makefile è correttamente progettato in modo che l’ordine dei prerequisiti non importa):

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

    A differenza di quotazione prerequisiti, non ci può essere più di una esplicita ricetta per ogni destinazione. All’interno della ricetta si può utilizzare le variabili automatiche per ottenere il nome di destinazione, l’elenco dei prerequisiti, etc.

    UPD. 2

    Come @Calmarius menzioni nei commenti di questo non si applica a regole di pattern, come %.txt: %.foo.
    Più modelli all’interno di obiettivi di dire che la norma produce tutti questi obiettivi in una volta.

    Questo modello regola ha due obiettivi:

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

    Questo dice a fare che la ricetta bison -d x.y sarà x.tab.c e x.tab.h.
    Se il file pippo dipende
    il file parse.tab.o e scan.o e la scansione di file.o dipende dal
    file parse.tab.h, quando parse.y è cambiato, la ricetta bison -d parse.y
    verrà eseguita solo una volta, e i prerequisiti di entrambi
    parse.tab.o e scan.o saranno soddisfatti.

    Si può definire più prerequisiti in un modello di regola però (che è, a condizione che i suoi obiettivi contengono un % staminali, altrimenti sarebbe una regola regolare).

    • Funziona. Così, i prerequisiti sono un po ‘ ereditato?
    • vedere aggiornata la risposta, ho provato a spiegare come regola può sembrare.
    • Questo non funziona se si dispone di modello di regole, ad esempio: %.txt: %.pippo. Se si aggiungono alcuni file txt in OBIETTIVI la variabile $^ si espanderà per nulla. Credo che fare thiks che il $(TARGETS): è più specifico in modo da non applicare la regola generica. A quanto pare non è possibile evitare di ricetta ripetizione di pattern regole.
    • grazie, ho aggiunto le note di risposta.

Lascia un commento