Make buildkernel 流程概览
图表 1 : make buildkernel流程
一、 编译内核
1.修改
/usr/src/sys/i386/conf/GENERIC 配置内核
2.编译内核
cd /usr/src
make
buildkernel 或者 make
buildkernel KERNCONF=MY_GENERIC
用下面的make参数将make信息顺便记录到/root/buildkernel.log中
make
buildkernel | tee /root/buildkernel.log
二、 Makefile 流程
编译内核的起始Makefile 是从 /usr/src目录下的Makefile文件开始的.
图表 2 : /usr/src/Makefile
然后在219行使用变量 ${_MAKE}继续执行
图表 3 : /usr/src/Makefile
看一下${_MAKE}的定义,${_MAKE}指定去make 当前目录下的 Makefile.inc1
图表 5 : /usr/src/Makefile.inc1
首先mkdir了一个目录
mkdir -p /usr/obj/usr/src/sys
然后 stage 1 调用config 命令解析GENERIC生成接下来编译要用的Makefile和一些c文件.
cd /usr/src/sys/i386/conf
config
-d /usr/obj/usr/src/sys/GENERIC
/usr/src/sys/i386/conf/GENERIC
config 的源码在
/usr/src/usr.sbin/config 目录下.
图表 6 : /usr/src/usr.sbin/config/main.c
在i386平台下,makefile()函数读取/usr/src/sys/conf目录下的files和files.i386并根据文件里的规则生成相应的Makefile.
最终的Makefile 为/usr/obj/usr/src/sys/GENERIC/Makefile,后面所有buildkernel都由这个Makefile 开始.
Stage 2 :如下图
Stage 2会用config 生成的Makefile
make相关的目标.
这里看下 stage2.1 中 ${KMAKE } {CLEANDIR} 的流程
命令如下:
make
-m /usr/src/share/mk TARGET=i386 TARGET_ARCH=i386 KERNEL=kernel cleandir
${KRNLOBJDIR}/${_kernel} 对应/usr/obj/usr/src/sys/GENERIC
即上一步 config 生成的Makefile
Makefile末尾包含了
/usr/src/sys/conf/kern.post.mk.
图表 8 : /usr/obj/usr/src/sys/GENERIC/Makefile
到 kern.post.mk里, cleandir 参数(target)会被依赖于 kernel-cleandir
图表 9 : /usr/src/sys/conf/kern.post.mk
图表 10 : /usr/src/sys/conf/kern.post.mk
图表 11 : /usr/src/sys/conf/kern.post.mk
Stage 3
Stage 3基本流程和 Stage 2差不多,都是 Make –f
/usr/obj/usr/src/sys/GENERIC/Makefile.