linux驱动模块Makefile解
2016-08-23 11:52
465 查看
linux驱动模块Makefile解析
以下是一个经典的编译一个linux设备驱动的Makefile代码,此Makefile可以完成对大部分驱动的编译,使用时只需要稍加修改就可以了。
$(warning KERNELRELEASE=$(KERNELRELEASE)) ifeq ($(KERNELRELEASE),) #KERNELDIR ?= /home/linux/linux3.14/ KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) MYMOD := hello modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules* .PHONY: modules modules_install clean else obj-m := $(MYMOD).o endif
在模块的源代码目录下执行make,此时,宏“KERNELRELEASE”是没有定义的,所以会执行ifeq下面的内容,分别将以下变量进行赋值:
KERNELDIR: 这个变量是用来存放内核源码的路径的,在Makefile中我们可以看到有两个KERNELDIR,一个是用来保存标准的内核源码(linux-3.14)所在的路径的,一个是用来保存当前正在运行的ubuntu系统自己的内核源码路径。如果你的驱动要在开发板上运行,那么你的Makefile中KERNELDIR就要选择标准的内核源码路径(linux-3.14), 如果你的驱动只想在你的ubuntu上测试,那么选用当前正在运行的ubuntu系统自己的内核源码路径就可以了。
PWD: 这个变量是用来保存你当前的驱动源码所在的路径的。
MYMOD: 这个变量是用来保存你的模块的名字的,在编译时会寻找$(MYMOD).c进行编译,最终也会生成一个$(MYMOD).ko,所以要编译你自己的模块你需要修改这个MYMOD。
由于make后面没有目标,所以make会在Makefile中的第一个不是以.开头的目标作为默认的目标执行。于是modules成为make的目标。也就是执行下面的规则:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
这条规则展开之后就是:
make –C /home/linux/linux3.14/M=/home/linux/test/ modules
-C 表示到存放内核的目录执行其makefile,在执行过程中会定义KERNELRELEASE, KERNELRELEASE在内核顶层Makefile中第396行:
396 KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
其中2>代表错误重定向,当前面出现错误信息(cat 不到)时不会在终端上打印,而是重定向到一个空文件中(黑洞,看不到),如果没有错误(cat 到信息-3.14.0)就赋值给KERNELRELEASE,并且不会重定向
“M=”选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,需要在make modules 命令中加入“M=dir”,程序会自动到你所指定的dir目录中查找模块源码,将其编译,生成KO文件。
当执行完这条规则之后Makefile就会执行else分支,obj-m= hello.o,执行这条规则就会将hello.c编译成hello.o,最终编译成模块hello.ko。
.PHONY 这是一个特殊目标名称,.PHONY目标的具体意思是如果在Makefile的工作目录中有名如:modules,modules_install,clean等文件时命令会出错。它是防止这出错的方式。
相关文章推荐
- 在Linux下如何驱动联想D-link DFE-530TX(也叫D-link DFE-530TX Rev B)网卡
- Linux -安装PHP7
- crontab命令简介 linux定时设置 Cron实现自动任务
- 硬件全攻略--MODEM linux内猫配置 驱动软猫
- linux 无盘安装 没有光驱 无光驱 rawrite ftp安装
- 向Linux进军(X-Window配置指南)
- 大家来做linux调试日志 (tomcat jsp server 配置方法)
- 高效配置Linux代理服务器――Squid
- linux 下 squid 安装日志
- Linux系统中的入侵检测
- LINUX 下播放 DVD 全攻略 (关键字 DVD-ROM LiViD fifo OMS)
- Linux 指令篇(1)
- Linux下声卡通
- 聆听自由的声音----Linux下声卡驱动软件ALSA的安装与配置
- 如何用Linux安装TCP/IP路由器 route subnet arp
- Linux下声卡驱动软件ALSA的安装与配置
- [TextMate for Ubuntu Linux]
- Linux下C开发工具介绍 GCC gdb xxgdb calls calltree cproto indent gprof
- linux 内核模块 和 驱动程序的编写(1)
- Linux 内核配置及编译简介