一文讲解Linux内核Makefile执行流程

本文详细介绍了Makefile的基础语法,重点讲解了shell语句区域、变量赋值、include功能以及Kbuild内置函数如$(build)和$(if_changed)。此外,还涵盖了Linux内核编译过程中的Makefile使用和编译外部模块、makemenuconfig、以及make命令行目标的相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1. Makefile基础语法

如果还不熟悉Makefile语法,建议先系统的学习一下,特别是以下几点:

(1) Makefile哪些部分包含的是shell语句:

编译规则中的指令部分

${shell XX},var != XX中的XX部分

$(if …, XX, XX)中的XX部分

(2) 变量展开:

=(延迟赋值)、:=(立即赋值)、!=(值为shell命令)、?=(条件赋值)、+=(追加)

(3) include:将指定的其它Makefile内容,展开到当前Makefile

-f/-C:嵌套执行指定(目录中的)Makefile

执行一个Makefile,并不是从第一行开始执行,而是从指定或默认的编译目标开始执行(位置目标编译规则之前的赋值语句,只在相应变量需要被使用时才会执行),其中,Makefile(包括include内容)中的第一个目标,为默认目标,如果make命令行中没有指定编译目标,则执行默认目标。

(4) 自动推导依赖文件

(5) 根据文件时间戳、中间文件(.d、.cmd),判断依赖更新,决定是否需要重新编译

(6) 重要的内置函数:

$(wildcard pattern)

$(patsubst pattern, replacement, text)

$(strip string)

$(filter pattern, text)

$(filter-out pattern, text)

$(call func, args..)

(7) 自动推导变量:

$@:编译目标

$<:依赖列表中的第一个依赖对象

$^:依赖列表中的所有对象

$?:依赖文件列表中所有有更新的文件

1.2. Kbuild内置函数

Linux内核源码包含一套Makefile程序,本文基于Linux-5.2.5内核源码分析,其中包括top Makefile,scripts/目录下的Makefile、Makefile.build、Makefile.lib、Kbuild.include、Makefile.modpost、kconfig/Makefile等,以及其它目录下的很多子Makefile,统称为Kbuild。

Kbuild是按照框架设计思路实现的,使得内核自身包含或外部提供的大量驱动模块,只需要按照Kbuild框架的约定,各自提供一个简单的Makefile即可编译。

所以,理解内核或驱动文件的编译过程,其实就是要理解Kbuild这套Makefile程序的实现逻辑,既然是程序,就免不了会定义一些函数,由于很多关键的流程,都使用了$(build)和$(if_changed),所以以下先单独介绍(本文分析的Makefile内容,来自Linux-5.2.5内核源码):

1.2.1. $(build)

◆使用形式:$(Q)$(MAKE) $(build)=xx目录 [编译目标]

◆build内部过程

◆build作用概括

以下是$(build)的使用形式,以及每个部分的作用:

1.2.2. $(if_changed)

◆使用形式:$(call if_changed, xx)

◆if_changed内部过程

◆if_changed作用概括

以下是$(if_changed)的使用形式,及其参数的含义:

二、编译外部模块

2.1. 涉及Makefile内容

2.2. 概要流程

2.3. 详细流程

三、make menuconfig

3.1. 涉及Makefile内容

3.2. 概要流程

3.3. 详细流程

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linuxc/c++高级开发【直播公开课】

零声白金VIP体验卡:零声白金VIP体验卡(含基础架构/高性能存储/golang/QT/音视频/Linux内核)

四、Make [all/_all/modules]

4.1. 涉及Makefile内容

make命令行指定all/_all/modules目标,或者不指定目标时,是为了生成vmlinux文件,而vmlinux目标间接依赖prepare目标,且prepare目标编译规则展开内容比较多,所以以下分开介绍:

◆vmlinux目标

◆prepare目标

4.2. 概要流程

◆vmlinux目标

◆prepare目标

4.3. 详细流程

◆vmlinux目标

◆vmlinuz目标

◆prepare目标

原文作者:看雪学苑

### RK3399 驱动开发教程与资源 #### 以太网驱动调试 针对RK3399平台上的以太网调试,存在详细的指导文档。此指南不仅概述了驱动程序框架的核心概念,还展示了实际应用中的源代码片段。遵循这些说明可以有效地完成RK3399的以太网初始化和故障排查工作[^1]。 ```python # 示例:加载以太网模块 sudo modprobe rk805_ethernet ``` #### RTC(实时时钟)驱动开发 对于RTC设备的支持,在Linux内核中有专门的设计模式用于管理这类硬件组件。`devm_rtc_device_register` API被用来向系统注册一个新的RTC实例;在此之前会先利用`devm_rtc_allocate_device`创建并配置必要的数据结构。整个过程涉及到多个层次间的交互,从高层的应用接口到底层的具体实现细节均有所涉及[^2]。 #### LED驱动编写实践 当着手于LED控制功能时,《基于RK3399的LED驱动开发》一文提供了完整的项目构建方法论以及Makefile模板。这使得开发者可以根据自己的需求调整编译选项,并轻松集成自定义逻辑至目标环境中[^3]。 #### 触摸屏适配挑战 面对双MIPI触控面板可能出现的问题,《RK3399 驱动开发 | 01 - 双Mipi触摸屏驱动调试》深入探讨了一个特定案例——即Goodix GT9XX系列芯片组所引发的位置映射失准现象及其修正措施。通过对源码级参数设定的理解与修改,最终实现了预期效果[^4]。 #### USB体系架构理解 最后,在研究USB连接机制方面,《RK3399平台开发系列讲解(USB篇)如何去学习USB驱动 - 视频课》视频课程给出了清晰易懂的教学内容。它解释了诸如UDC这样的核心概念如何帮助建立稳固可靠的通信链路,同时也推荐了一些辅助工具如UsbTreeView来辅助日常维护作业[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值