kbuild系统浅析
根Makefile的结构
this-makefile := $(lastword $(MAKEFILE_LIST))
abs_srctree := $(realpath $(dir $(this-makefile)))
abs_output := $(CURDIR)
sub_make_done != 1 // 第一次一定会被执行,用来设置参数
设置了一些参数,如:
KBUILD_EXTMOD := $(M) 真正干活的时候,会以这个作区分,执行的操作不一样
abs_output如果用户指定输出目录,会变化。影响到下面的need_sub_make。
export sub_make_done := 1
end
// 根据目标输出目录是否是当前目录,判断是否要嵌套执行
ifneq ($(abs_output),$(CURDIR))
need-sub-make := 1
endif
need-sub-make == 1
// 如果目标输出目录核当前目录不一样,就重新执行一次make
$(Q)$(MAKE) $(no-print-directory) -C $(abs_output) \
-f $(abs_srctree)/Makefile $(MAKECMDGOALS)
else
// 接下来判断是不是要逐个make
设置下面几个参数,决定这次构建的方式
config-build :=
mixed-build :=
need-config := 1
may-sync-config := 1
single-build :=
// 根据MAKECMDGOALS来判断是否需要设置上面的值,来决定接下来做什么共作
mixed-build == 1
对$(MAKECMDGOALS)中的目标,依次执行
make -f $(srctree)Makefile $$i
else
// 到这里才开始真正干活
包含kbuild核心文件,其中定义了build := -f $(srctree)/scripts/Makefile.build obj
include scripts/Kbuild.include
// out of tree规则
ifdef building_out_of_srctree
endif
// 目标是不是config文件
config-build
构建配置,如make menuconfig
else
// 读取配置,看上去和.config一样
include include/config/auto.conf
// 如果需要.config但是没有,报错
// 根据配置include需要的Makefile
// 先是内核的规则,后是模块的规则
if !KBUILD_EXTMOD
build-dir := .
else
endif
// 如果有single target, 如.o, mm/等
if single-build
endif
$(build-dir): prepare
$(Q)$(MAKE) $(build)=$@ need-builtin=1 need-modorder=1 $(single-goals)
end
end
end # need-sub-makeDebug小tip
V=1
-p
获取当前目录
sub_make判断
几个用到的变量
single-build
kbuild
从Makefile.build开始
层次结构
常用函数
if_changed
Last updated