2012-10-05 32 views
2

我需要一些與我的Makefile有關的項目幫助。源代碼目錄看起來像這樣。GNU使全局變量在子版本中更新

|-- Makefile 
|-- drivers 
| |-- Makefile 
| |-- tty 
|  |-- Makefile 
|  |-- console.c 
|  |-- keyboard.c 
|-- kernel 
| |-- Makefile 
| |-- kmain.c 

在頂層Makefile,我已出口,我想與目標文件來填充,所以我可以構建和他們在頂層Makefile鏈接在一起的變量對象。

我想要做這樣的事情,以更新,也就是說,司機/ TTY/Makefile文件對象:

OBJECTS += $(CURDIR)console.o 
OBJECTS += $(CURDIR)keyboard.o 

但是變化的對象不能上升到頂部的Makefile。我一直在看Linux源碼樹中的Makefiles,他們似乎在做類似的事情。但是,我無法讓它工作。我在這裏錯過了什麼嗎?

回答

1

你似乎是用遞歸做,像

# Makefile: 

export OBJECTS := 
all: 
    $(MAKE) -C drivers/tty 
    @echo OBJECTS is $(OBJECTS) 

# drivers/tty/Makefile: 

OBJECTS += $(CURDIR)console.o 
all: 
    whatever 

這是不行的,因爲每個製作都有自己OBJECTS;子Make不能修改父Make的變量。它是export,而不是import/exportshare(有沒有這樣的事情import/exportshare,我只是想說明)。

你可以通過你想要的效果,包括其他makefile文件,而不是調用他們:

# Makefile: 

OBJECTS := 
all: DRIVERS_TTY 
    @echo OBJECTS is $(OBJECTS) 

include drivers/tty/Makefile 

# drivers/tty/Makefile: 

OBJECTS += drivers/tty/console.o 

DRIVERS_TTY: 
    whatever 

你會發現有一些不愉快的位置依賴性那裏。 drivers/tty/Makefile裏面有「drivers/tty」,這讓維護變得很痛苦。有辦法解決這個問題,一旦你有這個基本的include技巧工作。

+0

這可能是我想要的。我想我可以讓頂層Makefile包含驅動程序/ Makefile,內核/ Makefile等,驅動器/ Makefile包含drivers/tty/Makefile等等。 Linux內核的Makefiles可能會這樣做,但它們有點難以理解,難以閱讀:) – tobier

+0

是的,你可以這樣做。我不知道Linux內核Makefiles是如何做到的。 – Beta

1

當您遞歸運行make時,會爲每個後續調用打開一個新的子shell,因此您無法使用導出來恢復鏈。一種方法是每次調用一個子程序時追加到一個對象列表文件,然後可能包含該文件。一個更好的解決方案是可能會沿着這些子文件的主文件include直接執行某些操作,而不是直接調用make。此方法允許使用每個子文件與您的OBJECTS +=語句構建OBJECTS變量。另一個額外的好處是,您只運行make的一個實例而不是多個submakes,這使得可以更好地生成依賴關係。看看http://aegis.sourceforge.net/auug97.pdf這是由用戶丹成型https://stackoverflow.com/users/95706/dan-moulding前張貼在這裏

一個很酷的編譯文件系統「被認爲是有害遞歸make」秀出真了很多很酷的東西,你可以用submake做文件都同時具有剛一個主makefile。丹的boilermake項目是在這裏:https://github.com/dmoulding/boilermake