【问题标题】:How do I run some code after every build in scons?每次构建 scons 后如何运行一些代码?
【发布时间】:2012-01-17 20:28:43
【问题描述】:

我正在寻找一种在 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 调用来实现这一点。这样做对我来说似乎不太合适,因为它并不是真正的依赖项(严格来说,它甚至不是构建的一部分)——它只是需要在每次构建结束。

谢谢!

【问题讨论】:

    标签: build scons


    【解决方案1】:

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

    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)。希望这会有所帮助。

    【讨论】:

    • 不错的解决方案,但它仅在您构建默认目标时有效。我为此交换了你的最后两行:Depends(finish_command, BUILD_TARGETS); if 'finish' not in BUILD_TARGETS: BUILD_TARGETS.append('finish')
    【解决方案2】:

    我一直在研究这个问题,但没有发现 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      相关资源
      最近更新 更多