doc.pdf
がターゲットであると想定します。
次のルールは、doc.pdf
が更新されるたびにdoc.refer
の再生成をトリガーしますが、doc.refer
がまったく存在しない場合にも満足します。
doc.pdf: doc.mom $(wildcard doc.refer)
pdfmom -e -k < $< > $@
ただし、次のパターンルールでは同じことが実現されません(PDFは正しく生成されますが、doc.refer
を変更しても再構築はトリガーされません)。
%.pdf: %.mom Makefile $(wildcard %.refer)
pdfmom -e -k < $< > $@
%
文字が展開される前にwildcard
コマンドが実行されていると思います。どうすればこれを回避できますか?
The GNU Make function wildcard
は、シェルグロビングパターンを受け取り、そのパターンに一致するファイルに展開します。パターン%.refer
は、シェルのグロビングパターンを含みます。
あなたはおそらく次のようなものが必要です
%.pdf: %.mom %.refer
pdfmom -e -k < $< > $@
%.pdf: %.mom
pdfmom -e -k < $< > $@
最初のターゲットは、.mom
とがある場合にPDFファイルを作成するために呼び出され、.refer
ファイルはドキュメントのベース名に使用できます。2番目のターゲットは、.refer
ファイルが使用できない場合に呼び出されます。
これらのターゲットの順序は重要です。
あなたはおそらく Secondary Expansion を使用することができます:
.SECONDEXPANSION:
%.pdf: %.mom Makefile $$(wildcard %.refer)
pdfmom -e -k < $< > $@
GNU Makeは、パターンルールの内部表現を生成するためにすべての関数を評価します。
したがって、$(wildcard %.refer)
は、ルールに対して空の文字列と評価されました。
あなたの目標を達成する唯一の方法は、Kusalanandaのようなルールの順序付けを利用することです(info "(make)Pattern Match")
:
10.5.4 How Patterns Match
It is possible that more than one pattern rule will meet these
criteria. In that case, 'make' will choose the rule with the shortest
stem (that is, the pattern that matches most specifically). If more
than one pattern rule has the shortest stem, 'make' will choose the
first one found in the makefile.