2012-01-11 18 views
10

我正在使用GNU make來構建一組靜態庫,使用隱式make規則來執行此操作。這些規則運行ar(1)命令來更新庫/歸檔。分析表明,如果使用-j選項在構建過程中運行並行作業,構建時間將會縮短。如何避免在使用GNU make進行並行存檔文件構建時遇到併發問題?

不幸的是,GNU使手動有一節 http://www.gnu.org/software/make/manual/html_node/Archive-Pitfalls.html這幾乎說,讓不提供併發衛士運行AR(1),因此可以(不)腐敗存檔。該手冊進一步調查了這可能在未來得到解決。

對此的一個解決方案是使用http://code.google.com/p/ipcmd,它在運行命令之前基本上會執行信號量鎖定,從而序列化構建存檔的ar(1)命令。這個特殊的解決方案對我來說並不好,因爲我在Windows上使用基於mingw的交叉編譯工具進行構建。

有沒有更簡單或更好的解決方案來解決這個問題?

回答

2

執行歸檔爲一個單一的步驟,而不是試圖更新增量存檔:

libfoo.a: $(OBJS) 
     -rm -f [email protected] 
     $(AR) rc [email protected] $^ 
     $(RANLIB) [email protected] 
+1

我認爲你需要ranlib存檔,而不是objs。可能你也可以使用$ ^作爲規則中的對象文件。 – user1143888 2012-04-04 01:21:06

2

請嘗試以下 -

AR := flock make.lock $(AR) 

clean:: 
    rm -f make.lock 

現在AR(1)將排它鎖執行到make.lock文件,從而序列化對庫的訪問。

您可以在ranlib命令後添加一條命令來刪除文件make.lock。

export AR傳播定義子製作,如有必要。

+0

對建設中的檔案進行「聚集」是否有意義?還是'flock'以其他方式禁止訪問? – 2015-03-02 15:33:28

相關問題