編譯驅動Makefile解析
#ubuntu的核心原始碼樹,如果要編譯在ubuntu中安裝的模組就開啟這2個 #KERN_VER = $(shell uname -r) #KERN_DIR = /lib/modules/$(KERN_VER)/build # 開發板的linux核心的原始碼樹目錄 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
/**************Makefile分析*******************/
obj-m += module_test.o
表示將我們的module_test.o編譯成一個模組。
make -C $(KERN_DIR) M=`pwd` modules
-C $(KERN_DIR) :引數指定核心原始碼樹目錄,當執行make命令的時候會跳轉到這個目錄下去執行,而不是在當前目錄下執行make,
這個也是為什麼在ubuntu和開發板執行模組時,KERN_DIR不同的原因。
M=`pwd` :“ ` ”這裡不是但引號,是單反引號,用來指定執行完make命令之後的返回目錄,也就是當前目錄
modules就是一個目標,所以這個語句連起來就是: 跳轉到指定的目錄下 執行 make modules,執行完之後在返回到當前的目錄,並把編譯好的模組複製到當前目錄下;所以由此可知
modules肯定是一個核心原始碼樹下的Makefile中的一個目標,這個目標定義了核心模組的編譯規則,所以切不可胡亂改modules,所以得知,我們這裡的Makefile只不過是一個入口,真正的
模組編譯工作是在核心原始碼樹下的Makefile中進行的,所以我們才需要在這個Makefile中指定一個入口地址(也就是核心原始碼樹的路徑)給我們的make管理器。
.PHONY:clean
宣告clean目標是一個偽目標
最後那一句也是一樣的解析,只不過定義的目標不一樣。
總結:模組的makefile非常簡單,本身並不能完成模組的編譯,而是通過make -C進入到核心原始碼樹下借用核心原始碼的體系來完成模組的編譯連結的。這個Makefile本身是非常
模式化的,3和4部分是永遠不用動的,只有1和2需要動。1是核心原始碼樹的目錄,你必須根據自己的編譯環境
索引文獻:https://www.cnblogs.com/deng-tao/p/5935985.html