さて、これが私の提案です。まず、bashで作成されたクイックジェネレーターを次に示します。これは、実行することのリストを含むomake変数を作成する「--list」引数を取ることができます。ジェネレーターは、名前を.shに変更して「作成」するため、「generator.txt」と呼ばれます。
#!/bin/bash
if [ "$1" = "--list" ]; then
echo -e 'FILES[] = \n\ta\n\tb\n\tc'
else
echo 1 > a.dot
echo 2 > b.dot
echo 3 > c.dot
fi
次に、OMakefile自体は次のようになります。
.INCLUDE: rules : generator.txt
cp generator.txt generator.sh
chmod 755 generator.sh
./generator.sh
./generator.sh --list > rules
DOTS[] =
$(addsuffix .dot, $(FILES))
SVGS[] =
$(addsuffix .svg, $(FILES))
# rule to turn a .dot into a .svg
%.svg: %.dot
cp $*.dot $*.svg
.DEFAULT: $(SVGS)
.PHONY: clean
clean:
rm -f generator.sh a.* b.* c.* rules
ここでの秘訣は、ジェネレーター.txtから「ルール」ファイルを生成してOMakefileに含めることです。generator.txt(ジェネレーターのソース)が変更されるたびに、ジェネレーターを再作成(ビルド)して実行し(ファイルa.dot、b.dot、c.dotを作成)、最後に--listを指定して実行して生成するファイルのリストを含むFILE[]変数。
次に、DOTS変数とSVGS変数、およびドットをsvgに変換するルールを生成するのは簡単になります。デフォルトのターゲットは、すべてを順番にビルドするsvgのリストによって異なります。
このアプローチの問題は、「INCLUDE」依存関係リストを実際のファイルにする必要があるため、ジェネレーターの構築が非常に粗いことです。それでも、これは少なくとも正しい順序で操作を実行する必要があります。
generator.txtを変更する(たとえば、生成する別の.dotを追加する、または.dotの内容を生成する方法を変更する)と、generator.shが正しく再生成され、次に生成されたファイルがどのように生成されるかに注意してください。変更されました。
編集
主な問題は、omakeが作業を開始する前に、依存関係グラフ全体を生成できることを期待していることだと思います。そのため、一部の依存関係を処理してジェネレーターを構築し、さらに依存関係を生成してその出力を処理することはできません。
回避する方法はいくつかあると思います。
1つ目は、最初に説明したように、.INCLUDEディレクティブの一部としてジェネレーターをビルドすることです。これは、すべてのジェネレータービルドプロセスをそのディレクティブに入れる必要があるため、面倒です。
2つ目は、柔軟性を失い、1つの入力から1つの出力に取り組むことです。たとえば、ジェネレーターに、すべての連結された入力を含む1つのファイルのみを生成させます。ファイルは1つしかないことがわかっているので、依存関係を簡単に設定できます。
3つ目は、私のお気に入りですが、2フェーズのビルドシステムを使用することです。サブディレクトリには、ジェネレータを生成してファイルを出力するOMakefileがあります。別のサブディレクトリには、別のOMakefileがあります。このOMakefileは、最初のディレクトリの内容を読み取って、処理するファイルのリストを生成してから、変換を実行します。次に、メインディレクトリで、bashスクリプトが最初のディレクトリでomakeを呼び出し、次に2番目のディレクトリでomakeを呼び出します。これは、1つのコマンドですべてを生成できることを意味しますが、再構築は最小限に抑えられます。最初のomakeは入力が変更された場合にのみファイルを再生成し、2番目のomakeは変更されたファイルまたは新しいファイルのみを変換します。