一個典型的編譯驅動模塊的Makefile文件如下所示:
KERN_DIR = /root/driver/kernel
obj-m += module_test.o
all:
make -C $(KERN_DIR) M=`pwd` modules
.PHONY: clean
clean:
make -C $(KERN_DIR) M=`pwd` clean
解析:
(1)KERN_DIR,開發板的linux內核的源碼樹目錄,要和編譯生成的鏡像zImage屬於同一份代碼。
(2)obj-m += module_test.o,表示將我們的module_test.o編譯成一個模塊。
(3)make -C $(KERN_DIR) M=`pwd` modules
- -C參數指定內核源碼樹目錄,當執行make命令的時候會跳轉到這個目錄下去執行,而不是在當前目錄下執行make,M=`pwd`用來指定執行完make命令之後的返回目錄,也就是當前目錄。
- modules就是一個目標,所以這個語句連起來就是: 跳轉到指定的目錄下 執行 make modules,執行完之後在返回到當前的目錄,並把編譯好的模塊複製到當前目錄下;所以由此可知 modules肯定是一個內核源碼樹下的Makefile中的一個目標,這個目標定義了內核模塊的編譯規則,所以切不可胡亂改modules,所以得知,我們這裏的Makefile只不過是一個入口,真正的 模塊編譯工作是在內核源碼樹下的Makefile中進行的,所以我們才需要在這個Makefile中指定一個入口地址(也就是內核源碼樹的路徑)給我們的make管理器。
(4).PHONY:clean 聲明clean目標是一個僞目標,最後那一句也是一樣的解析,只不過定義的目標不一樣。
總結:
模塊的makefile非常簡單,本身並不能完成模塊的編譯,而是通過make -C進入到內核源碼樹下借用內核源碼的體系來完成模塊的編譯鏈接的。這個Makefile本身是非常模式化的,3和4部分是永遠不用動的,只有1和2需要動。1是內核源碼樹的目錄,你必須根據自己的編譯環境。