2011-05-20 57 views
8

我想並行化一箇舊的Makefile。臨界區並行make文件

事實上,我需要確保在編譯過程開始之前,某些生成器腳本被稱爲而不是並行

生成器在編譯之前總是被調用。有什麼辦法可以在makefile中建立一個有點關鍵的部分嗎?

Makefile很麻煩,我不想在這裏發佈它。

+1

哪個版本的make? – 2011-05-20 10:05:36

回答

3

你可以把所生成文件的規則,在一個單獨的Makefile,做這樣的事情:

generated-sources : 
     $(MAKE) -f Makefile.Generators 

然而,GNU製作,這將是默認平行。你需要壓制它,而手冊並不完全清楚你將如何做到這一點。也許下面的一些組合會工作,這取決於你想支持哪個做的實現:

  • 傳遞-j1標誌:

    generated-sources : 
         $(MAKE) -j1 -f Makefile.Generators 
    
  • 禁止MAKEFLAGS選項:

    generated-sources : 
         $(MAKE) -f Makefile.Generators MAKEFLAGS= 
    
  • Makefile.Generators中的以下行抑制並行執行:

    .NOTPARALLEL : 
    
+0

關於.NOTPARALLEL選項的註釋:該目標將忽略指定的任何前置請求。包含這個目標的任何生成文件將被強制進行串行構建。因此,您可以將需要在單獨的makefile中串行構建的東西添加到.NOTPARALLEL目標中。這與ClearCase構建工具Clearmake不同,它允許您指定一組將被視爲與並行構建相互排斥的目標。 – 2011-08-08 18:27:46

2

您可以運行所有腳本的規則,並確保所有的其他規則依賴於該規則。

all: ${SOURCES} scripts 

scripts: last_script 


first_script: 
    ./script1.sh 

second_script: first_script 
    ./script2.sh 

last_script: second_script 
    ./script3.sh 

source1.o: source1.c scripts 
    gcc source1.c -c -o source1.o 
+0

問題是這些腳本是使用來自makefile內部的屬性調用的,但它是正確的方向,謝謝 – Stasik 2011-05-20 11:12:08

+0

如果我有這樣的東西呢? – Stasik 2011-05-20 11:12:57

+0

%.a:%.b ./script3.sh $ < – Stasik 2011-05-20 11:13:56