2012-01-05 33 views
4

我有一個主要的內核模塊,與其他內核模塊進行通信。我已經結構化這樣的模塊(概念):Makefile變量替換顯然沒有完成即使:=在聲明中使用

main module/ 
      | 
      \drivers/ 
        | 
        |\driver1 
        |\driver2 
        \driver3 

由於這些內核模塊,我需要編譯他們是這樣的:

make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules 

然而,由於驅動程序的Makefile文件可以被稱爲之前的目錄中,我需要在調用其他make(linux的make)之前執行$(shell pwd)。因此,Makefile現在看起來像這樣:

CURRENT_DIR := $(shell pwd) 

.PHONY: all 
all: 
    $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(CURRENT_DIR) modules 

到目前爲止,它很好,它的工作原理完美。問題是這樣的:我有一個驅動程序需要包含的文件,所以我必須提供包含路徑。我第一次嘗試

EXTRA_CFLAGS += -I../.. 

並立即明白了爲什麼它不起作用(相對路徑將是/ lib/module/...不是當前目錄)。所以我把它改爲:

MAIN_MODULE_HOME := $(CURRENT_DIR)/../.. 
EXTRA_CFLAGS += -I$(MAIN_MODULE_HOME) 

奇怪的是,這是行不通的!如果我寫

EXTRA_CFLAGS += -Ipath/I/get/from/pwd/../.. 

手動,它編譯!有人能解釋我做錯了什麼嗎?致電前,我echo ed $(CURRENT_DIR)$(MAIN_MODULE_HOME)和變量是有意義的。

我知道EXTRA_CFLAGS不立即進行評估,但由於CURRENT_DIRMAIN_MODULE_HOME:=聲明我不明白事情是如何得到搞砸。

(如果任何人都可以短語問題的標題更好,請不要!)

回答

7

你應該通過EXTRA_CFLAGS做出這樣的:

$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(CURRENT_DIR) \ 
      EXTRA_CFLAGS="$(EXTRA_CFLAGS)" modules 

更新:

驅動1的含量/ Makefile文件被讀兩次:第一次 - 當你驅動1目錄中運行make,第二 - 通過的kbuild系統。

首先,CURRENT_DIR := $(shell pwd)被評估爲類似於/home/users/.../main module/drivers/driver1的東西。其次,評估kbuild的向CURRENT_DIR := $(shell pwd)/usr/src/linux-headers-2.6.32-33-generic/

LDD3, ch2, p24

訣竅是寫你的makefile如下描述的情況:

# If KERNELRELEASE is defined, we've been invoked from the 
# kernel build system and can use its language. 
ifneq ($(KERNELRELEASE),) 
    obj-m := hello.o 
# Otherwise we were called directly from the command 
# line; invoke the kernel build system. 
else 
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build 
    PWD := $(shell pwd) 
default: 
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 
#endif 
+0

豎起大拇指!任何解釋爲什麼Eldar的答案不起作用? – Shahbaz 2012-01-05 16:11:47

+0

+1,非常簡單的解決方案。 – 2012-01-05 16:19:17

+0

關於您添加的行:_Kbuild系統不使用EXTRA_CFLAGS和其他一些環境變量._我懷疑這是真的。我**使用'EXTRA_CFLAGS'和-I/path/to /什麼,它工作。問題出在什麼時候/ path/to /什麼變量裏面。否則,似乎使用了'EXTRA_CFLAGS' – Shahbaz 2012-01-05 22:19:48

0

它最有可能的,因爲EXTRA_CFLAGS遞歸的味道,這被實際子化妝擴展,從而不必訪問MAIN_MODULE_HOME來自它。

首先,嘗試導出MAIN_MODULE_HOME:使用前

export MAIN_MODULE_HOME 

我也試圖扁平化EXTRA_CFLAGS(但是,我不知道這是否是kbuild的一個很好的做法):

EXTRA_CFLAGS := $(EXTRA_CFLAGS) 
+0

我試圖出口,它沒有工作(雖然什麼你說的完全合理),奇怪的是,你的第二個建議(弄平'EXTRA_CFLAGS'也不行。 – Shahbaz 2012-01-05 16:08:54

+0

@Shahbaz,好吧,就像猜測一樣,Kbuild可能會檢查'EXTRA_CFLAGS'變量的來源,如果它來了不從命令行可能會被忽略。 – 2012-01-05 16:24:58