驱动 makefile之痛

来源:互联网 发布:sql数据库表修复 编辑:程序博客网 时间:2024/05/01 15:01

      学习驱动的时候,第一驱动是关于字符设备驱动的。关于makefile,由于和应用程序的makefile不大一样啊,拿到一看很多变量什么的都没有见过。哎,makefile的基础差,尝到苦果了。无奈下载了《makefile跟我一起写》看了几遍,不得其法啊。还是解决不了我遇到的问题。百度,“armlinux 驱动 makefile”遇到有源码的,复制来,修改下,还是不行。琢磨了好些时间,差不多弄懂了原理和变量含义。

(此程序由网上程序修改的来)

     ifneq ($(KERNELRELEASE),)
  obj-m :=demo.o                                                                   
else

#KERNELDIR ?=/usr/src/linux-headers-2.6.31-14/                                 
PWD := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build


default:
 $(MAKE) -C $(KDIR) M=$(PWD)(进入两个目录,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。)

clean:
 rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c
 rm -rf Module.markers Module.symvers modules.order

endif

      原理:当我们敲下make时,我们进入了这个权威的makefile二次。第一次进入makefile,发现KERNELRELEASE没有被设置时,于是她根据build这个符号链接定位内核源代码目录,然后进入default,开始第二个make,-C选项进入内核源代码目录,找到顶层的makefile,然后-M返回当前目录执行makefile文件,这就是第二次进入这个makefile,在这次,由于KERNELRELEASE变量已经定义,因此不需要进入else语言,在这里,obj-m:=demo.o这个语句和我们以前不是驱动程序中的makefile不同,在这里内核会帮你处理一切,这句话是告诉内核,需要从demo.o创建一个驱动模型(module)。

(本段来自CSDN博客,转载请标明出处:http://blog.csdn.net/abc19842008/archive/2008/02/14/2095836.aspx)

此处的KDIR,(见#项)有别人指定的内核源码:/usr/src/linux-2.6.31/include.在我的环境下一直没有编译成功。纠结了几天。郁闷!

原创粉丝点击