1

的問題已經回答了文件級。但我有其中有相當多的跨項目的依賴性(由的DBus頭,這是動態生成的)更大的項目。並行make - 子項目多次調用

我創建了以下內容示例example files as ZIP - 真正的項目要複雜得多)。

頂級Makefile如下:

sub-%: 
    $(MAKE) -C $(patsubst sub-%,%,[email protected]) 

default: 
    $(MAKE) -j12 sub-p1 sub-p2 sub-p3 

子項目的Makefile文件看起來像這樣(p1p2p3):

all: p1 

../lib/lib.a: 
    $(MAKE) -C ../lib lib.a 

p1: ../lib/lib.a 
    cp -f ../lib/lib.a p1 

而且的Makefile文件lib看起來是這樣的:

lib.a: 
    sleep 2 
    date > [email protected] 
    echo Done with building [email protected] 

的問題:該庫是專爲各p* -Project分別並聯 - 在這個例子中這不是一個問題,但在我們的情況下,它會導致無法解決的問題。

當我呼籲頂級make,我得到下面的輸出:

$ make 
make -j12 sub-p1 sub-p2 sub-p3 
make[1]: Entering directory '/home/kkr/tmp/parallelmake' 
make -C p1 
make -C p2 
make -C p3 
make[2]: Entering directory '/home/kkr/tmp/parallelmake/p1' 
make -C ../lib lib.a 
make[2]: Entering directory '/home/kkr/tmp/parallelmake/p2' 
make -C ../lib lib.a 
make[2]: Entering directory '/home/kkr/tmp/parallelmake/p3' 
make -C ../lib lib.a 
make[3]: Entering directory '/home/kkr/tmp/parallelmake/lib' 
make[3]: Entering directory '/home/kkr/tmp/parallelmake/lib' 
make[3]: Entering directory '/home/kkr/tmp/parallelmake/lib' 
sleep 2 
sleep 2 
sleep 2 
date > lib.a 
date > lib.a 
date > lib.a 
make[3]: Leaving directory '/home/kkr/tmp/parallelmake/lib' 
make[3]: Leaving directory '/home/kkr/tmp/parallelmake/lib' 
make[3]: Leaving directory '/home/kkr/tmp/parallelmake/lib' 
cp -f ../lib/lib.a p3 
cp -f ../lib/lib.a p1 
cp -f ../lib/lib.a p2 
make[2]: Leaving directory '/home/kkr/tmp/parallelmake/p3' 
make[2]: Leaving directory '/home/kkr/tmp/parallelmake/p1' 
make[2]: Leaving directory '/home/kkr/tmp/parallelmake/p2' 
make[1]: Leaving directory '/home/kkr/tmp/parallelmake' 

問題:是否有可能子項目莫名其妙地自動同步?

由於real project有13個子項目 - 其中大多數具有項目間依賴關係 - 手動同步將非常困難。

回答

0

很明顯沒有辦法遞歸使系統爲「自動」同步此;他們是完全獨立的流程,無法告訴對方他們正在運行給定的目標。

你有兩種選擇。第一種方法最好,但可能需要很多工作,即重新構建您的構建系統,使其不具有遞歸性。如果你有一個構建整個系統的make調用,那麼make只有一個實例,它將全局協調所有目標的創建。你根本不需要$(MAKE) -C ../lib lib.a規則。

如果這樣做不可行,那麼您需要重新編寫頂級makefile,以便強制執行排序,以便您永遠不會同時開始製作依賴於相同外部目標的兩個目錄。例如,而不是你在上面顯示頂層Makefile,寫這樣的:

default: p1 p2 p3 

p%: ; $(MAKE) -C [email protected] 

.PHONY: default p1 p2 p3 

現在假設你想確保p2p3之前p1運行,因爲你要p1建立所有共享的目標;那麼你會喜歡這個規則添加到頂層Makefile:

p2 p3: p1 

,並根據需要可以添加其它排序。

+0

我花了幾個小時試圖讓這個與並行使工作。你完全確定它有效嗎?依賴於子項目庫的鏈接規則是什麼樣的?我只能讓它每次都重新鏈接,或者在構建子項目之後甚至沒有鏈接。我的Makefile完美沒有'-j'。 – doug65536

+0

這個例子沒有提供足夠的細節來回答你的問題。這是一個抽象的高層次設計。而且,對於這些解釋,SO評論是不夠的。如果你有一個詳細的問題,我建議你用更多的細節提出一個新的問題。 – MadScientist

+0

但是,這裏的設計是可行的。如果你需要在根目錄下提供另一個目標來包裝在單個目錄級完成的所有工作,那麼這是一個完全不同的事情,這裏不討論或描述,因爲這不是這個問題所要求的。 – MadScientist

相關問題