GNU Make for循环有两个变量

时间:2012-03-08 18:11:44

标签: makefile gnu

我想写下这些内容:

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

如何在GNU makefile中执行此操作?

3 个答案:

答案 0 :(得分:9)

Beta建议使用join是正确的,但问题是以构造包含空格的命令行的方式使用它并不容易,例如你最初想要的那个:

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

因为join将单词连接在一起:它最初用于构造文件名。但是你可以玩耍;这是一个使用连接的方法的示例,它为您提供所需的输出:

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

如果您认为自己的列表可能包含^个字符,请选择其他内容。如果您需要解压缩/解释,请告诉我。

答案 1 :(得分:3)

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

(请注意,执行cp的嵌套循环没有多大意义。)

修改:
那你为什么不这么说呢?

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

答案 2 :(得分:0)

这是gsml(GNU Make Standard Library)的一个很好的候选者。您可以将文件__gmslgml放在当前目录中(或/usr/gnu/include/usr/local/include/等)并添加第include gsml行来包含它你的Makefile。它包含pairmap函数,它完全符合您的要求(即zipWith)。

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

输出

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