2012-01-17 61 views
4

我正在寻找一种方法来在scons中注册一些类似于end-build回调的东西。例如,我正在做这样的事情:如何在每次构建scons后运行一些代码?

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调用glom这。对我来说这样做并不完全正确,因为它不是真正的依赖关系(严格来说,它甚至不是真正的构建的一部分) - 它只是一个静态的代码段,需要在每个构建结束。

谢谢!

回答

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

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)。希望这可以帮助。

+0

不错的解决方案,但它只适用于你正在建立一个默认目标。我为此交换了最后2行: 'Depends(finish_command,BUILD_TARGETS);如果'完成'不在BUILD_TARGETS中:BUILD_TARGETS.append('finish')' – 2014-06-13 13:39:53

相关问题