的問題已經回答了文件級。但我有其中有相當多的跨項目的依賴性(由的DBus頭,這是動態生成的)更大的項目。並行make - 子項目多次調用
我創建了以下內容示例(example files as ZIP - 真正的項目要複雜得多)。
頂級Makefile
如下:
sub-%:
$(MAKE) -C $(patsubst sub-%,%,[email protected])
default:
$(MAKE) -j12 sub-p1 sub-p2 sub-p3
子項目的Makefile文件看起來像這樣(p1
,p2
和p3
):
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個子項目 - 其中大多數具有項目間依賴關係 - 手動同步將非常困難。
我花了幾個小時試圖讓這個與並行使工作。你完全確定它有效嗎?依賴於子項目庫的鏈接規則是什麼樣的?我只能讓它每次都重新鏈接,或者在構建子項目之後甚至沒有鏈接。我的Makefile完美沒有'-j'。 – doug65536
這個例子沒有提供足夠的細節來回答你的問題。這是一個抽象的高層次設計。而且,對於這些解釋,SO評論是不夠的。如果你有一個詳細的問題,我建議你用更多的細節提出一個新的問題。 – MadScientist
但是,這裏的設計是可行的。如果你需要在根目錄下提供另一個目標來包裝在單個目錄級完成的所有工作,那麼這是一個完全不同的事情,這裏不討論或描述,因爲這不是這個問題所要求的。 – MadScientist