拡張子が .xhtml の 1000 個のファイルがディレクトリ入力にあり、それらのファイルの特定のサブセット (出力パスが $(FILES) など) を xslt を介してディレクトリ出力の同じ名前のファイルに変換する必要があるとします。簡単な make ルールは次のようになります。
$(FILES): output/%.xhtml : input/%.xhtml
saxon s:$< o:$@ foo.xslt
もちろん、これは一度に 1 つのファイルを変換することで機能します。問題は、saxon のバッチ処理を使用して一度にすべてのファイルを処理したいということです。これは、ファイルの数を考えると、ファイルごとに Java と saxon をロードするオーバーヘッドを考慮すると、はるかに高速になるためです。Saxon では、-s (ソース) オプションをディレクトリにすることができ、そのディレクトリ内のすべてのファイルを処理し、-o: オプションで指定されたディレクトリに同じ名前の結果を配置します。
パターン ルールを使用して、GNU make に単一のコマンドを実行させ、複数のファイルを更新させるよく知られた手法を認識しています。
output/%.xhtml: input/%.xhtml
saxon s:input -o:output foo.xslt
しかし、私の場合、これには 2 つの問題があります。まず、変更されたファイルだけでなく、入力ディレクトリ内のすべてのファイルに対して変換を実行します。次に、変換を $(FILES) で指定されたファイルのサブセットに制限しません。パターン ルールで指定されたレシピをすべての一致するターゲットに対して 1 回だけ実行する GNU make 機能は、いわゆる「静的パターン ルール」([こちら] を参照) の場合には機能しません。ポストが知られています。
saxon のバッチ処理機能を使用するには、一時ディレクトリを作成し、処理するファイルのみをそこにコピーしてから、その一時ディレクトリを入力ディレクトリとして変換を実行する必要があります。一時ディレクトリを作成しようとしましたが、後で使用するためにターゲット固有の変数を使用してその名前を覚えています。
$(FILES): TMPDIR:=$(shell mktemp -d)
ただし、これにより、古いターゲットごとに新しい一時ディレクトリが作成されます。いずれにせよ、必要なファイルをそのディレクトリにコピーするルールを構成する方法がわかりません。現在の最上位ターゲットに関連していないものも含め、すべてのメイクファイルを解析する非再帰的なメイクシステムがあるため、メイクファイルが解析されるときに一時ディレクトリを作成したくありません。必要がない/使用されない状況のために一時ディレクトリを作成したい。
単一の入力から複数のファイルを作成することについて、過去にSOで多くの質問が寄せられたことをよく知っています。1 つの解決策は (非静的) パターン ルールです。他のソリューションには、偽のターゲットが含まれます。ただし、この場合、これらすべてをまとめる方法については行き詰まっています。
変更されたファイルを特定し、静的パターン ルールを使用してそれらをコピーできます
$(FILES): output/%.xhtml : input/%.xhtml
TMPDIR=`mktemp -d`
cp $< $(TMPDIR)
しかし、実際には、単一の cp コマンドでファイルをコピーすることを好みますが、これはファイルを 1 つずつコピーします。おそらく、ここにいくつかのアプリケーションがありcp -u
ますか?
また、更新が必要なファイルにアドホック拡張機能を使用することも検討しましたが、これを機能させる方法もわかりませんでした。いずれかのファイルが変更された場合、あきらめて、すべてのファイルに対して saxon 変換を実行しようとしていますが、何か良い方法はありますか?