Build 如何在每次生成SCON后运行一些代码?

Build 如何在每次生成SCON后运行一些代码?,build,scons,Build,Scons,我正在寻找一种方法来注册somthing,就像scons中的最终构建回调。例如,我现在正在做这样的事情: def print_build_summary(): failures = SCons.Script.GetBuildFailures() notifyExe = 'notify-send ' if len(failures) > 0: notifyExe = notifyExe + ' --urgency=critical Build Fail

我正在寻找一种方法来注册somthing,就像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。这样做对我来说似乎不太合适,因为它不是真正的依赖关系(严格地说,它甚至不是构建的一部分)——它只是需要在每个构建结束时运行的静态代码


谢谢

我一直在研究这个问题,但没有发现烤饼能提供任何帮助。这似乎是一个非常有用的功能,也许SCons开发人员正在关注这些线程,并将采纳建议

我看了一下源代码,并想出了如何做到这一点。我将尝试向SCons.org上的SCons开发人员推荐这一更改

如果您感兴趣,文件是
engine/SCons/Script/Main.py
,函数是
\u build\u targets()
。在这个函数的末尾,您只需要向用户提供的回调添加一个调用。当然,如果您在网络中的多台不同机器上构建,此解决方案将不会非常有用,因为您必须将更改移植到所需的任何位置,但是如果您仅在一台机器上构建,那么您可以进行更改,直到/如果SCons正式提供解决方案

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

另一个选项是包装对SCON的调用,并让包装器脚本执行所需的操作,但这在SCON交互模式下没有帮助

希望这有帮助

布雷迪

编辑


我为此创建了一个功能请求:

我认为使用依赖系统来解决这个问题没有任何问题。我通常是这样做的:

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

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

这将创建一个命令,该命令的执行取决于默认目标(因此您知道它总是最后运行-请参阅scons手册中的默认目标)。希望这能有所帮助。

这是一个不错的解决方案,但它只在您构建默认目标时起作用。我把最后两行代码换成了:
Depends(finish\u命令,BUILD\u目标);如果“完成”不在生成目标中:生成目标。追加(“完成”)