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