2009-08-27 8 views
13

Sto provando a scrivere un Make Make GNU che ha un carico di bersagli simili, in cui i comandi di compilazione variano leggermente tra di loro. Sto provando a usare target-specific variables per rappresentare queste variazioni. Alcuni di questi valori variabili si riferiscono ai file che voglio utilizzare come prerequisiti. Per esempio:Variabili specifiche della destinazione come prerequisiti in un Makefile

target_1:special_filename=target1_prereq 
target_2:special_filename=target2_prereq 

target_1 target_2: common_filename $(special_filename) 
    do_something common_filename --a-weird-option=$(special_filename) 

Quando chiamo 'fare target_1', lo voglio fare target1_prereq se non esiste. Al momento, non sembra che utilizzi target1_prereq come prerequisito, anche se il comando build (do_qualcosa) viene chiamato con il parametro giusto.

Sto usando GNU Marca 3.80.


Edit: Un paio di complicazioni del sistema reale. Alcune variabili sono a loro volta basate sui valori di altre variabili. La specifica manuale dei prerequisiti non si ridimensiona. Un esempio un po 'più complicato:

target_1:special_filename_base=target1_prereq 
target_2:special_filename_base=target2_prereq 

some_filename_a = $(special_filename_base).exta 
some_filename_b = $(special_filename_base).extb 

target_1 target_2: common_filename $(special_filename_b) $(special_filename_a) 
    do_something common_filename --a-weird-option=$(special_filename_a) --second=$(special_filename_b) 

risposta

3

Una variabile specifica della destinazione è definita solo nei comandi della destinazione (o in altre assegnazioni specifiche della destinazione); non può essere usato come uno dei prerequisiti del bersaglio. Non credo ci sia un modo pulito di fare ciò che si desidera in fare, ma ci sono diversi approcci kludgey, come il seguente:

 
EXTENSIONS = .exta .extb 
target_1: $(addprefix target1_prereq,$(EXTENSIONS)) 
target_2: $(addprefix target2_prereq,$(EXTENSIONS)) 

target_1 target_2: common_filename 
    do_something common_filename --a-weird-option=$(filter %.exta,$^) --second=$(filter %.extb,$^) 
+4

Ripristinare questo thread a beneficio di chiunque altro vi si imbatta in esso. Una [soluzione più elegante] (http://stackoverflow.com/questions/9311743/make-using-target-specific-variables-in-prerequisites) utilizza l'espansione secondaria. – Seth

+0

@Seth, sono d'accordo: 'target_1 target_2: common_filename $$ (special_nomefile_base) .exta $$ (special_filename_base) .extb ...' – Beta

2

Come semplice soluzione:

 
target_1:special_filename=target1_prereq 
target_1:target1_prereq 
target_2:special_filename=target2_prereq 
target_2:target2_prereq 

target_1 target_2: common_filename $(special_filename) 
    do_something common_filename --a-weird-option=$(special_filename) 

V'è una certa ridondanza, ma è localizzato, quindi non è troppo male.

+0

Immagino che risolva il caso specifico che ho postato, ma speravo in una soluzione più generale. Modificherò con un esempio più complicato. –

2

ho trovato un modo piuttosto pulita di schivare questa limitazione . Sarebbe andare o meno così:

target_1:export special_filename_base=target1_prereq 
target_2:export special_filename_base=target2_prereq 

some_filename_a = $(special_filename_base).exta 
some_filename_b = $(special_filename_base).extb 

target_1 target_2: 
    $(MAKE) -f $(firstword $(MAKEFILE_LIST)) target-proxy 

target-proxy: common_filename $(special_filename_b) $(special_filename_a) 
    do_something common_filename --a-weird-option=$(special_filename_a) --second=$(special_filename_b) 

due punti importanti:

  1. export le variabili target, in modo che essi saranno accessibili quando abbiamo ri-eseguire il Makefile.
  2. Creare una destinazione proxy con tutti i prerequisiti originali di target_1 target_2 e in target_1 target_2 richiamare di nuovo il Makefile con questa destinazione proxy. Dal momento che l'obiettivo di variabili specifiche avranno valori da allora (siamo sono nella ricetta per quel tempo) e furono export Ed, saranno disponibili in target-proxy - voilà :)

Il rovescio della medaglia questo approccio è che stiamo creando un altro processo make - se è solo un altro allora probabilmente è ok, ma YMMV quindi stai molto attento.