2012-03-08 3 views
7

とのforループを作る:GNUは、私はこれらの線に沿って何かを書きたい二つの変数

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

は、どのように私はGNUのメイクファイルでこれをやって行くのですか?

+0

? – Beta

+0

ルールの中 - –

+0

また、私はこの事を長い道のりで書いているので、私はルールの外でそれが必要になることを理解しました。 –

答えて

8

ベータ版の提案は正しい軌道に乗っているが、問題は、それは、そのようなあなたがもともと欲しかった一人として、空白を含むコマンドラインを構築する方法でそれを使用するように簡単ではないということです。

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

これは、もともとファイル名の作成を目的としていたため、joinは単語を一緒に結合するためです。しかし、あなたはトリックをすることができます。

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

あなたのリストが、その後何か他のものを選択し^文字が含まれているかもしれないと思う場合:ここでそれはあなたが捜している出力を与える結合を使用する方法の例です。これを開封して説明が必要な場合はお知らせください。

+0

これは上記の質問に基づいて私のために働いた。 –

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 

がEDIT(cpを行い、ネストされたループはあまり意味がありませんのでご注意ください。):
さて、なぜあなたがそう言っていませんでしたか?結合を使用する

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

私は1対1マッピングが必要なクロスプロダクトがほしくないので、うん。それは私の脳がループしていくものです。 –

+0

Sooooo ...あなたは正しいと答えています。あなたが持っていた質問には答えられないようです。これはあなたが望むものか、そうでないのでしょうか? – MadScientist

+0

それは私が望んでいた答えではありませんでしたが、数日後に誰も答えなかったので、私はそれを最も正確に正しい答えとしました。より良い答えがあれば投稿してください。 –

0

これはgsml(GNU Make Standard Library)の良い候補です。ファイル__gmslgmlを現在のディレクトリ(または/usr/gnu/include/usr/local/include/など)に置き、Makefileにinclude gsmlという行を追加することで、ファイルを含めることができます。それには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; 
関連する問題