Linux内核顶层Makefile前期工作分析二

2023-09-20 23:23:44

一.  Linux内核顶层Makefile前期工作

本文继续分析 Linux内核源码的 顶层 Makefile所做的准备工作。

本文续上一篇文章,地址如下:

Linux内核顶层Makefile前期工作分析一_凌肖战的博客-CSDN博客

二.  内核顶层Makefile前期工作

7.  模块编译

Linux 允许单独编译某个模块,使用命令“ make M=dir ”即可,旧语法“ make SUBDIRS=dir
也是支持的。顶层 Makefile 中的代码如下:
182 ifdef SUBDIRS
183 KBUILD_EXTMOD ?= $(SUBDIRS)
184 endif
185
186 ifeq ("$(origin M)", "command line")
187 KBUILD_EXTMOD := $(M)
188 endif
189
190 # If building an external module we do not care about the all: rule
191 # but instead _all depend on modules
192 PHONY += all
193 ifeq ($(KBUILD_EXTMOD),)
194 _all: all
195 else
196 _all: modules
197 endif
198
199 ifeq ($(KBUILD_SRC),)
200 # building in the source tree
201 srctree := .
202 else
203 ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))
204 # building in a subdirectory of the source tree
205 srctree := ..
206 else
207 srctree := $(KBUILD_SRC)
208 endif
209 endif
210 objtree := .
211 src := $(srctree)
212 obj := $(objtree)
213
214 VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
215
216 export srctree objtree VPATH

外部模块编译过程和 uboot 也一样,最终导出 srctree objtree VPATH 这三个变量的值,
其中 srctree=. ,也就是当前目录, objtree 同样为“ . ”。

8.  设置目标架构和交叉编译器

uboot 一样, Linux 编译的时候需要设置目标板架构 ARCH 和交叉编译器 CROSS_COMPILE
在顶层 Makefile 中代码如下:
252 ARCH ?= $(SUBARCH)
253 CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
为了方便,一般直接修改顶层 Makefile 中的 ARCH CROSS_COMPILE ,直接将其设置
为对应的架构和编译器。例如,这里改为如下:
252 ARCH ?= arm
253 CROSS_COMPILE ?= arm-linux-gnueabihf-

9、调用 scripts/Kbuild.include 文件

uboot 一样, Linux 顶层 Makefile 也会调用文件 scripts/Kbuild.include ,顶层 Makefile
应代码如下:
349 scripts/Kbuild.include: ;
350 include scripts/Kbuild.include

10、设置交叉编译工具变量

顶层 Makefile 中其他和交叉编译器有关的变量设置如下:
353 AS = $(CROSS_COMPILE)as
354 LD = $(CROSS_COMPILE)ld
355 CC = $(CROSS_COMPILE)gcc
356 CPP = $(CC) -E
357 AR = $(CROSS_COMPILE)ar
358 NM = $(CROSS_COMPILE)nm
359 STRIP = $(CROSS_COMPILE)strip
360 OBJCOPY = $(CROSS_COMPILE)objcopy
361 OBJDUMP = $(CROSS_COMPILE)objdump
LA LD CC 等这些都是交叉编译器所使用的工具。

11、头文件路径变量

顶层 Makefile 定义了两个变量保存头文件路径: USERINCLUDE LINUXINCLUDE ,相
关代码如下:
381 USERINCLUDE := \
382 -I$(srctree)/arch/$(hdr-arch)/include/uapi \
383 -Iarch/$(hdr-arch)/include/generated/uapi \
384 -I$(srctree)/include/uapi \
385 -Iinclude/generated/uapi \
386 -include $(srctree)/include/linux/kconfig.h
387
388 # Use LINUXINCLUDE when you must reference the include/ directory.
389 # Needed to be compatible with the O= option
390 LINUXINCLUDE := \
391 -I$(srctree)/arch/$(hdr-arch)/include \
392 -Iarch/$(hdr-arch)/include/generated/uapi \
393 -Iarch/$(hdr-arch)/include/generated \
394 $(if $(KBUILD_SRC), -I$(srctree)/include) \
395 -Iinclude \
396 $(USERINCLUDE)

381~386 行是 USERINCLUDE UAPI 相关的头文件路径,第 390~396 行是 LINUXINCLUDE Linux 内核源码的头文件路径。

12、导出变量

顶层 Makefile 会导出很多变量给子 Makefile 使用,导出的这些变量如下:
417 export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
418 export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS 
LD CC
419 export CPP AR NM STRIP OBJCOPY OBJDUMP
420 export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
421 export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
422
423 export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS 
LDFLAGS
424 export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV 
CFLAGS_KASAN
425 export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
426 export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE 
KBUILD_LDFLAGS_MODULE
427 export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
428 export KBUILD_ARFLAGS

下一篇继续了解 Linux内核源码的顶层Makefile的准备工作。

更多推荐

什么是云计算中的资源调度,解释资源调度的挑战和算法

1、什么是云计算中的资源调度,解释资源调度的挑战和算法。在云计算中,资源调度(ResourceScheduling)指的是如何在不同类型的资源(例如计算资源、存储资源、网络资源等)之间合理地分配和调度资源,以实现高效的资源管理和任务执行。资源调度的目标是提高系统的可用性、可靠性和性能。然而,资源调度面临着一些挑战。首先

敏捷开发工具:提升软件研发效率的重要利器

在当今的软件开发领域,敏捷开发方法越来越受到推崇。敏捷开发的核心是灵活应对需求变化,以快速迭代的方式不断优化产品。为了助力敏捷开发的实施,各种敏捷开发工具应运而生。本文将介绍几种常用的敏捷开发工具,阐述其特点、应用场景及优缺点,最后对敏捷开发工具的重要性进行总结。一、敏捷开发工具介绍Leangoo领歌:Leangoo领

什么是Selenium?使用Selenium进行自动化测试!

你知道什么是Selenium吗?你知道为什么要使用它吗?答案就在本文中,很高兴能够与你共飧。自动化测试正席卷全球,Selenium认证是业界最抢手的技能之一。什么是Selenium?Selenium是一种开源工具,用于在Web浏览器上执行自动化测试(使用任何Web浏览器进行Web应用程序测试)。等等,先别激动,让我再次

【详细图文】Windows下安装RustRover和配置Rust环境

前言Rust已经火了挺长时间了,连微软的Windows内核都用它来重新改写,可想而知其厉害之处。之前有看过Rust的教程,但一直没有去尝试。今天看到JetBrains出了Rust专用的IDE:RustRover。作为JetBrains的粉丝,决定进行一次部署实践。本文是从工具安装和环境部署到HelloWorld,作为一

kubernetes popeye 巡检

文章目录1.简介2.安装3.本地4.容器1.简介Popeye是一个实用程序,可以扫描实时Kubernetes集群,并报告部署的资源和配置的潜在问题。它根据部署的内容而不是磁盘上的内容来清理集群。通过扫描您的集群,它可以检测错误配置,并帮助您确保最佳实践到位,从而防止未来的麻烦。它旨在减少在野外操作Kubernetes集

搭建Android自动化python+appium环境

一.需要软件JDK:JAVA安装后配置JDK环境SDK:SDK下载后配置adb环境Python:pyhton语言Pycharm:python脚本编译工具Appium-python-client:pyhton中的库Appium客户端二.搭建步骤1.配置JDK环境①.下载安装java:https://www.oracle.

解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制

一、引言癌症是全球范围内健康领域的一大挑战,早期预测和诊断对于提高治疗效果和生存率至关重要。机器学习在癌症预测中发挥了重要作用,可以从临床数据中学习并构建癌症预测模型,帮助医生进行早期检测和干预,提高患者的生活质量和预后结果。然而,机器学习模型的黑盒性质限制了其在临床实践中的应用。可解释的机器学习被广泛关注,它不仅能够

selenium+python实现基本自动化测试

安装selenium打开命令控制符输入:pipinstall-Uselenium火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能SeleniumIDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能,IDE录制的脚本可以可以转换成多种语言,从而帮助我

蓝桥杯 题库 简单 每日十题 day5

01字符计数字符计数题目描述给定一个单词,请计算这个单词中有多少个元音字母,多少个辅音字母。元音字母包括a,e,i,o,u,共五个,其他均为辅音字母。输入描述输入格式:输入一行,包含一个单词,单词中只包含小写英文字母。单词中的字母个数不超过100。输出描述输出两行,第一行包含一个整数,表示元音字母的数量。第二行包含一个

【运维 Pro】时序场景实践与原理 - 2. 宽表,窄表与 JSON 字段

【运维Pro】:由YMatrix售前和售后团队负责的栏目。除了介绍日常的数据库运维和使用知识,我们更希望能够通过介绍这些知识背后的原理,让大家和我们一起感知数据库的美妙。摘要在上一期《时序场景实践与原理-1.分布与分区》中,我们围绕时间戳和设备标识列,介绍了设计关于分区、分布的设计思路和原理;在本期内容中,我们会围绕指

SpringBoot项目Redis使用

SpringBoot项目Redis使用引入依赖<!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>对R

热文推荐