1

ビルド システムに OMake を使用するプロジェクトがあり、かなり難しいコーナー ケースを処理しようとしています。

いくつかの定義ファイルと、これらの定義ファイルを取得して GraphViz ファイルを作成できるツールがあります。ただし、次の 2 つの問題があります。

  • 各定義ファイルは複数のグラフを作成でき、作成できるグラフのリストはファイルにエンコードされています。私のダンプ ツールには-list、定義ファイルが生成するすべてのグラフを一覧表示するオプションがあります。
  • このダンプ ツールは、ソース ツリーに組み込まれています。
  • このリストを OMakefile で利用できるようにして、他のルールを使用して DOT ファイルを SVG に変換し、偽のターゲットをすべての SVG に依存させるようにします (目標: すべてのグラフの SVG 記述を構築する単一の構築コマンド)。

最初の問題だけがあれば、簡単です。ツールを実行してリストを作成し、そのリストを使用して、ダンパーを呼び出して GraphViz ファイルを出力するターゲットを作成します。ただし、必要になる前にダンプツールを強制的にビルドすることにかなりこだわっています。

もしそうなら、ダンプツールを構築するために再帰的にmake実行するだけです。makeただし、OMake では再帰呼び出しが許可されておらず、build関数は からのみ使用できoshます。

この問題の良い解決策はありますか?

4

1 に答える 1

1

さて、これが私の提案です。まず、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は変更されたファイルまたは新しいファイルのみを変換します。

于 2010-04-13T23:26:08.437 に答える