我想写下这些内容:
$(foreach (var1, var2), ($(LIST1), $(LIST2)), cp $(var1) $(var2);)
如何在GNU makefile中执行此操作?
答案 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)的一个很好的候选者。您可以将文件__gmsl
和gml
放在当前目录中(或/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;