2015-12-14 26 views
2

我試圖在用SCons構建項目時添加事件前和事件後處理操作。如何將預處理和後處理操作添加到SCons構建?

SConstruct和SConscript文件位於項目的頂部。

處理前的行動: 生成代碼(通過調用不同的工具): - >不知道將這個預處理(額外的預加工後產生的確切文件決定哪些生成的文件可以爲了與他們養活SCons的)

創建 - >運行外部腳本(蟒蛇,珍珠腳本),編譯前執行

後處理措施:

- >運行外部工具,運行外部腳本,應該是

我試了一下到現在爲止後執行:

對於前處理:

  • 要使用的操作系統。系統從python運行cmd。 (工作正常,但我正在尋找「SCons解決方案」)
  • 要使用SCons的AddPreAction(target, action)函數。不幸的是這個功能正在編制項目爲SCons的用戶手冊狀態後執行:"The specified pre_action would be executed before scons calls the link command that actually generates the executable program binary foo, not before compiling the foo.c file into an object file."

對於後處理:

  • 要使用AddPostAction(target, action)這工作得很好,幸運的。

我正在尋找一些解決方案,讓SCons以某種方式意識到這個預處理和後處理。

我的問題是:

什麼是最好的方法,對於要求如上所述,使用SCons的?有沒有辦法在使用SCons內置函數進行編譯之前執行預處理操作?

+0

其他問題:您提到了上面的兩個腳本,您可以在構建期間使用它們生成其他源文件。是否爲這些腳本生成的文件名列表是固定的,即您總是獲得相同的一組輸出文件(*不*必須具有相同的內容!)...或者這個「目標」列表取決於腳本的輸入嗎? – dirkbaechle

+0

我可以獲得不同的輸出文件,該腳本調用具有其自己的配置文件的工具。我不確切知道生成的文件是什麼。還有一個問題,腳本2依賴於由腳本生成的文件1 –

+0

好吧,現在有一個例子說明如何嘗試將您的CMD添加爲PostAction(您正在使用錯誤的語法,該方法期望目標作爲參數而不是環境)......但是如何在命令行上調用腳本?你如何在SCons中運行它看起來像? – dirkbaechle

回答

0

對於你試圖讓你的預處理部分工作的內容,你沒有提供太多的細節。一般來說,您應該嘗試爲代碼生成部分創建真正的構建器......這將使SCons(以及您作爲用戶)更容易檢測和處理依賴關係。你可能想看看我們的Wiki,在https://bitbucket.org/scons/scons/wiki/ToolsForFools,我們在那裏詳細解釋如何編寫新的建設者。

如果您需要在每個構建版本上運行其他腳本,您應該能夠在os.system()或適當的subprocess在頂級SConstruct的開始調用時觸發這些腳本。但是,我從最新的編輯中得到的結果,我主要提到你問的第一個問題,就是你試圖對某種「階段性」構建過程建模。你認爲你需要一個「預處理」階段,通過調用你的腳本,你可以在其中創建所有額外的頭文件和源代碼。我的猜測是,你正試圖重寫一些原始的make/autotools設置,並且希望儘可能地重用部分,當然這不是一個壞主意。但是SCons不是由階段驅動的,而是依賴驅動的......所以你目前的方法不合適,可能遲早會導致問題。

您可以做的最好的事情就是忘記Pre和PostActions,並直接獲得您的依賴關係。除了編寫你自己的Builder來替換你的腳本之外,你還必須爲每個這些構建器實現一個合適的Emitter。這個發射器(檢查上面提到的工具指南)必須解析進入腳本的輸入文件,並返回腳本實際運行時將生成的文件名列表。像這樣,SCons將知道先驗構建腳本運行後哪些文件會生成,並且可以使用這些名稱來解決依賴關係(即使實際文件尚不存在)。

對於後處理部分:通常通過使用標準的Python atexit處理程序來處理。見例如例如How do I run some code after every build in scons?

+0

我用一些代碼更新了我的帖子..... –

相關問題