注意这是我上一个问题的后续。
我的想法是我误解了 SCons 如何工作的一个更基本的方面,但这是我的问题的一个说明性子集:
我有一个 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
调用 Python 函数的函数,该函数将一些 C++ 代码写入target
文件。BuildNumber.h
这个构建器是用我的文件调用的,我的源代码#include
在需要的地方。
最后的Depends()
调用是每次SomeProg
重建时尝试触发构建器。
这种方法几乎奏效。在第一次构建时,一切正常,BuildNumber.h
使用正确的构建号生成。
立即重建正确地认为所有内容都是最新的并且不会重新调用IncrementBuildNumber
构建器。
但是,问题是,当我更新一个.cpp
间接依赖于BuildNumber.h
. 它对更改后的源文件进行了重建,但我猜认为 Builder 的目标是最新的,并决定不调用它。
当依赖于它的东西需要重建时,我怎样才能让 SCons “需要”调用我的构建器(或命令或任何它需要的东西)?
我感觉非常接近解决方案,但只是缺少一些关于 SCons 工作原理的最后知识。
我可能需要在这里注意,我使用的是 a VARIANT_DIR
,因此我可以在需要时删除文件......
我也尝试过AlwaysBuild()
,但你猜对了,即使 someProg 是最新的,它也总是递增。