以前編寫完驅動程序,總是改一下其他驅動程序的Makefile來編譯自己的驅動,今天自己揣摩著寫了一個,弄了半天終於好使了,總結一下。
先把Makefile拷貝如下:
ifneq ($(KERNELRELEASE),)
obj-m := led.o
else
PWD := $(shell pwd)
KVER ?= 2.6.31
KDIR :=/usr/local/linux-2.6.31
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif
現在來逐行解釋一下
ifneq ($(KERNELRELEASE),)
標准的解釋是 如果已定義KERNELRELEASE,則說明是從內核構造系統調用的,因此用其中的語句。我也不太明白神馬意思,我的理解,比如我們編譯內核時,可能需要編譯這個驅動,這時候就不用我們自己寫驅動,僅僅個人理解而已,希望大神指教。
obj-m := led.o
這句話告訴編譯器有一個模塊從目標文件led.o中構造,而構造成的的模塊編譯器會命名為led.ko。如果我們的模塊有兩個文件比如file1.c和file2.c生成,我們可以改成如下:
obj-m:=led.o
led-objs:=file1.o file2.o
接著分析
PWD := $(shell pwd)
KVER ?= 2.6.31
KDIR :=/usr/local/linux-2.6.31
指定一些變量後邊用到
$(MAKE) -C $(KDIR) M=$(PWD)
這句是生成模塊的比較關鍵的一句,不同的版本寫法可能會不一樣,那麼怎麼知道你的應該怎麼寫
你可以查看Documentation/kbuild/modules.txt文檔,下邊把裡邊比較關鍵的幾句摘錄如下:
我采用的是上邊那種寫法,因為我是交叉編譯,用的是另外一個操作系統的源碼來生成驅動,如果你寫的驅動就是要在你當前使用的操作系統中運行,你可以用下邊一句。
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif
就是指定當make clean時刪除哪些文件。