文章目录
1. make -f ./scripts/Makefile.build obj=XXX
默认目标为
__build
、$(subdir-ym)
、FORCE
,由于输入没有指定要创建的目标,所以默认创建第一个目标,即__build
。# scripts/Makefile.build 96 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \ 97 $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \ 98 $(subdir-ym) $(always) 99 @:
- 96行:
$(KBUILD_BUILTIN)
在顶层 Makefile 中定义为:KBUILD_BUILTIN := 1
,这里条件成立;- 97行:
$(KBUILD_MODULES)
在顶层 Makefile 中定义为:KBUILD_MODULES :=
,这里条件不成立;
所以展开为:# scripts/Makefile.build 96 __build: $(builtin-target) $(lib-target) $(extra-y) $(subdir-ym) $(always) 99 @:
由上可知,目标
__build
的创建规则为@:
,表示什么都不做,所以只需创建目标的依赖即可。
最终:
- 引用包含变量定义及创建规则的文件,见《1.1 引用文件》
- 创建
$(builtin-target)
,见《1.2 创建 $(builtin-target)》- 创建
$(lib-target)
,见《1.3 创建 $(lib-target)》- 创建
$(extra-y)
,见《1.4 创建 $(extra-y)》- 创建
$(subdir-ym)
,见《1.5 创建 $(subdir-ym)》- 创建
$(always)
,见《1.6 创建 $(always)》- 由《1.7 变量定义》可知:
7.1$(HOSTCC)
= cc
7.2$(depfile)
= $(dir $@).$(notdir $@)
7.3$(hostc_flags)
= Wp,-MD,$(dir $@).$(notdir $@) -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu11 $(HOST_EXTRACFLAGS) $(HOSTCFLAGS_$(notdir $@).o)
7.4$(hostcxx_flags)
= Wp,-MD,$(dir $@).$(notdir $@) -O2 $(HOST_EXTRACXXFLAGS) $(HOSTCXXFLAGS_$(notdir $@).o)
7.5$(build)
= -f ./scripts/Makefile.build obj
1.1 引用文件
# scripts/Makefile.build # 输入命令:make -f ./scripts/Makefile.build obj=XXX 7 prefix := tpl 8 src := $(patsubst $(prefix)/%,%,$(obj)) 9 ifeq ($(obj),$(src)) 10 prefix := spl 11 src := $(patsubst $(prefix)/%,%,$(obj)) 12 ifeq ($(obj),$(src)) 13 prefix := . 14 endif 15 endif ...... 45 -include include/config/auto.conf 46 -include $(prefix)/include/autoconf.mk 47 include scripts/Makefile.uncmd_spl 49 include scripts/Kbuild.include ...... 55 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) 56 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) 57 include $(kbuild-file) ...... 71 include scripts/Makefile.lib ...... 74 ifneq ($(hostprogs-y)$(hostprogs-m)$(hostlibs-y)$(hostlibs-m)$(hostcxxlibs-y)$(hostcxxlibs-m),) 75 include scripts/Makefile.host 76 endif ...... 433 cmd_files := $(wildcard $(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd)) 434 435 ifneq ($(cmd_files),) 436 include $(cmd_files) 437 endif
输入命令:
make -f ./scripts/Makefile.build obj=XXX
,《patsubst函数、wildcard函数、filter函数、sort函数》
- 7-15行:由下分析可知,由于输入的
XXX
没有tpl/
和spl/
目录,所以最终: prefix = .、 src = dir
如果 XXX = tpl/subdir, 则 prefix = tpl、 src = subdir
如果 XXX = spl/subdir, 则 prefix = spl、 src = subdir
如果 XXX = dir, 则 prefix = .、 src = dir- 45行:在执行《1. 加载 -include 声明的文件》时
include/config/auto.conf
已创建。- 46行:
$(prefix)
在 <7-15行> 中已定义为 prefix = .- 55行:在顶层 Makefile中 $(srctree) = .,
$(src)
在 <7-15行> 中有定义,所以:
如果 $(src) = dir1, 则 kbuild-dir = ./dir1
如果 $(src) = dir1/dir2, 则 kbuild-dir = dir1/dir2- 56-57行:从 <55行> 定义的
kbuild-dir
目录下查询是否存在Kbuild
或Makefile
文件,哪个文件存在就引用哪个,最终:
include XXX/Kbuild
include XXX/Makefile- 74-76行:为了尽可能多的引用文件,这里默认条件成立;
展开后为:# scripts/Makefile.build # 输入命令:make -f ./scripts/Makefile.build obj=XXX 8 src = XXX 13 prefix = . ...... 45 -include include/config/auto.conf 46 -include ./include/autoconf.mk 47 include scripts/Makefile.uncmd_spl 49 include scripts/Kbuild.include 57 include $(src)/Kbuild include $(src)/Makefile 71 include scripts/Makefile.lib 75 include scripts/Makefile.host ...... 433 cmd_files := $(wildcard $(foreach f,$(sort $(targets)),$(dir $(f