2012-04-16 9 views
5

Code:Wie erstelle ich Ziele in einem Makefile, indem ich über eine Liste iteriere?

LIST=0 1 2 3 4 5 
PREFIX=rambo 

# some looping logic to interate over LIST 

Erwartetes Ergebnis:

rambo0: 
    sh rambo_script0.sh 

rambo1: 
    sh rambo_script1.sh 

Seit meiner Liste 6 Elemente, 6 Ziele erzeugt werden soll. Wenn ich in Zukunft weitere Ziele hinzufügen möchte, möchte ich nur meine LISTE ändern und keinen anderen Teil des Codes berühren.

Wie sollte die Schleifenlogik geschrieben werden?

Antwort

9

Verwenden Sie text-transforming functions. Mit patsubst können Sie ziemlich allgemeine Umwandlungen vornehmen. Zum Erstellen von Dateinamen sind addsuffix und addprefix beide bequem.

Verwenden Sie für die Regeln pattern rules.

Das Gesamtergebnis wie folgt aussehen könnte:

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

all: $(targets) 

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

Dank, ist es eine Möglichkeit, um die Ziele in ihrer endgültigen generierten Form zu sehen? – Lazer

+0

@Lazer Nicht, dass ich weiß, aber ich bin weit von einem Experten mit make. Die Option "-n" (Trockenlauf) könnte Ihnen sagen, was Sie wollen. –

+1

@Lazer, '$ (Info die Ziele sind $ (Ziele))' – Beta

12

Wenn Sie mit GNU machen, können Sie beliebige Ziele zur Laufzeit erzeugen:

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)))) 
Verwandte Themen