Как мне запустить код после каждой сборки в scons? - PullRequest
4 голосов
/ 18 января 2012

Я ищу способ зарегистрировать что-то вроде обратного вызова в 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, чтобы отключить это.Мне кажется не совсем правильным делать это таким образом, так как это на самом деле не является зависимостью (строго говоря, это даже не часть сборки) - это просто статический кусочек кода, который нужно запустить наконец каждой сборки.

Спасибо!

Ответы [ 2 ]

6 голосов
/ 15 июля 2012

Я не думаю, что есть что-то не так с использованием системы зависимостей для решения этой проблемы. Вот как я обычно это делаю:

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

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

Это создает команду, которая зависит от целей по умолчанию для ее выполнения (поэтому вы знаете, что она всегда будет выполняться последней - см. DEFAULT_TARGETS в руководстве по scons). Надеюсь, это поможет.

1 голос
/ 13 февраля 2012

Я изучал это и не обнаружил, что SCons предлагает что-нибудь, что могло бы помочь.Это кажется довольно полезной функцией, может быть, разработчики SCons следят за этими потоками и примут предложение ...

Я посмотрел на исходный код и выяснил, как это сделать.Я постараюсь предложить это изменение разработчикам SCons на scons.org.

Если вам интересно, файл - engine/SCons/Script/Main.py, а функция - _build_targets().В конце этой функции вам просто нужно добавить вызов к обратному вызову, предоставленному пользователем.Конечно, это решение не будет очень полезным, если вы будете строить на нескольких разных машинах в своей сети, так как вам придется переносить изменения везде, где это необходимо, но если вы строите только на одной машине, то, возможно, вы могли бы внести измененияпока / если SCons официально не предоставит решение.

Дайте мне знать, если вам нужна помощь в реализации изменения, и я посмотрю, что я могу сделать.

Другой вариант - заключить вызовв SCons и заставить скрипт-оболочку выполнять нужные действия, но это не поможет в интерактивном режиме SCons.

Надеюсь, это поможет,

Brady

EDIT :

Я создаю запрос функции для этого: http://scons.tigris.org/issues/show_bug.cgi?id=2834

...