2013-01-16 259 views
2

我正在嘗試創建一個helloworld模塊。我必須寫下如下的makefile。Linux內核模塊編程Makefile

ifneq ($(KERNELRELEASE),) 
obj-m := hello.o 
else 
KDIR := /path/to/kernel/sources 
all: 
    make -C $(KDIR) M= 'pwd' modules 
endif 

我知道這個makefile運行兩次了。它如何通過只調用一次運行兩次?

什麼時候在這裏使用obj-m值?

+0

我編輯過(它正在等待同行評議)清理文件內容格式。在進行調用之前,請檢查並確保它看起來像原始文件(包括製表符(不包括空格))。 – altendky

回答

4

這個Makefile有一個規則:

all: 
    make -C $(KDIR) M= 'pwd' modules 

英文: 「進入目錄$(KDIR)和執行make(目標是modules)」。

所以,當你使用這個Makefile調用make,調用make使用另一個makefile文件。

你應該從簡單的事情開始。如果您告訴我們您要做什麼,我們可以提供幫助。

+0

謝謝!我明白了。但是,第二次,它會調用一個不同的makefile(頂級makefile)。那麼當這個makefile中的obj-m被執行時呢? – Gomathi

+0

@Gomathi:在makefile *中顯示*,$'(KERNELRELEASE)'爲空,在這種情況下'obj-m'永遠不會被設置或提及,或者'$(KERNELRELEASE)'不* *爲空,哪種情況obj-m已設置但從未使用過(並且沒有規則,所以Make會投訴並退出)。 – Beta

+0

感謝您的解釋! – Gomathi

0

似乎這個文件可能有一個規則,但只有當KERNELRELEASE是空的。 obj-m僅被定義如果KERNELRELEASE空,在這種情況下,Makefile不會真的在一個做任何事......我猜obj-m將由內核包括本Makefile使用(已定義KERNELRELEASE後)如果你真的將它構建到內核中而不是作爲一個動態加載的模塊,它是自己的。