2012-07-27 114 views
2

我管理一個複雜的C++項目,其構建定義寫在CMake中,構建本身是通過調用make獲得的。源代碼樹由許多模塊組成,並且具有高度的可並行性。爲並行版本調試CMake/Make dependencies

線性構建總是成功,而並行構建在大多數時候都是成功的。當在這樣的構建過程中遇到依賴關係問題時,我通常會去修復它,但我想以編程方式測試依賴關係,而不是在發生問題時解決問題。

理想的解決方案是遍歷CMake中的所有依賴關係並修正它們,但實際上這並不總是可行,因爲我們大量使用自定義宏來處理特定於源代碼樹的某種依賴關係(我不能詳談,對不起)。所以,我正在考慮以不同的方式解決問題(並且可能有效),儘可能地重用標準工具。

  1. 我首先想到的是注入了某種「隨機性」在Make作業調度,所以成型機可以嘗試無限期,直到遇到一個重建故障樹行使不同的編譯路徑。然而,另一個問題(here)指出,該功能在Make中不可用。

  2. 所以我試圖用另一種解決辦法:我創建了一個包裝腳本左右g++該睡了$RANDOM秒數,帶來一些噪音在Make工作調度。這個解決方案的缺點當然是增加了編譯時間。然而,這種部分解決方案存在一個基本缺陷:如果發現問題,則證明缺少依賴關係,但是,如果沒有生成錯誤,我們不能證明所有依賴關係都是正確的。

你覺得呢?我怎麼能達到我的目標?我更喜歡重複使用標準工具的解決方案,並且可以應用於廣泛的受衆。

謝謝。

+0

當構建失敗,不運行它再次幫助這個問題? – arrowd 2012-10-08 17:03:01

+0

@arrowdodger是的,但我希望一次就完成一次構建。 – 2012-10-08 17:41:23

+0

將'make'調用到調用'make'的腳本中,直到成功算作一次? – arrowd 2012-10-08 17:52:14

回答

2

如果你真的想要有效地解決這個問題,我認爲你需要使用更好的make。 Electric Make(ElectricAccelerator的一部分)是一款GNU兼容版本make,可在您的構建過程中監控文件系統訪問,並自動生成detect and correct problems caused by out-of-order execution。另外,ElectricMake可以生成一個annotated build log,它會顯示構建中每個作業訪問哪些文件,以及作業之間的依賴關係(顯式和隱式),您可以使用它們來糾正makefile中缺失的依賴關係。

您可以下載並試用ElectricAccelerator的免費增值版本ElectricAccelerator Huddle

聲明:我是ElectricAccelerator的架構師和技術負責人。

+0

謝謝。我會看看它。 – 2012-07-28 19:15:23

相關問題