本文介绍Linux
内核Makefiles
的一些基础内容。
一、概述
Makefiles
包括:
文件 | 功能描述 |
---|---|
Makefile | Linux内核顶层Makefile文件 |
.config | Linux内核配置文件 |
arch/$(ARCH)/Makefile | Linux内核体系结构相关的Makefile文件 |
scripts/Makefile.* | Linux内核kbuild Makefile的通用规则 |
kbuild Makefiles | Linux内核各级目录下的kbuild Makefile文件 |
Linux
内核顶层的Makefile
文件递归访问内核源代码的子目录。
每个子目录都有一个kbuild Makefile
文件,根据.config
文件内容构建内置或模块化目标。
arch/$(ARCH)/Makefile
文件向顶层Makefile
提供特指定的体系结构信息。
scripts/Makefile.*
文件定义了kbuild Makefile
构建内核的所有定义和规则等。
Linux
内核编译完成后,最终生成vmlinux
和modules
。
Linux
内核中的大多数Makefile
都使用kbuild
基础结构,kbuild
文件的首选名称是Makefile
。如果Makefile
和kbuild
文件都存在,则使用kbuild
文件。
二、目标定义
目标定义是kbuild Makefile
里的核心部分,定义了要构建的文件、特殊的编译选项和递归输入的任何子目录。
例:
## 1、该目录下build_test.c或.s文件将被编译成build_test.o的目标文件
obj-y += build_test.o
## 2、编译成内核模块
obj-m += module_test.o
## 3、若在defconfig文件中配置CONFIG_TESTR为y,将被直接编译;配置为m,将被编译成内核模块;如果没配置或配置为is not set,则不编译
obj-$(CONFIG_TEST) += test.o
## 4、内核模块包括多个文件
obj-$(CONFIG_MODULE_TEST) += module_test.o ## CONFIG_MODULE_TEST配置为m,定义module_test为module_name
module_test-y := module_test1.o module_test2.o module_test3.o ## $(<module_name>-y)的格式
## 5、如果配置CONFIG_DIR_TEST为y或m,则进入dir_test目录进行编译;否则不编译
obj-$(CONFIG_DIR_TEST) += dir_test/
## 6、生成lib.a,lib-y通常仅用于lib/和arch/*/lib/目录下
lib-y := test_lib.o
## 7、目录编译使用libs-y
libs-y := test_dir/
kbuild Makefile
将编译所有$(obj-y)
文件,然后调用$(AR)rcSTP
将这些文件合并到built-in.a
文件中。
built-in.a
中不包括符号表,稍后将通过scripts/link-vmlinux.sh
脚本链接到vmlinux
文件中。
在Linux
内核引导期间,将按照链接顺序调用某些函数(例:module_init()
等)。
参考:
Documentation/kbuild/makefiles.txt