一. build定义:
scripts/Kbuild.include
build
:= -f
$(if $(KBUILD_SRC),$(srctree)/)
scripts/Makefile.build obj
$(KBUILD_SRC)常规情况下为空,所以的变量定义可简化为:
build
:= -f
scripts/Makefile.build obj
二. (MAKE) $(build)=的处理过程
build使用的一般形式为:
$(MAKE) $(build)=
build_dir [
argv]
斜体字部分为可变目录和参数,其中[
argv] 可选。使用scripts/Kbuild.include中的$(build)变量定义,进行变量替换后,上述命令则为:
$(MAKE) -f scripts/Makefile.build obj=
build_dir [
argv]
Make进入由参数-f指定的Make文件scripts/Makefile.build,并传入参数obj=
build_dir和
argv。
在scripts/Makefile.build的处理过程中,传入的参数$(obj) 代表此次Make命令要处理(编译、链接、和生成) 文件所在的目录,该目录下通常情况下都会存在的Makefile文件会被Makefile.build包含。$(obj)目录下的Makefile记为$(obj)/Makefile。针对Make命令,有两种情况:不指明Make目标和指定目标。
1.不指定目标
$(MAKE) $(build)=
build_dir [
argv]
中,当没有参数[argv]时,该Make命令没有指定目标。如顶层Makefile中,$(vmlinux-dirs)的构建规则:
$(vmlinux-dirs): prepare scripts
$(Q)$(MAKE) $(build)=$@
其他的还有主机程序fixdep的构建规则:
scripts_basic:
$(Q)$(MAKE) $(build)=scripts/basic
这时会使用Makefile.build中的默认目标__build。然后更进一步,会使用$(obj)/Makefile中定义的变量来进行目标匹配。
__build在Makefile.build中的构建规则为:
__build
:
$(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y))
\
$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target))
\
$(subdir-ym)
$(always)
@:
首先会构建该默认目标__build的依赖。Make会寻找重建这些依赖的规则。而这些规则要么在当前的Makefile文件Makefile.build中,要么在Makefile.build include的$(obj)/Makefile中。在此不指定Make目标的情况下,会使用Makefile.build中的构建规则来重建依赖。相应地