用linux内核驱动模块开发makefile

嵌入式技术

1372人已加入

描述

以下是摘自网络上的一个经典的linux设备驱动的Makefile文件,以及详细的内容解释。此文件可以完成对大部分驱动的编译,使用时只需要稍加修改就可以了。

$(warning KERNELRELEASE=$(KERNELRELEASE))ifeq ($(KERNELRELEASE),)KERNELDIR ?= /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)MYMOD := hellomodules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*.PHONY: modules modules_install cleanelse obj-m := $(MYMOD).oendif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

下面来依次介绍makefile文件中的各行语句的作用:

1、变量定义。首先,如果你在模块的源代码目录下执行make,此时,宏KERNELRELEASE是没有定义的,所以会执行ifeq下面的内容,分别将以下变量进行赋值:

KERNELDIR:这个变量是用来存放内核源码的路径的,在Makefile中我们可以看到有两个KERNELDIR,一个是用来保存标准的内核源码所在的路径的,一个是用来保存当前正在运行的ubuntu系统自己的内核源码路径。如果你的驱动要在开发板上运行,那么你的Makefile中KERNELDIR就要选择标准的内核源码路径,如果你的驱动只想在你的ubuntu上测试,那么选用当前正在运行的ubuntu系统自己的内核源码路径就可以了。

PWD:这个变量是用来保存你当前的驱动源码所在的路径的。

MYMOD:这个变量是用来保存你的模块的名字的,在编译时会寻找$(MYMOD).c进行编译,最终也会生成一个$(MYMOD).ko,所以要编译你自己的模块你需要修改这个MYMOD。

2、编译规则。由于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行:

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等文件时命令会出错,它是防止这出错的方式。

3、最后,再贴上我自己项目中改进后的makefile的源码,以供参考:

KERNEL_DIR=$(TOP_DIR)/platform/kernelDRVNAME=mydrv_gpioPWD=$(shell pwd)obj-m+=$(DRVNAME).o$(DRVNAME)-objs := $(DRVNAME).obuild: @echo $(KERNEL_DIR) $(MAKE) -C $(KERNEL_DIR) M=$(PWD)install: build cp $(DRVNAME).ko $(COM_INSTALL_YXAON_DIR)/user/yxkoclean: @rm -rf *.o *.ko .*.cmd *.mod.c *.order *.symvers .tmp_versions *~
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分