2017-06-10 60 views
1

對於項目遍佈我們使用GNU作出的構建幾個子目錄。開發人員可以使用-j <number>標誌來並行化構建任務,並選擇適合其機器硬件的編號。限制併發子使

但是,我們使用第三方庫的Makefile文件都沒有安全並行 - 他們顯然依靠的對象,而不是所有的依賴目標之間明確的相關性規則隱含的順序。

由於我不想修復第三方Makefiles,我們目前使用明確的-j 1參數調用他們的Makefiles,以限制構建該庫的作業數量爲1。規則是這樣的:

third_party_lib: 
    $(MAKE) -j 1 -C [email protected] 

這部作品根據需要,然而,令發出了這樣的警告:

make[1]: warning: -jN forced in submake: disabling jobserver mode. 

,導致我在這裏問是否有更好的方法來限制人數在一個子製造中並行工作。

回答

2

您可以將.NOTPARALLEL:特殊目標添加到其不應該被並行化的makefile文件。

如果你不想修改那些可以使用命令行選項--eval生成文件(注意--eval在GNU加入使3.82):

third_party_lib: 
     $(MAKE) --eval .NOTPARALLEL: -C [email protected] 
+0

感謝您的建議。該文件指出,「任何遞歸調用make命令還是會並行運行食譜......」,所以也許我不得不改變變量做出包括--eval這個工作。將在我們的Jenkins和本地測試一段時間,然後回到這個答案。 –

+0

你是否說過這個建議在你嘗試時沒有奏效?我不確定我是否理解你對文檔的引用。遞歸make將會啓動,並且父make會將其配置爲並行運行。該'--eval'然後由遞歸化妝和'.NOTPARALLEL運行:'特殊目標將禁用並行,就像你編輯的遞歸make的Makefile中包含的值。你當然不想修改'MAKE'變量的內容。 – MadScientist

+0

我指的是從https://www.gnu.org/software/make/manual/html_node/Special-Targets.html,我把它,「任何遞歸調用make命令將仍然運行在平行食譜」,是指來自third_party_lib/Makefile的任務一次只能運行一個,但其子目錄中的Makefiles中的任務可以再次並行運行。是的,第一次測試工作,但後來偶爾出現併發錯誤,因此,這需要更多的測試運行。 –