3

$(all_possible_inputs)を$(relevant_inputs)に制限しようとしています。$(all_possible_inputs)は、含まれている他のmakefileからの複数のファイルを連結したものです。次の関数は正しく機能しますが(perlスクリプトは余分な入力を無視する方法を知っています)、単一の入力が変更されるとすべてが再構築されます。

$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $(all_possible_inputs)
        perl $^ > $@

更新:フィルターは複数の*.step1ファイルと一致する必要があります。step1が生成された場合:

A.foo.step1
A.bar.step1
B.foo.step1
B.bar.step1
B.baz.step1

次に、step2のルールを次のように拡張する必要があります。

A.step2: routines/step2.A.pl A.foo.step1 A.bar.step1
B.step2: routines/step2.B.pl B.foo.step1 B.bar.step1 B.baz.step1

論理的には、これが私が働きたいことです。

$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $(filter $(data)/%.*.step1,$(all_possible_inputs))
        perl $^ > $@

%は、静的パターンルールの語幹と一致することになっています。*はワイルドカードであると想定されています(これは機能しないことを私は知っています)。問題は、フィルターが「%」を再利用するため、フィルター式が失敗することだと思います。二次拡張で解決できるかもしれないと思いましたが、これを試しましたが、フィルターはまだ空の文字列を返しました。

更新:ベータ版の良い提案に基づいて、$$*を使用するように例を切り替えました。

.SECONDEXPANSION:
$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $$(filter $(data)/$$*.%.step1,$(all_possible_inputs))
        perl $^ > $@

これは、Linux環境のgnumake3.81で実行されています。

4

1 に答える 1

3

あなたの3番目の方法は私のために働きます、しかしあなたはこれを試すことができます:(%最初の段階で拡張される)代わりに使用する$$*

.SECONDEXPANSION:
$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $$(filter $(data)/$$*.step1,$(all_possible_inputs))
    perl $^ > $@
于 2012-06-28T12:12:55.667 に答える