歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

驅動程序簡單Makefile編寫

以前編寫完驅動程序,總是改一下其他驅動程序的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時刪除哪些文件。

Copyright © Linux教程網 All Rights Reserved