Makefile独立编译ko文件

在工作的过程中,经常需要编译一些Ko模块,如果是单个的c文件编译直接在内核源码里面 obj-m=xxx.o就好
如果这个ko文件需要多个c文件共同编译生成的话,最好以如下的模板来完成编译较好

#首先指定好编译链工具
CROSS_COMPILE=/opt/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
#指定用哪个内核去编译
KDIR=/mnt/nfsroot/zhengshuai.zhu/IPCSDK/ipc-sdk-full-release/kernel-4.19

#目标是编译成一个test.ko文件
obj-m += test.o
#test.o文件由当前目录下n个c文件编译成
test-objs += ./*.o
#包含当前目录下的头文件
INCLUDE_DIRS := $(addprefix -I,$(shell find ../ -type d ))

#包含当前目录下,内核目录下的头文件
ccflags-y:= -I$(_KDIR)/include/linux/ -I$(PWD)/platform/
#忽略一些编译警告,类如什么变量未使用
ccflags-y += -Wno-declaration-after-statement

#添加c文件中的环境变量,比如在代码中会有
#ifdef CONFIG_ANDROID 
#xxxx
#endif
ifeq ($(SYSTEM_VERSION),)
    ccflags-y += -DCONFIG_LINUX_OS
else
    ccflags-y += -DCONFIG_ANDROID
endif

all:
	make ARCH=${ARCH} -C $(KDIR) M=$(PWD) modules

clean:
	make ARCH=${ARCH} -C $(KDIR) M=$(PWD) clean

make ARCH=${ARCH} -C ( K D I R ) M = (KDIR) M= (KDIR)M=(PWD) modules
如何理解这句话?
-C的选项可以理解为:
进入所指定的位置,$(KDIR),也就是内核目录中,目的是什么? 去读取内核目录顶层的Makefile文件,相当于编译的时候 选择一个内核,我要用这个内核去编译。
因为你这个目录没有被配置到kernel config里面去,也就是说没有指定用哪个内核版本,有了 -C $(KDIR),就相当于选了内核,如果你选择了kernel-4.19目录下,或者 kernel-5.0目录下,

M=的选项可以理解为:
当我选好内核版本后,我用这个 版本的内核 要去编译哪个目录,然后进入$(PWD)目录去编译当前指定的文件,将其编译成ko文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值