$(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で実行されています。