2012-04-16 12 views
5

CÓDIGO: RESULTADO¿Cómo generar objetivos en un Makefile al iterar sobre una lista?

LIST=0 1 2 3 4 5 
PREFIX=rambo 

# some looping logic to interate over LIST 

ESPERADO:

rambo0: 
    sh rambo_script0.sh 

rambo1: 
    sh rambo_script1.sh 

Desde mi lista tiene 6 elementos, 6 objetivos deben generarse. En el futuro, si quiero agregar más objetivos, quiero poder modificar mi lista y no tocar ninguna otra parte del código.

¿Cómo se debe escribir la lógica de bucle?

Respuesta

9

Utilice text-transforming functions. Con patsubst puedes hacer transformaciones bastante generales. Para construir nombres de archivo, addsuffix y addprefix son convenientes.

Para las reglas, use pattern rules.

El resultado global podría ser algo como esto:

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

all: $(targets) 

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

gracias, hay una manera de para ver los objetivos en su forma generada final? – Lazer

+0

@Lazer No es que yo sepa, pero estoy lejos de ser un experto con marca. La opción '-n' (ejecución en seco) podría decirle lo que quiere. –

+1

@Lazer, '$ (info los objetivos son $ (objetivos))' – Beta

12

Si estás usando GNU make, puede generar objetivos arbitrarios en tiempo de ejecución:

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)))) 
Cuestiones relacionadas