2

注意これは私の前の質問からの続きです。

私の考えでは、SCons がどのように機能するかのより基本的な側面の 1 つを誤解していますが、ここに私の問題の例示的なサブセットを示します。

(本質的に) を含む SConscript ファイルがあります。

def IncrementBuildNumber(env, target, source):
    #write some #define's to 'target' file using vanilla python code
    return None

someProg = env.Program('SomeProg', source_list)

buildNumber = env.Builder(action = IncrementBuildNumber)
buildNumber_h = buildNumber(env, env.GetBuildPath('BuildNumber.h'), [])
env.Depends(someProg, buildNumber_h)

したがって、基本的には、BuilderC++ コードをファイルに書き込む Python 関数を呼び出す を作成していtargetます。BuildNumber.hこのビルダーは、ソース コードが必要な場所にあるファイルで呼び出され#includeます。
最後のDepends()呼び出しは、再構築されるたびにビルダーをトリガーしようとする試みSomeProgです。

このアプローチはほとんど機能します。最初のビルドでBuildNumber.hは、すべてが正しく機能し、正しいビルド番号で生成されます。
即時の再構築では、すべてが最新であると正しく見なされ、IncrementBuildNumberビルダーが再度呼び出されることはありません。
ただし、問題は、.cpp間接的に依存するファイルを更新するときBuildNumber.hです。変更されたソース ファイルの再構築を行いますが、Builder のターゲットが最新であると見なし、それを呼び出さないことを決定したと思います。

それに依存するものを再構築する必要があるときはいつでも、SCons が自分のビルダー (またはコマンドなど、必要なもの) を呼び出す必要があるようにするにはどうすればよいですか?

私は解決策にかなり近づいていると感じていますが、SCons がどのように機能するかについての最後の知識が欠けているだけです。

VARIANT_DIRここで、必要に応じてファイルを削除できるように、を使用していることに注意する必要があるかもしれません
...AlwaysBuild()

4

1 に答える 1

0

まず、最後の行は次のようになりenv.Depends(some_prog, None)ます。

それはおそらくあなたが意図したものではありません。

他の質問については、cpp ファイルをコンパイルした後に「SomeProg」をビルドしていない場合、md5 チェックのみを使用している可能性はありますか?その場合、.o ファイルの内容が実際には変更されない可能性はありますか? .h ファイルを変更しても?その場合、SCons は実行可能ファイルの再構築を気にしないためです。

また、someProg をビルドした結果、BuildNumber.h を変更したい場合は、再度 post アクションとして入れてみませんか? アクションは複数回発生しますか?

于 2013-07-04T10:24:20.120 に答える