1. 程式人生 > >寫一個驅動通用的Makefile

寫一個驅動通用的Makefile

sha 驅動 指向 modules pan tails current strong lean

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