一. Linux内核的配置工作
本文具体分析 配置 Linux内核源码时,顶层 Makefile实际做的事。
本文续上一篇文章的分析,地址如下:
Linux内核顶层Makefile的make xxx_defconfig过程分析一_凌肖战的博客-CSDN博客
二. make xxx_defconfig过程
上一篇文章,分析出来:
当 配置 Linux内核源码(即执行 "make xxx_defconfig"命令)时,顶层 Makefile实际执行如下命令:
make -f ./scripts/Makefile.build obj= scripts/basic
make -f ./scripts/Makefile.build obj= scripts/kconfig xxx_defconfig
下面分析这两条命令具体做了什么?具体分为两条命令,也就实现两个功能。
1. scripts_basic 目标对应的命令
scripts_basic
目标对应的命令为:
make -f ./scripts/Makefile.build obj= scripts/basic
打开文
件
scripts/Makefile.build
,有如下代码:
41 # The filename Kbuild has precedence over Makefile
42 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
43 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuilddir)/Kbuild,$(kbuild-dir)/Makefile)
44 include $(kbuild-file)
将 上述命令
展开后为:
kbuild-dir=./scripts/basic
kbuild-file= ./scripts/basic/Makefile
include ./scripts/basic/Makefile
继续分析
scripts/Makefile.build
,如下代码:
94 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target)
$(extra-y)) \
95 $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
96 $(subdir-ym) $(always)
97 @:
_build 是默认目标,因为命令“@make -f ./scripts/Makefile.build obj=scripts/basic” 没有指定目标,所以会使用到默认目标__build。
在顶层 Makefile 中,KBUILD_BUILTIN 为 1, KBUILD_MODULES 为空,因此展开后目标__build 为:
__build:$(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)
@:
可以看出目标
__build
有
5
个依赖:
builtin-target
、
lib-target
、
extra-y
、
subdir-ym
和
always
。
这
5
个依赖的具体内容如下:
builtin-target =
lib-target =
extra-y =
subdir-ym =
always = scripts/basic/fixdep scripts/basic/bin2c
因此__build 最终为:
__build: scripts/basic/fixdep scripts/basic/bin2c@:
__build
依赖于
scripts/basic/fixdep
和
scripts/basic/bin2c
,所以要先将
scripts/basic/fixdep
和
scripts/basic/bin2c.c
这两个文件编译成
fixdep
和
bin2c
。
综上所述,scripts_basic 目标的作用就是编译出 scripts/basic/fixdep 和 scripts/basic/bin2c 这
两个软件。
下一篇文章继续分析第二条命令的功能。