2012-04-16 15 views
5

CODICE: RISULTATOCome generare target in un Makefile iterando su un elenco?

LIST=0 1 2 3 4 5 
PREFIX=rambo 

# some looping logic to interate over LIST 

ATTESO:

rambo0: 
    sh rambo_script0.sh 

rambo1: 
    sh rambo_script1.sh 

Dal momento che la mia lista ha 6 elementi, 6 obiettivi dovrebbe essere generato. In futuro, se voglio aggiungere altri obiettivi, voglio essere in grado di modificare semplicemente la mia LISTA e non toccare alcuna altra parte del codice.

Come deve essere scritta la logica di loop?

risposta

9

Utilizzare text-transforming functions. Con patsubst è possibile effettuare trasformazioni abbastanza generali. Per la costruzione di nomi di file, addsuffix e addprefix sono entrambi convenienti.

Per le regole, utilizzare pattern rules.

Il risultato complessivo potrebbe essere simile a questo:

LIST = 0 1 3 4 5 
targets = $(addprefix rambo, $(LIST)) 

all: $(targets) 

$(targets): rambo%: rambo%.sh 
    sh $< 
+0

grazie, c'è un modo vedere gli obiettivi nella loro forma finale generata? – Lazer

+0

@Lazer Non che io sappia, ma sono lontano da un esperto con la marca. L'opzione '-n' (a secco) potrebbe dirti quello che vuoi. –

+1

@Lazer, '$ (info i target sono $ (target))' – Beta

12

Se stai usando GNU make, è possibile generare obiettivi arbitrari in fase di esecuzione:

LIST = 0 1 2 3 4 5 
define make-rambo-target 
    rambo$1: 
     sh rambo_script$1.sh 
    all:: rambo$1 
endef 

$(foreach element,$(LIST),$(eval $(call make-rambo-target,$(element)))) 
Problemi correlati