編譯驅動的MAKEFILE解析

一個典型的編譯驅動模塊的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是內核源碼樹的目錄,你必須根據自己的編譯環境。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章