如何在每次构建scons后运行一些代码?

时间:2012-01-17 20:28:44

标签: build scons

我正在寻找一种在scons中注册像end-build回调这样的东西的方法。例如,我现在正在做这样的事情:

def print_build_summary():
    failures = SCons.Script.GetBuildFailures()
    notifyExe = 'notify-send '
    if len(failures) > 0:
        notifyExe = notifyExe + ' --urgency=critical Build Failed'
    else:
        notifyExe = notifyExe + ' --urgency=normal Build Succeed'

    os.system(notifyExe)

atexit.register(print_build_summary)

这仅适用于非交互模式。我希望能够在每次构建结束时弹出类似的东西,特别是在交互式scons会话中运行多个“构建”命令时。

我找到的唯一建议,环顾四周,似乎是使用依赖系统或AddPostAction调用来创建它。我这样做是不对的,因为它不是真正的依赖(严格来说,它甚至不是构建的一部分) - 它只是一个静态的代码需要在每个构建的结束。

谢谢!

2 个答案:

答案 0 :(得分:6)

我不认为使用依赖系统来解决这个问题。这就是我通常的做法:

def finish( target, source, env ):
    raise Exception( 'DO IT' )

finish_command = Command( 'finish', [], finish )
Depends( finish_command, DEFAULT_TARGETS )
Default( finish_command )

这会创建一个命令,该命令依赖于执行它的默认目标(所以你知道它总是最后运行 - 请参阅scons手册中的DEFAULT_TARGETS)。希望这会有所帮助。

答案 1 :(得分:1)

我一直在研究这个并没有发现SCons提供任何有用的东西。这似乎是一个非常有用的功能,也许SCons开发人员正在观看这些线程,并将采纳这个建议......

我查看了源代码,并想出了如何做到这一点。我将尝试在scons.org上向SCons开发人员提出此更改建议。

如果您感兴趣,该文件为engine/SCons/Script/Main.py,函数为_build_targets()。在这个功能结束时,您只需要添加对用户提供的回调的调用。当然,如果你在网络中的几台不同的机器上构建,这个解决方案将不会非常有用,因为你必须在需要的任何地方移植变更,但如果你只在一台机器上构建,那么也许你可以进行更改直到/如果SCons正式提供解决方案。

如果您需要帮助实施更改,请告诉我,我会看到我能做些什么。

另一种选择是将调用包装到SCons,并让包装器脚本执行所需的操作,但这对SCons交互模式没有帮助。

希望这有帮助,

贝迪

修改

我为此创建了一个功能请求:http://scons.tigris.org/issues/show_bug.cgi?id=2834