2012-03-08 8 views
7

Quiero escribir algo en este sentido:GNU Make para el bucle con dos variables

$(foreach (var1, var2), ($(LIST1), $(LIST2)), cp $(var1) $(var2);) 

¿Cómo voy a ir haciendo esto en un makefile GNU?

+0

Dentro de una regla o fuera? – Beta

+0

Dentro de una regla: –

+0

Además, mientras escribo esto, me di cuenta de que lo necesitaría fuera de una regla. –

Respuesta

8

de Beta utilizar unirse a está en el camino correcto, pero el problema es que no es tan fácil de utilizar de una manera que construye una línea de comandos que contiene espacios en blanco, como el que usted quería originalmente:

$(foreach (var1, var2), ($(LIST1), $(LIST2)), cp $(var1) $(var2);) 

porque une une palabras: se diseñó originalmente para construir nombres de archivo. Sin embargo, puedes jugar un truco; he aquí un ejemplo de una forma de utilizar la combinación que da la salida que busca:

$(subst ^, ,$(join $(addprefix cp^,$(LIST1)),$(patsubst %,^%;,$(LIST2)))) 

Si cree que sus listas podrían contener caracteres ^ entonces elegir otra cosa. Avíseme si necesita esto desempaquetado/explicado.

+0

Esto funcionó para mí en base a la pregunta anterior. –

2
LIST1 := a b c 
LIST2 := 1 2 3 

# outside a rule: 
$(foreach var1, a b c, $(foreach var2, 1 2 3, $(info $(var1)_$(var2)))) 

# inside a rule: first line starts with a TAB, all the rest are spaces 
all: 
    @for x in $(LIST1);\ 
    do \ 
     for y in $(LIST2);\ 
     do\ 
     echo $$x $$y; \ 
     done \ 
    done 

(Tenga en cuenta que un bucle anidado que hace cp no tiene mucho sentido.)

EDIT:
Bueno ¿por qué no lo dijiste? sugerencia

LIST3 := $(join $(LIST1),$(LIST2)) 
+1

Sí, porque no quiero el producto cruzado, necesito un mapeo uno a uno. Eso es lo que tiene mi cerebro funcionando en bucles. –

+0

Sooooo ... marcó esta respuesta como correcta. No parece responder a la pregunta que tenías. ¿Es esto lo que querías, o no? – MadScientist

+0

Esa no es la respuesta que quería, pero nadie respondió después de unos días, por lo que la marqué como la respuesta más relativly correcta. Si tienes una mejor respuesta, publica. –

0

Este es un buen candidato para gsml (GNU Make Standard Library). Puede incluirlo colocando los archivos __gmsl y gml en el directorio actual (o en /usr/gnu/include, /usr/local/include/ etc.) y agregando la línea include gsml en su archivo Makefile. Incluye la función pairmap, que hace exactamente lo que desea (es decir, zipWith).

include gmsl 
cp2 = cp $1 $2; 
zip = $1 : $2 
$(LIST2): 
    @echo $(call pairmap, zip, $(LIST1), $(LIST2)) 
    $(call pairmap, cp2, $(LIST1), $(LIST2)) 

salidas

$ make 
A : 1 B : 2 C : 3 D : 4 
cp A 1; cp B 2; cp C 3; cp D 4; 
Cuestiones relacionadas