注意これは私の前の質問からの続きです。
私の考えでは、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)
したがって、基本的には、Builder
C++ コードをファイルに書き込む Python 関数を呼び出す を作成していtarget
ます。BuildNumber.h
このビルダーは、ソース コードが必要な場所にあるファイルで呼び出され#include
ます。
最後のDepends()
呼び出しは、再構築されるたびにビルダーをトリガーしようとする試みSomeProg
です。
このアプローチはほとんど機能します。最初のビルドでBuildNumber.h
は、すべてが正しく機能し、正しいビルド番号で生成されます。
即時の再構築では、すべてが最新であると正しく見なされ、IncrementBuildNumber
ビルダーが再度呼び出されることはありません。
ただし、問題は、.cpp
間接的に依存するファイルを更新するときBuildNumber.h
です。変更されたソース ファイルの再構築を行いますが、Builder のターゲットが最新であると見なし、それを呼び出さないことを決定したと思います。
それに依存するものを再構築する必要があるときはいつでも、SCons が自分のビルダー (またはコマンドなど、必要なもの) を呼び出す必要があるようにするにはどうすればよいですか?
私は解決策にかなり近づいていると感じていますが、SCons がどのように機能するかについての最後の知識が欠けているだけです。
VARIANT_DIR
ここで、必要に応じてファイルを削除できるように、を使用していることに注意する必要があるかもしれません
...AlwaysBuild()