2011-12-27 15 views

risposta

55

Sia dipendenze uso o fare ricorsiva di connettersi da una regola a un altro.

dipendenze sarebbe stato fatto in questo modo (anche se l'ordine sarà diverso):

rule1: 
     echo "bye" 
rule2: 
     date 
rule3: rule1 
     @echo "hello" 

ricorsivo make sarebbe fatto come questo (anche se lo fa coinvolgere un sottoprocesso):

rule1: 
     echo "bye" 
rule2: 
     date 
rule3: 
     @echo "hello" 
     $(MAKE) rule1 

Né è perfetta; anzi, con la ricorsiva puoi entrare in problemi significativi se costruisci un ciclo. Probabilmente dovresti anche aggiungere una regola .PHONY in modo da contrassegnare quelle regole sopra come sintetiche, in modo che una deviazione rule1 (ecc.) Nella directory non causi confusione.

16

I file di trucco non sono procedurali; le "regole" non sono come le funzioni. Detto questo, è possibile specificare che una regola è un prerequisito di un altro:

rule1: 
    @echo "Rule 1" 

rule2: rule1 
    @echo "Rule 2" 

Se lo fai make rule2, si dovrebbe vedere:

Rule 1 
Rule 2 
+2

Frustrante, però, non si può ottenere "Regola 2 \ nRule 1" fuori di esso –

+2

@Tomalak: dipende dalla vostra definizione di "frustrante"! Una volta che l'OP accetta che le regole non sono funzioni procedurali, non c'è molto di cui essere frustrati. –

+0

Non risponde alla domanda. Dovrebbe produrre la Regola 2 e quindi la Regola 1. Questo è ciò che l'autore vuole ottenere. – nosbor

2

Ci sono due funzioni avanzate in GNU Make che può fare questo , anche se dovrebbe essere usato solo in circostanze attenuanti. Questo SO è il più votato in google.

I prerequisiti della regola sono più consigliati, ma a volte è necessario un post-requisito.

GNU Make Call function

GNU Make Eval function

In sostanza, Eval consente di costruire obiettivi al volo, e la chiamata di funzione permette come "definisce" da creare.

7

Basta aggiungere una nuova regola con l'ordinamento che vuoi ..

rule1: 
     echo "bye" 
rule2: 
     date 
rule3: 
     @echo "hello" 

rule4: rule3 rule1 
+0

Imho questa è una soluzione molto più bella rispetto alle altre risposte. –

+0

Semplice - Mi piace. –

+0

Ciò non imporrà l'ordine. Assicurerà semplicemente che la regola 1 e la regola 3 siano fatte prima della regola 4, nessuna garanzia sull'ordinazione – CristianDonosoC