【问题标题】:Scons Builder not re-building it's targetScons Builder 没有重建它的目标
【发布时间】: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


    【解决方案1】:

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

    这可能不是你想要的。

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

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

    【讨论】:

    • 谢谢汤姆。关于Depends(),这是有道理的。如何让我的程序依赖于我的构建器的目标? SomeProg 总是被正确编译,问题是 SCons 不会重新调用 IncrementBuildNumber 构建器,当我更改间接 #includes 它生成的文件 (BuildNumber.h) 的 cpp 文件时。我会研究一下行动后的想法。谢谢汤姆。
    • 关于你的最后一点。严格来说,BuildNumber.h 需要 SomeProg 的构建之前更新,并且只有在 SomeProg 不是最新的(因此需要重新构建)时才需要更新。如果我之后更新它不会导致 SomeProg 总是过时吗?
    • @AdamNaylor,如果您需要在构建目标之前做一些事情,请考虑使用 AddPreAction() Scons 函数。这是一个相关的答案:stackoverflow.com/a/17329704/1158895
    • 您的结果看起来与我需要的完全一样 @Brady 感谢您抽出宝贵时间查看。我会告诉你进展如何。
    • 感谢@Brady,看起来它的工作方式与预期完全一致。看起来我缺少的部分是将我的程序源作为命令的源传递。我猜 SCons 需要它来构建适当的 dep。树。随意记下答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2010-12-25
    相关资源
    最近更新 更多