./scripts/Makefile.build 分析

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 	@:
  1. 96行: $(KBUILD_BUILTIN)在顶层 Makefile 中定义为:KBUILD_BUILTIN := 1,这里条件成立;
  2. 97行: $(KBUILD_MODULES)在顶层 Makefile 中定义为:KBUILD_MODULES :=,这里条件不成立;


所以展开为:

# scripts/Makefile.build 
96 __build: $(builtin-target) $(lib-target) $(extra-y) $(subdir-ym) $(always)
99 	@:

由上可知,目标__build的创建规则为@:,表示什么都不做,所以只需创建目标的依赖即可。
在这里插入图片描述


最终:

  1. 引用包含变量定义及创建规则的文件,见《1.1 引用文件》
  2. 创建$(builtin-target),见《1.2 创建 $(builtin-target)》
  3. 创建$(lib-target),见《1.3 创建 $(lib-target)》
  4. 创建$(extra-y),见《1.4 创建 $(extra-y)》
  5. 创建$(subdir-ym),见《1.5 创建 $(subdir-ym)》
  6. 创建$(always),见《1.6 创建 $(always)》
  7. 《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函数》

  1. 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
  2. 45行:在执行《1. 加载 -include 声明的文件》include/config/auto.conf已创建。
  3. 46行:$(prefix)在 <7-15行> 中已定义为 prefix = .
  4. 55行:在顶层 Makefile中 $(srctree) = .$(src)在 <7-15行> 中有定义,所以:
    如果 $(src) = dir1,    则 kbuild-dir = ./dir1
    如果 $(src) = dir1/dir2, 则 kbuild-dir = dir1/dir2
  5. 56-57行:从 <55行> 定义的kbuild-dir目录下查询是否存在KbuildMakefile文件,哪个文件存在就引用哪个,最终:
    include  XXX/Kbuild
    include  XXX/Makefile
  6. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值