2012-06-21 76 views
6

我使用SCons在工作中構建項目,並且我試圖通過GCC的文本輸出進行解析,以生成所有編譯器警告的摘要報告每個目標因爲我們的構建腳本很長,並且有很多文本輸出到控制檯。SCons:保存/重定向gcc文本輸出(警告)

我已經在Google和這個網站上搜索了很長一段時間,而且我找不到SCons爲了實現這個目的而內置的方法。我已經嘗試將整個stdout和stderr流重定向到每個this example的文件,但只有SCons本身的輸出被捕獲,而不是它調用的任何工具。

我的下一個想法是找到SCons編譯發送給GCC的參數,並在參數字符串的末尾添加重定向。在閱讀文檔之後,似乎構建變量CCCOMCXXCOM包含用於編譯的命令行。但是,當我將下面的行添加到SConstruct中時,SCons正在執行的命令行中沒有任何更改。

baseEnv['CCCOM'] += " 2> gcc-c-output.txt" 
baseEnv['CXXCOM'] += " 2> gcc-cxx-output.txt" 

一兩件事,做的工作是對整個SCons的命令重定向stderr流:

scons 2> stderr.txt 

我想避免這種情況,但是,如果可能的話中包含SCons的一切。輸出也不一定要去一個文件。它可以保存在任何地方,只要我可以訪問它來解析並在構建結束時保存到文件。

我已經搜索了這麼久,並沒有提出任何東西,所以我不知道還有什麼要嘗試。我必須相信,我不是第一個想要這樣做的人。

回答

5

我想在這裏回答我自己的問題,因爲我知道我做錯了什麼。 CCCOMCXXCOM變量是正確的變量,但問題是我正在創建共享庫對象,所以這些變量沒有被使用。我應該修改的是SHCCCOMSHCXXCOM

下面的代碼得到了重定向GCC警告輸出完成工作(警告和錯誤僅寫入標準錯誤):

baseEnv['SHCCCOM'] += " 2> gcc-c-output.txt" 
baseEnv['SHCXXCOM'] += " 2> gcc-cxx-output.txt" 

希望這個答案可以幫助別人,因爲我無法找到這麼多資訊主題搜索時。

0

而不是CCCOMCXXCOM建設變數,你有沒有嘗試過CCCXX變量?以防萬一,以防萬一SCons施工變量的完整列表。

您甚至可以考慮將CCCXX設置爲系統中執行內部重定向的腳本。

編輯:我忘了提及CCCOMCXXCOM變量是用於實際編譯源文件和所有CFlags等命令。我很驚訝你能夠設置它們,因爲我認爲它們是隻讀的變量。

+0

我知道這些變量的命令實際上是用來編譯這就是爲什麼我他們認爲他們是很好的候選人,但SCons似乎忽略了我的修改。我甚至嘗試將它們的值設置爲空字符串,並且它仍然編譯正常。我覺得有些事情是不對的,因爲我已經看到它在搜索解決方案時修改這些變量。不過,我並沒有考慮包裝GCC可執行文件。我會在等待可能更多SCONSy的答案時探索該選項。 – EarlCrapstone

+0

@EarlCrapstone,我很肯定這兩個變量的值會改變(將被覆蓋)爲每個編譯的cc文件,所以我不會驚訝你的mods沒有做任何事情。嘗試使用CC和CXX,這些確實會有所作爲。我修改了它們來指定一個不同的編譯器,並且確實有效。 – Brady

+0

我知道自己做錯了什麼,但是因爲我是新人,所以不會讓我回答自己的問題四個小時。 @Brady在構建過程中,這些變量實際上沒有改變。我的問題是我正在構建共享庫對象,所以它使用'SHCCCOM'和'SHCXXCOM'來代替。 – EarlCrapstone

3

要完全控制,可以覆蓋env['SPAWN']構造變量。然後您將提供一個Python方法,該方法將負責執行通過參數給出的命令行。通常,你會接受這個參數併產生一個子進程(使用某種形式的subprocess.Popen)。這將作爲默認env['SPAWN']的傳遞替換。

但是現在,您可以完全控制subprocess.Popen調用。您可以自由將STDOUTSTDERR或兩者重定向到任何緩衝區/文件。在將其打印到控制檯和/或將其保存到文件之前,您還可以對該輸出進行後處理。例如,我已經用它來以黃色顯示警告,以紅色顯示錯誤。

有關如何覆蓋env['SPAWN']的示例代碼,請查看SCons Wiki上的this page

+0

當命令行變得太長,scons使用臨時文件執行鏈接步驟時,SPAWN方法會在Windows上中斷。 :( – Nick

0

用法如下;

baseEnv['CCCOM'][0] += " 2> gcc-c-output.txt"

0

如何:

baseEnv['SHCCCOM'] += " 2> ${SOURCE}gcc-c-output.txt" 
baseEnv['SHCXXCOM'] += " 2> ${SOURCE}gcc-cxx-output.txt" 

這應該給你的每一個源文件一個單獨的文件..