Linux内核源码相关操作整理

转自:Linux内核源码相关操作整理

Linux内核开发过程中,大部分对源码的操作都是通过源码中提供的Makefile脚本完成的。
如在源码根目录下单独使用一个“make”来编译源码;用“make install”来安装内核;用“make clean”来清理编译过程产生的文件。
下面介绍Makefile脚本提供了哪些功能:
(在Linux源码目录下执行“make help”可以看到相关帮助信息。)

清理相关:

clean - 删除大部分生成的文件,但保留配置和足够的构建支持以构建外部模块
mrproper - 移除全部,包阔各种生成的“.o”文件, 配置/备份文件(记得备份配置文件)
distclean - mrproper + 移除编辑器备份和patch文件

配置编译过程相关:

config - 使用基于行的程序更新当前配置
nconfig - 使用ncurses菜单程序更新当前配置
menuconfig - 使用菜单的程序更新当前配置(常用,好用)
xconfig - 使用Qt界面更新当前配置(麻烦,还得先装Qt的依赖宝)
gconfig - 使用基于GTK+的前端更新当前配置
oldconfig - 使用提供的 .config 文件作为基础更新当前配置
              (用法是在更新老核为新核时,先拷贝老核的config文件到源码根目录,然后运行oldconfig)
localmodconfig - 更新当前配置,禁用未加载的模块,但保留 LMC_KEEP 环境变量保留的模块
localyesconfig - 更新当前配置,将本地修改转换为核心模块,但保留 LMC_KEEP 环境变量保留的模块
defconfig - 脚本判断当前ARCH,然后创建当前Arch版本的默认配置文件“.config”
savedefconfig - 将当前配置保存为 ./defconfig(最小配置)
allnoconfig - 创建所有选项均为“no”的新配置文件
allyesconfig - 创建所有选项均为“yes”的新配置文件
allmodconfig - 创建新的配置文件,将所有可以编译成模块的都选择编译成模块
                 (编译成模块的内容会在initramfs文件的/lib/modules/xxx/xxx.ko,而选择y则会编译到vmlinux文件中)
alldefconfig - 将所有符号设置为默认值的新的配置文件
randconfig - 随机所有选项,然后创建为新配置文件
yes2modconfig - 将“yes”选项全更改为“mod”
mod2yesconfig - 将“mod”选项更改为“yes”
mod2noconfig - 将“mod”选项更改为“no”
listnewconfig - 列出新的,当前目录下“.config”文件没有的选项
helpnewconfig - 列出新的选项和帮助文本
olddefconfig - 类似于 oldconfig,但将新的符号设置为其默认值,无提示
tinyconfig - 配置尽可能小的内核
testconfig - 运行 Kconfig 单元测试(需要 python3 和 pytest)

其他通用:

all - 构建所有标有 [*] 的目标

vmlinux - 构建裸内核
modules - 构建所有模块
modules_install - 将所有模块安装到 INSTALL_MOD_PATH 目录(默认为 /)
dir/ - 构建dir目录中及其子目录中的所有文件
dir/file.[ois] - 仅构建指定dir下的目标文件
dir/file.ll - 构建 LLVM 汇编文件(需要编译器支持 LLVM 汇编生成)
dir/file.lst - 仅构建指定的混合源/汇编目标(需要较新的 binutils 和最新的构建(System.map))
dir/file.ko - 构建模块,包括最终链接
modules_prepare - 设置用于构建外部模块的环境
tags/TAGS - 为编辑器生成 tags 文件
cscope - 生成 cscope 索引,cscope是一个浏览代码linux插件
gtags - 生成 GNU GLOBAL 索引
kernelrelease - 输出版本信息(与 make -s 一起使用)
kernelversion - 输出存储在 Makefile 中的版本信息(与 make -s 一起使用)
image_name - 输出镜像存放目录(与 make -s 一起使用)
headers_install - 安装经过清理的内核头文件到 INSTALL_HDR_PATH(默认为 ./usr)

Rust相关:

rustavailable - 检查 Rust 工具链是否可用,并在不可用时解释原因
rustfmt - 重新格式化内核中的所有 Rust 代码
rustfmtcheck - 检查内核中的所有 Rust 代码是否已格式化,否则打印差异
rustdoc - 生成 Rust 文档(需要内核 .config)
rusttest - 运行 Rust 测试(需要内核 .config,同时下载相关包)
rust-analyzer - 生成 rust-project.json rust-analyzer 支持文件(需要内核 .config)
dir/file.[os] - 仅构建指定的目标
dir/file.rsi - 构建宏展开的源文件,类似于 C 中的预处理,输出的内容不用于编译

内核单测相关:

kselftest - 构建并运行内核单测
                        (会先构建、安装和引导内核, 需要用root运行)
kselftest-all - 构建内核自测试
kselftest-install - 构建并安装内核单测
kselftest-clean - 删除所有生成的 kselftest 文件
kselftest-merge - 将 kselftest 的所有配置依赖项合并到现有 .config 中

工具相关:

nsdeps - 生成缺失符号的命名空间依赖项

静态分析器相关:

checkstack - 生成栈溢出列表
versioncheck - 对 version.h 的使用进行健全性检查
includecheck - 检查是否有重复包含的头文件
export_report - 列出所有导出符号的使用情况
headerdep - 检测头文件中的循环包含
coccicheck - 使用 Coccinelle 进行检查
clang-analyzer - 使用 Clang 静态分析器进行检查
clang-tidy - 使用 Clang-Tidy 进行检查

内核打包相关:

rpm-pkg - 构建源码和二进制 RPM 内核包
binrpm-pkg - 仅构建二进制内核 RPM 包
deb-pkg - 构建源码和二进制 deb 内核包
bindeb-pkg - 仅构建二进制内核 deb 包
snap-pkg - 仅构建二进制内核 snap 包(需要连接网络)
dir-pkg - 以纯目录结构构建内核
tar-pkg - 以未压缩的 tar 包形式构建内核
targz-pkg - 以 gzip 压缩的 tar 包形式构建内核
tarbz2-pkg - 以 bzip2 压缩的 tar 包形式构建内核
tarxz-pkg - 以 xz 压缩的 tar 包形式构建内核
tarzst-pkg - 以 zstd 压缩的 tar 包形式构建内核
perf-tar-src-pkg - 构建 perf-xxx.tar 源码 tar 包
perf-targz-src-pkg - 构建 perf-xxx.tar.gz 源码 tar 包
perf-tarbz2-src-pkg - 构建 perf-xxx.tar.bz2 源码 tar 包
perf-tarxz-src-pkg - 构建 perf-xxx.tar.xz 源码 tar 包
perf-tarzst-src-pkg - 构建 perf-xxx.tar.zst 源码 tar 包

构建文档相关:

内核源码下只保存文档的ReST(reStructuredText)格式,其他格式需要通过构建生成:
htmldocs - 生成HTML 格式
latexdocs - 生成LaTeX 格式
pdfdocs - 生成PDF 格式
epubdocs - 生成EPUB 格式
xmldocs - 生成XML 格式
linkcheckdocs - 检查外部链接的可用性(需要连接网络)
refcheckdocs - 检查对不存在文件的引用(位于 Documentation 目录下)
cleandocs - 清理所有生成的文档相关的文件

"make SPHINXDIRS="s1 s2" [target]" - 生成特定文件夹 s1 和 s2 的文档
                                        SPHINXDIRS 的值可为这些:PCI RCU accounting admin-guide arc arm arm64 block bpf cdrom core-api cpu-freq crypto dev-tools devicetree doc-guide driver-api fault-injection fb filesystems firmware-guide fpga gpu hid hwmon i2c ia64 iio infiniband input isdn kbuild kernel-hacking leds livepatch locking loongarch m68k maintainer mhi mips misc-devices mm netlabel networking nios2 openrisc parisc pcmcia peci power powerpc process riscv rust s390 scheduler scsi security sh sound sparc spi staging target timers tools trace translations usb userspace-api virt w1 watchdog x86 xtensa

"make SPHINX_CONF={conf-file} [target]" 可以使用额外的 sphinx-build 配置进行构建。对于使用 nit-picking 配置进行构建很有用。

"make DOCS_THEME={sphinx-theme}" 选择不同的 Sphinx 主题。

"make DOCS_CSS={a .css file}" 为 html/epub 输出添加 DOCS_CSS 重写文件。

生成的文档的默认位置为 Documentation/output

特定架构相关(x86):

bzImage - 构建压缩的内核映像(arch/x86/boot/bzImage)
install - 使用自己的“~/bin/installkernel”或“/sbin/installkernel”来安装内核,或将其安装到 $(INSTALL_PATH) 并运行 lilo
fdimage - 创建 1.4MB 引导软盘映像(arch/x86/boot/fdimage)
fdimage144 - 创建 1.4MB 引导软盘映像(arch/x86/boot/fdimage)
fdimage288 - 创建 2.8MB 引导软盘映像(arch/x86/boot/fdimage)
hdimage - 创建 BIOS/EFI 硬盘映像(arch/x86/boot/hdimage)
isoimage - 创建启动 CD-ROM 映像(arch/x86/boot/image.iso)
                    bzdisk/fdimage*/hdimage/isoimage可接受如下参数:
                                FDARGS="..." 作为启动内核的参数
                                FDINITRD=file 作为启动内核的 initrd 文件
kvm_guest.config - 启用 KVM 客户机运行该内核的 Kconfig 项目
xen.config - 启用 Xen 客户机运行该内核的 Kconfig 项目
x86_debug.config - 启用 tip 树调试选项进行测试
i386_defconfig - 为 i386 构建
x86_64_defconfig - 为 x86_64 构建

"make V=0|1 [targets]" 0 => 静默构建(默认),1 => 详细构建
"make V=2 [targets]" 2 => 详细输出构建目标的过程
"make O=dir [targets]" 将所有输出文件(包括 .config)放在 "dir" 中定位
"make C=1 [targets]" 通过 $CHECK(默认为 sparse)检查重新编译的 c 源文件
"make C=2 [targets]" 强制使用 $CHECK 检查所有 c 源文件
"make RECORDMCOUNT_WARN=1 [targets]" 警告忽略的 mcount 部分
"make W=n [targets]" 启用额外的构建检查,n=1,2,3,其中:
            1: 可能相关且不经常发生的警告
            2: 经常发生但仍可能相关的警告
            3: 更加深奥的警告,可能可以忽略
            e: 将警告视为错误
            可以通过 W=12 或 W=123 组合多个级别

其他工具

用"make tools/help" 或 "cd tools; make help" 可以查看用户空间工具相关说名

acpi - ACPI 工具
bpf - 杂项 BPF 工具
cgroup - cgroup 工具
counter - 计数器工具
cpupower - x86 CPU 电源相关的工具
debugging - 调试工具
firewire - IEEE-1394 流量嗅探器 nosy 的用户空间部分
firmware - 固件工具
freefall - 用于磁盘保护的笔记本加速计程序
gpio - GPIO 工具
hv - 在 Hyper-V 客户端中使用的工具
iio - IIO 工具
intel-speed-select - Intel Speed Select 工具
kvm_stat - 类似 top 的用于显示 kvm 统计信息的实用程序
leds - LED 工具
nolibc - nolibc 头文件测试和安装
objtool - 一个 ELF 对象分析工具
pci - PCI 工具
perf - Linux 性能测量和分析工具
selftests - 各种内核自测试
bootconfig - 启动配置工具
spi - SPI 工具
tmon - 温度监控和调整工具
thermometer - 温度捕获工具
thermal-engine - 温度监控工具
thermal - 热管理库
tracing - 杂项跟踪工具
turbostat - Intel CPU 空闲状态和频率报告工具
usb - USB 测试工具
virtio - vhost 测试模块
vm - 杂项虚拟机工具
wmi - WMI 接口示例
x86_energy_perf_policy - Intel 能效策略工具

你可以在内核命令行中执行以下操作:

$ make -C tools/ _install
用于构建和安装上述工具中的一个。

$ make tools/all
构建所有工具

$ make tools/install
安装所有工具。


清理构建文件:在所有上述目标后添加 "_clean" 字符串将清理相应的构建目录。
clean:清理所有,用于清理 all 文件夹。

你可能感兴趣的:(Linux内核源码相关操作整理)