内核模块 Makefile模板示例

一个模块编译的Makefile模板示例分析:

# KERNELRELEASE 在内核中定义,单独编译模块时 KERNELRELEASE = 0
# KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
# 2> 代表错误重定向到 /dev/null
# 当前面出现错误信息(cat 不到)时不会在终端上打印,而是重定向到一个空文件中(黑洞,看不到)
# 如果没有错误(cat 到信息-3.14.0)就赋值给KERNELRELEASE,并且不会重定向

ifneq ($(KERNELRELEASE),)
# include kbuild        # 新版本内核的机制。此处用于兼容老版本。
# 生成模块需要的目标文件
# module-objs := <file1>.o <file2>.o
# 生成模块
# obj-m := <module_filename>.o

# multi files in one drv
MODULE_NAME = <xxx_drv>
MODULE_SOURCES = <a.o b.o ...>
$(MODULE_NAME)-objs := $(MODULE_SOURCES)
obj-m += $(MODULE_NAME).o

else

# 驱动依赖的内核路径,借用内核 Makefile 编译
KERNELDIR ?= <kernel_dir>

# pwd命令,表示当前目录。
PWD := $(shell pwd)

# -C :将当前工作目录,转移到指定的位置并编译。
# M= :make modules 命令编译模块前,返回到模块代码路径。modules 目标指向 obj-m 变量
modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:                                             
    # $(MAKE) -C $(KERNELDIR) M=`pwd` modules clean
    rm -rf *.o *~ core .depend *.ko *.mod.c .tmp_versions Module* modules*

.PHONY: modules modules_install clean

endif
Linux内核模块编译、加载、运行机制分析、版本控制、许可声明、内核污染、模块传参、模块签名机制、out-of-tree动态模块编译及Makefile模板编写,尽在《Linux内核编程》,详情点击:王利涛老师个人淘宝店:Linux内核编程