2012-01-17 59 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

相關問題