Scons Builder没有重建它的目标

时间:2013-07-03 11:29:55

标签: scons

注意这是my previous question的后续内容。

我的想法是我误解了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)

所以基本上我正在创建一个调用Python函数的Builder,它将一些C ++代码写入target文件。使用我的源代码BuildNumber.h所需的#include文件调用此构建器。
最后Depends()调用是每次重建SomeProg时尝试触发构建器。

此方法几乎有效。在第一次构建时,一切正常,BuildNumber.h生成正确的内部版本号 立即重建正确地认为所有内容都是最新的,并且不会重新调用IncrementBuildNumber构建器 但问题是,当我更新间接依赖.cpp的{​​{1}}文件时。它重建了已更改的源文件,但我猜测将Builder的目标视为最新并决定不调用它。

每当依赖它的东西需要重建时,我怎样才能让SCons“需要”调用我的构建器(或命令或它需要的东西)?

我感觉非常接近解决方案但只是缺少一些关于SCons如何工作的最终知识。

我可能需要在此注意我使用的是BuildNumber.h,因此我可以根据需要删除文件...
我也试过VARIANT_DIR,但你猜对了,即使someProg是最新的,它总是递增。

1 个答案:

答案 0 :(得分:0)

首先,您的最后一行是env.Depends(some_prog, None)

这可能不是你想要的。

关于你的另一个问题,如果它在编译你的cpp文件之后没有构建'SomeProg',你是否可能只使用md5检查,在这种情况下,.o文件的内容可能会'即使你改变.h文件,实际上也会改变?因为在这种情况下,SCons不会费心重建可执行文件。

另外,如果你想更改BuildNumber.h作为构建someProg的结果,为什么不把它再次作为一个帖子操作呢?这个动作不止一次发生吗?