linux内核目录makefile,linux内核驱动模块开发makefile实例解析

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

$(warning KERNELRELEASE=$(KERNELRELEASE))

ifeq ($(KERNELRELEASE),)

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

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/kernel

DRVNAME=mydrv_gpio

PWD=$(shell pwd)

obj-m+=$(DRVNAME).o

$(DRVNAME)-objs := $(DRVNAME).o

build:

@echo $(KERNEL_DIR)

$(MAKE) -C $(KERNEL_DIR) M=$(PWD)

install: build

cp $(DRVNAME).ko $(COM_INSTALL_YXAON_DIR)/user/yxko

clean:

@rm -rf *.o *.ko .*.cmd *.mod.c *.order *.symvers .tmp_versions *~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值