寫一個驅動通用的Makefile
1.Makefile模板
#generate the path
CURRENT_PATH:=$(shell pwd)
#the absolute path
LINUX_KERNEL_PATH:=/home/steven/PCU/linux-2.6.35.3
#complie object
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
obj-m +=hello.o
2.關鍵詞解釋
(1) shell pwd: 會取得當前工作路徑
(2) LINUX_KERNEL_PATH: 該變量便是當前內核的源代碼目錄
(3) CURRENT_PATH: 當前模塊程序代碼目錄(假設為:/home/study/prog/mod/hello/)
(4) make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules //編譯模塊,首先改變目錄到-C選項指定的位置(即內核源代碼目錄),M=選項讓該Makefile在構造modules 目標之前返回到模塊程序代碼目錄;然後,modules目標指向obj-m變量中設定的模塊
在上面的例子中,我們將該變量設置成hello.o
3.編譯說明
由於make後面沒有目標,所以make會在Makefile中的第一個不是以.開頭的目標作為默認的目標執行,於是all成為make的目標。
make會執行 make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules ,假設當前內核版本的路徑為/home/steven/PCU/linux-2.6.35.3,所以整句話實際運行的是
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules <==> make -C /home/steven/PCU/linux-2.6.35.3 M=/home/study/prog/mod/hello/ modules
-C 表示到存放內核的目錄執行其makefile;
M=$(CURRENT_PATH) 表示返回到當前目錄,再次執行makefile
modules 表示翻譯成模塊的意思
obj-m +=hello.o 表示會將hello.o目標編譯成hello.ko模塊,換模塊的時候只需要把hello.o換成對應的目標文件即可
參考博客:http://blog.csdn.net/shanzhizi/article/details/8626474
寫一個驅動通用的Makefile