2013-03-30 15 views
20

Ho un sacco di applicazioni che sono costruiti con lo stesso tipo di regola make:Regola del modello Makefile per nessuna estensione?

apps = foo bar baz 

all: $(apps) 

foo: foo.o $(objects) 
    $(link) 

bar: bar.o $(objects) 
    $(link) 

baz: baz.o $(objects) 
    $(link) 

Se avessero un'estensione (ad esempio .x) ho potuto fare una regola modello simile:

%.x: %.o $(objects) 
    $(link) 

e non dovrei scrivere una nuova regola per ogni app.

Ma non hanno un'estensione, e sono abbastanza sicuro che:

%: %.o $(objects) 
    $(link) 

non funziona (perché specifica che per costruire qualsiasi file che è possibile utilizzare questa regola).

Esiste comunque una regola che copra tutte le regole di costruzione $(apps)?

risposta

6
%: %.o $(objects) 
    $(link) 

È possibile che questo dovrebbe funzionare.

È possibile limitare la portata della regola convertendolo in un static pattern rule, in modo che sia presa in considerazione solo per la vostra lista di obiettivi:

$(apps) : % : %.o $(objects) # only consider this for $(apps) targets 
    $(link) 
0
non

una risposta a ciò che si sta cercando, ma un motivo che potrebbe spiegare perché un tale livello di codice generico potrebbe non produrre buoni risultati. ....

I modelli statici si basano sulla presenza di uno stelo per abbinare e costruire una catena di dipendenze. praticamente nello stesso modo delle regole implicite (utilizzate per gli obiettivi che non hanno alcun destinatario.)

vedo quello che stavi cercando di ottenere, facendo una regola generica che soddisferà tutti i controlli di destinazione per l'oggetto e collega il tuo codice.

qualcosa di simile ::

% : % : $(rule1) 
     echo/generic code ; 

in modo che venga richiamato per tutte le applicazioni in scenari differnt

poiché non volete aggiungere un'estensione (questo diventa la radice di alcuni problemi) la il problema con questo è che l'obiettivo si rifletterà anche nella dipendenza poiché non ci sarà modo di differenziare le dipendenze dagli obiettivi.

quindi se hai provato che penso si otterrà qui ...

$ make -nf mk.t 
    mk.t:18: *** mixed implicit and static pattern rules. Stop. 

:), io darò questo un provare di nuovo domani per vedere se riesco a ottenere questo lavoro in un vero e proprio modo generico . Bella domanda però.

+0

Non sono sicuro di aver capito, stai dicendo che la risposta di [Beta] (http://stackoverflow.com/a/15718701/1131467) non è corretta? –

+0

no, non l'ho detto! , entrambe le risposte pubblicate sono corrette in teoria - in effetti stavo provando la stessa cosa.Rendere le regole del pattern statico è una scelta ovvia per questi scenari ..... ma provare a renderli troppo generici non ha funzionato. Ho appena postato la mia osservazione che mi sembrava logica, solo per farti sapere. – nsd

Problemi correlati