内核中的Makefile

这里主要对内核源码各子集目录中的Kbulid(内核的编译系统)Makfile进行简单介绍 这部分式内核驱动或设备驱动开发这最长接触到的

Makefile 的语法包括几个方面

1、 编译进内核的模块

如果需要将一个模块配置进内核,需要makefile中进行配置:

obj-y +=foo.o

2、编译可加载的模块

所有在配置文件中标记为-m的模块将被编译成可加载模块.ko文件。

如果需要将一个模块配置为可加载模块,需要在makefile中进行配置:


obj-m +=foo.o

3、模块编译以来多个文件

通常的,驱动开发这也会将单独编译在即开发的驱动模块中,当一个驱动模块依赖多个源文件时,需要通过一下方式来指定依赖文件:

obj-m +=foo.o
foo-y :=a.o b.o c.o
foo.o 由a.o,b.o,c.o 生成,然后调用$(LD) -r 将a.o b.o c.o 连接成foo.o文件

4、编译选项

在内核态,编译的选项由EXTRA_CFLAGS, EXTRA_AFLAGS和 EXTRA_LDFLAGS修改成了ccflags-y asflags-y和ldflags-y. ccflags-y asflags-y和ldflags-y这三个变量的值分别对应编译、汇编、链接时的参数。

5、最简单的Makefile

obj-m +=hello.o
DIR = 内核所在的目录/build/
all:
make -C $(DIR) M=`PWD` modules
clean:
make -C $(DIR) M=`PWD` clean

6、 := 、?= 、 += 、=区别

  1 ifdef DEFINE_VRE
2 VRE = "hello world!"
3 else
4 endif
5
6 ifeq ($(OPT),define)
7 VRE ?="hello world! First!"
8 endif
9
10 ifeq ($(OPT),add)
11 VRE += "KELLY!"
12 endif
13
14 ifeq ($(OPT),recover)
15 VRE := "hello world! Again"
16 endif
17
18 all:
19 @echo $(VRE)
 

敲入以下make命令:

make DEFINE_VRE=true OPT=define 输出:Hello World!

make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!

make DEFINE_VRE=true OPT=recover 输出:Hello World! Again!

make DEFINE_VRE= OPT=define 输出:Hello World! First!

make DEFINE_VRE= OPT=add 输出:Kelly!

make DEFINE_VRE= OPT=recover 输出:Hello World! Again!

总结:

= 是最基本的赋值

:= 是覆盖之前的值

?= 是如果没有被赋值过就赋予等号后面的值

+= 是添加等号后面的值

7、同时编译多个可加载模块

当一个.o目标文件依赖多个源文件时,就可以这样指定

 
obj-m +=hello.o
hello-y :=a.o b.o hello_world.o
或者
obj-m +=hello.o
hello-objs :=a.o b.o hello_world.o

hello.o目标文件依赖于a.o,b.o,hello_world.o,那么这里的a.o和b.o如果没有指定源文件,根据推导规则就是依赖源文件a.c,b.c,hello_world.c.除了hello-y,同时也可以用hello-objs,实现效果是一样的。

同时编译多个可加载模块 kbuild支持同时编译多个可加载模块,也就是生成多个.ko文件,它的格式是这样的:

obj-m := foo.o bar.o
foo-y := <foo_srcs>
bar-y := <bar_srcs>

8、ifneq ($(KERNELRELEASE))

通常标准的Makefile 会写成这样:

ifneq ($(KERNELRELEASE))    #中间有空格
obj-m := hello.o
else
KDIR ?=/lib/modules/`uname -r`/build
all:
MAKE -C $(KDIR) M=`PWD` modules
clean:
MAKE -C $(KDIR) M=`PWD` clean
endif

为什么要添加一个ifneq,else,all条件判断。

这得从linux内核模块make执行的过程说起:当键入make时,make在当前目录下寻找makefile并执行,KERNELRELEASE在顶层的makefile中被定义,

所以在执行当前makefile时KERNELRELEASE并没有被定义,走else分支,直接执行

MAKE -C $(KDIR) M=$(PWD) modules

而这条指令会进入到$(KDIR)目录,调用顶层的makefile,在顶层makefile中定义了KERNELRELEASE变量.

在顶层makefile中会递归地再次调用到当前目录下的makefile文件,这时KERNELRELEASE变量已经非空,所以执行if分支,

在可加载模块编译列表添加hello模块,由此将模块编译成可加载模块放在当前目录下。

归根结底,各级子目录中的makefile文件的作用就是先切换到顶层makefile,然后通过obj-m在可加载模块编译列表中添加当前模块,

kbuild就会将其编译成可加载模块。如果是直接编译整个内核源码,就省去了else分支中进入顶层makefile的步骤。

需要注意的一个基本概念是:每一次编译,顶层makefile都试图递归地进入每个子目录调用子目录的makefile,

只是当目标子目录中没有任何修改时,默认不再进行重复编译以节省编译时间。

内核模块的makefile规则详解的更多相关文章

  1. Nginx 常用全局变量 及Rewrite规则详解

    每次都很容易忘记Nginx的变量,下面列出来了一些常用 $remote_addr //获取客户端ip $binary_remote_addr //客户端ip(二进制) $remote_port //客 ...

  2. 53个Oracle语句优化规则详解(转)

    Oracle sql 性能优化调整  1. 选用适合的ORACLE优化器        ORACLE的优化器共有3种:a. RULE (基于规则)   b. COST (基于成本) c. CHOOSE ...

  3. ESLint 规则详解(二)

    接上篇 ESLint 规则详解(一) 前端界大神 Nicholas C. Zakas 在 2013 年开发的 ESLint,极大地方便了大家对 Javascript 代码进行代码规范检查.这个工具包含 ...

  4. QuantLib 金融计算——基本组件之天数计算规则详解

    目录 天数计算规则详解 定义 30 / 360 法 30/360 US 30/360 Bond Basis 30E/360 30E/360 ISDA Actual 法 Actual/Actual IC ...

  5. Apache Rewrite 规则详解

    在开篇之前: 我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的.需要原文的可以在谷歌上搜索一下&qu ...

  6. css样式继承规则详解

    css样式继承规则详解 一.总结 一句话总结:继承而发生样式冲突时,最近祖先获胜(最近原则). 1.继承中哪些样式不会被继承? 多数边框类属性,比如象Padding(补白),Margin(边界),背景 ...

  7. “makefile”写法详解,一步一步写一个实用的makefile,详解 sed 's,$∗\.o[ :]*,\1.o $@ : ,g' < $@.

    目的:编写一个实用的makefile,能自动编译当前目录下所有.c/.cpp源文件,支持二者混合编译.并且当某个.c/.cpp..h或依赖的源文件被修改后,仅重编涉及到的源文件,未涉及的不编译. 二要 ...

  8. MakeFile 文件详解

    GNU的make工作时的执行步骤入下:(想来其它的make也是类似)      1.读入所有的Makefile.      2.读入被include的其它Makefile.      3.初始化文件中 ...

  9. 【Linux技术】autotools制作makefile过程详解

    Preface Makefile固然可以帮助make完成它的使命,但要承认的是,编写Makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此.那么,有没有一种轻松的手段生成Makefi ...

  10. 【Linux技术】autotools制作makefile过程详解【转】

    转自:http://www.cnblogs.com/lcw/p/3159461.htmlPreface Makefile固然可以帮助make完成它的使命,但要承认的是,编写Makefile确实不是一件 ...

随机推荐

  1. linux下使用find查找并操作文件

    介绍 最近在centos7上部署了一套环境,需要根据文件名找到程序运行路径下的文件,并进行移动文件操作,为此查阅了一番,记录下这个操作的脚本.我想很多人都会有这个需求,查找简单,但是要对对查找到的文件 ...

  2. 使用DeskPins工具钉住窗口

    需求 我们经常一边看着PDF或视频教程,一边又打开一个文本编辑器/word/markdown编辑器在做一些笔记.问题是有时候呀需要来回切换(alt+tab)窗口,时间长了其实费时费力,这是一名工程师无 ...

  3. kubernetes(k8s)大白学习01-kubernetes是什么?有什么用?

    kubernetes(k8s)大白基础学习-kubernetes是什么? 一.认识 Docker Docker 是什么 先来看看 Docker 的图标: 一条鲸鱼背上驮着四方形块的物品,就像一条海运船 ...

  4. 【LeetCode二叉树#05】平衡二叉树

    力扣题目链接(opens new window)](https://leetcode.cn/problems/balanced-binary-tree/) 给定一个二叉树,判断它是否是高度平衡的二叉树 ...

  5. php编写日历类

    <?php /** * 日历类 * Class Calendar * @author fengzi * @date 2022-05-05 15:42 */ class Calendar{ pro ...

  6. 案例8:将"picK"的大小写互换

    最终输出结果为PICk. 需要先计算两个字母之间的间隔,比如a和A之间的间隔为多少. 然后在将大写字母转换为小写字母,加上间隔的值: 将小写字母转换为大写字母,减去间隔的值. 示例代码如下: #def ...

  7. vscode 格式化 vue 等文件的 配置 eslint vetur prettier Beautify

    需求 自动格式化需求 多行回车 合并一行,去分号 最后一个逗号,自动删除,符合eslint 结果 虽然能用了,但是 百度好几个方案,也不知道哪个对哪个,太忙没时间弄了. 配置文件记录 eslint 得 ...

  8. WOX 和 everything 差不多,挺不错也

    WOX 和 everything 差不多,挺不错也

  9. 用户不在 sudoers 文件中。此事将被报告

    在终端,进入root模式 vim /etc/sudoers 在    sudo (ALL:ALL) ALL下 添加 用户名 (ALL:ALL) ALL

  10. 3DCAT投屏功能升级,助力企业营销与培训

    3DCAT实时渲染云推出以来,深受广大客户的喜爱,3DCAT也一直根据客户的反馈优化我们的产品. 但是这段时间来,不同行业的客户都反馈着同一个问题. 汽车销售顾问:"什么时候支持投屏功能呢, ...