2012-07-09 67 views
7

前幾天我發佈了一個堆棧溢出的答案,關於如何編寫分層make(http://stackoverflow.com/questions/1498213/make-hierarchical-make-file)。答案已被刪除,因此我認爲這是完全錯誤的或脫離主題(或兩者兼而有之)。如何編寫簡單的分層Makefile?

我想知道如何編寫分層的Makefile。這是一個Makefile,它在子目錄中調用了幾個Makefile。我認爲像一個目錄結構:

- project 
    |--module1 
     |--Makefile 
     |--... 
    |--module2 
    |--Makefile 
    |--module2.1 
    |--module2.2 
    |--... 
    |--module3 
    |--Makefile 
    |--... 
    |--etc 

我還假設項目成員只僅在一組的makefile目標像最小的約定:所有(默認),清潔,安裝等。所以,下面的命令,包括使標誌將傳播到模塊:

cd project 
make clean 
make -k 
make install 
#etc 

有什麼不對的下列項目的Makefile:

PACKAGES = \ 
    module1 \ 
    module2 \ 
    emodule3 

VIRTUAL_PACKAGES = $(addsuffix /.virtual.Makefile,${PACKAGES}) 

TARGETS=clean install all 

.PHONY: $(TARGETS) 
default: all 

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS)) 

$(TARGETS): $(VIRTUAL_PACKAGES) 

$(VIRTUAL_PACKAGES): 
    $(MAKE) $(FLAGS) -C $(@D) $(MAKECMDGOALS) 

是的,$ VIRTUAL_PACKAGES在Makefile看起來很奇怪。混合for循環的替代方案是一個有點短,但我不知道這是否是更好(因爲我需要依靠的bash): PACKAGES = \ 模塊1 \ 模塊2 \ emodule3

TARGETS=clean install all 

.PHONY: $(TARGETS) 
default: all 

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS)) 

$(TARGETS): 
    for p in $(PACKAGES) ; do $(MAKE) $(FLAGS) -C $$p [email protected] || break; done 

謝謝!

+0

這是否分配給'FLAGS'工作?你使用哪個版本的Make? – Beta 2012-07-09 14:48:38

+0

非遞歸解決方案:http://stackoverflow.com/a/7321954/412080 – 2012-07-10 08:35:06

+0

可能對你有用,也可能對你沒有用處,但對於管理複雜項目,我發現cmake方法更簡單。 CMakeLists.txt的層次結構非常簡單。 Makefiles將自動生成。 – Hindol 2012-07-11 03:57:08

回答

7

這裏有「龍」。它可以完成,但影響可能會非常棘手。

Google,「被認爲有害的遞歸」。你會得到非常好的(簡單)插圖,確切地說你想要什麼(例如分層製作),以及對陷阱/問題的良好解釋。一些「迴應」將討論可能的「最佳做法」以及緩解問題的方法。然後,您可以決定提出的問題是否對您的應用程序有吸引力。

原紙:

http://miller.emu.id.au/pmiller/books/rmch/

其他一些環節:

http://c2.com/cgi/wiki?RecursiveMakeConsideredHarmful

http://dbaspot.com/configuration-management/194597-thoughts-recursive-make-considered-harmful.html