MAKEFILE全部内容
#DEBUG = y
ifeq ($(DEBUG),y)
DEBFLGAS = -O -g -DSCULL_DEBUG
else
DEBFLAGS = -O2
endif
CFLAGS += $(DEBFLAGS)
CFLAGS += -I$(LDDINC)
ifneq ($(KERNELRELEASE),)
scull-objs := main.o pipe.o access.o
obj-m := scull.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
depend .depend dep:
$(CC) $(CFLAGS) -M *.c > .depend
ifeq(.depend,$(wildcard .depend))
include .depend
endif
执行过程分析
在构造过程中,该MAKEFILE被读取两次,当在命令行输入‘make’之后,此时KERNELRELEASE还未设置,MAKEFILE里面可以有多个目标,如果在命令行中没有指定make的目标,那么执行第一条带冒号的语句。在这里执行modules目标
$(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules
这里转入执行/usr/src/linux下的MAKEFILE,在执行过程中,KERNELRELEASE就会被定义,所以执行:
scull-objs := main.o pipe.o access.o
obj-m := scull.o
最终生成scull.ko。
.ko文件和.o文件相比。o的文件是object文件,.ko是kernel object,与.o的区别在于其多了一些sections,比如.modinfo。.modinfo section是由kernel source里的modpost工具生成的,包括MODULE_AUTHOR, MODULE_DESCRIPTION, MODULE_LICENSE, device ID table以及模块依赖关系等等。depmod 工具根据.modinfo section生成modules.dep, modules.*map等文件,以便modprobe更方便的加载模块。
?=符号讲解
?=pattern,在任何匹配pattern的字符串开始处匹配查找字符串,比如正则表达式是‘abc(?=1234)’,那么当输入‘abc1234’时输出test,因为匹配到了‘1234’,当输入‘abc123’时没有输出,因为没有匹配到1234。