2

注意这是我上一个问题的后续。

我的想法是我误解了 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 是最新的,它也总是递增。

4

1 回答 1

0

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

这可能不是你想要的。

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

另外,如果您想更改 BuildNumber.h 作为构建 someProg 的结果,为什么不再次将其作为 post 操作呢?动作是否不止一次发生?

于 2013-07-04T10:24:20.120 回答