./scripts/Makefile.buid 的分析

000-016

定义变量 prefix 和 src
在这里插入图片描述
由于输入的是:
make -f ./scripts/Makefile.build obj=scripts/basic
make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig
第 8 行就是在“scripts/basic”或“scripts/kconfig ”中查找符合“tpl/%”的部分,然后将“tpl/”取消掉,但是“scripts/basic”或“scripts/kconfig ”没有“tpl/”,所以 src= “scripts/basic”或“scripts/kconfig ”即src=$(obj)

$(patsubst <pattern>,<replacement>,<text>)
作用:替换函数,用于在 text 中查找符合 pattern 的部分,如果匹配的话就用 replacement 替换掉。
参数:pattenr 是可以包含通配符“%”,如果 replacement 中也包含通配符“%”,那么 replacement 中的这个“%”将是 pattern 中的那个“%”所代表的字符串。
返回值:替换后的字符串。

017-018

Makefile.build 的默认目标和依赖
在这里插入图片描述

019-042

初始化 kbuild 文件中使用的所有相关变量
在这里插入图片描述

043-050

引用文件: include/config/auto.conf
引用文件:./include/autoconf.mk
引用文件: scripts/Makefile.uncmd_spl
引用文件: scripts/Kbuild.include
在这里插入图片描述

051-070

kbuild-dir = ./$(obj)
kbuild-file = ./$(obj)/Makefile
include ./$(obj)/Makefile
在这里插入图片描述
第55行:由000-016行可知,src=$(obj)(obj=scripts/basic 或 scripts/kconfig),没有以“/”为开头的单词,所以最终kbuild-dir=./$(obj)
第56行:由于./$(obj)里面没有kbuild文件存在,所以 kbuild-file=./$(obj)/Makefile

071-100

默认目标 _build 的依赖与实现
在这里插入图片描述
第71行:引用 scripts/Makefile.lib 文件,编译时用到这个文件中是一些变量和函数。
第74-76行:由于第57行对 ./$(obj)/Makefile的引用,这里$(hostprogs-y)必定不为空,条件成立,最终会引用scripts/Makefile.host,编译时用到这个文件中是一些变量和函数。
第78-80行:由前面可知 obj 已经定义并赋值了,这里条件不成立。
第84-86行:由第23-41行定义可知,strip返回值为空,这里条件不成立。
第88-90行:由第23-41行定义可知,strip返回值为空,这里条件不成立。
第96-99行:__build 是默认目标,因为命令“make -f ./scripts/Makefile.build obj=scripts/basic”没有指定目标,所以会使用到默认目标:__build。在顶层 Makefile 中,第339-340行中KBUILD_MODULES =,KBUILD_BUILTIN = 1

$(strip STR)
作用:去掉字符串中多余的空格符(若干单词,使用若干空字符分割)。
参数:“STR”开头和结尾的空字符,并将其中多个连续空字符合并为一个空字符。
返回值:无前导和结尾空字符、使用单一空格分割的多单词字符串。
例如:

STR =        a    b c
LOSTR = $(strip $(STR)) 
结果:a b c

100-152

一些变量的定义和赋值
在这里插入图片描述
第102-110行: KBUILD_CHECKSRC 未定义,所有为0,这里条件不成立。
第113-115行: CONFIG_DEBUG_SECTION_MISMATCH 未定义,这里条件不成立。
第121-125行:由于part-of-module未定义,所有modkern_cflags = $(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL),并且KBUILD_CFLAGS_KERNELCFLAGS_KERNEL也未定义,所以最终modkern_cflags为空。
第125行:empty未定义,所以quiet_modtag为空。
第127-137行:由于part-of-modulequiet_modtag未定义,所以这里的目标没有依赖也为空。
第140-149行:由于basetarget未定义,导致modname为空,所以这里的目标没有依赖也为空。
第151-152行:定义quiet_cmd_cc_s_ccmd_cc_s_c变量。

153-155

$(obj)/%.s : $(src)/%.c 的依赖与实现
在这里插入图片描述
第154行:由输入make -f ./scripts/Makefile.build obj=scripts/basicmake -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig可知,这里的 obj =scripts/basic scripts/kconfig,由第007-015行可知,src =$(OBJ) ,所以这里 src = scripts/basicscripts/kconfig,其实这里最终目标是将scripts/basicscripts/kconfig目录下的所有.c文件变成成.s文件,这里使用第155行的执行命令来完成。
第155行:调用 if_changed_dep 函数(此函数定义在 scripts/Kbuild.include 文件中,在第47行引用此文件 [ include scripts/Kbuild.include ]),参数为 cc_s_c

$(call VARIABLE, PARAM, PARAM,…)
作用:用于实现对用户自己定义函数引用。在执行时,将它的参数“ PARAM”依次赋值给临时变量“ $(1)”、“ $(2)”(这些临时变量定义在“ VARIABLE”的值中)…… call 函数对参数的数目没有限制,也可以没有参数值,没有参数值的“ call”没有任何实际存在的意义。执行时变量“ VARIABLE”被展开为在函数上下文有效的临时变量,变量定义中的“ $(1)”作为第一个参数,并将函数参数值中的第一个参数赋值给它;变量中的“ ( 2 ) ”一样被赋值为函数的第二个参数值;依此类推(变量 (2)”一样被赋值为函数的第二个参数值;依此类推(变量 (2)一样被赋值为函数的第二个参数值;依此类推(变量(0)代表变量“ VARIABLE”本身)。
返回值:参数值“ PARAM”依次替换“ $(1)”、“ $(2)”…… 之后变量“ VARIABLE”定义的表达式的计算值。

156-162

$(obj)/%.i : $(src)/%.c 的依赖与实现
在这里插入图片描述

163-177

$(obj)/%.symtypes : $(src)/%.c 的依赖与实现
在这里插入图片描述

178-273

$(obj)/%.o: $(src)/%.c 的依赖与实现
: $(obj)/%.o: $(src)/%.c 的依赖与实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第184-186行:由于 CONFIG_MODVERSIONS 未定义,满足条件,进入。
第187-261行:由于 CONFIG_MODVERSIONS 未定义,不满足条件,不进入。
第264-266行:由于第187-261行不进入,所以 recordmcount_source 未定义,为空。
第270-273行:由于第187-261行不进入,所以 recordmcount_source 未定义,为空。当同一个目标出现在多个双冒号规则中时,规则的执行顺序和普通规则的执行顺序一样,按照其在 Makefile 中的书写顺序执行。

274-281

$(obj)/%.lst: $(src)/%.c 的依赖与实现
在这里插入图片描述

282-295

$(obj)/%.s: $(src)/%.S 的依赖与实现
在这里插入图片描述

296-301

$(obj)/%.o: $(src)/%.S 的依赖与实现
在这里插入图片描述

302-305

targets 变量赋值
在这里插入图片描述

306-314

$(obj)/%.lds: $(src)/%.lds.S 的依赖与实现
在这里插入图片描述

315-323

$(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/tools/asn1_compiler 的依赖与实现
在这里插入图片描述

324-329

对 $(subdir-obj-y) 和 $(subdir-ym) 变量内容进行排序
在这里插入图片描述

330-345

$(builtin-target): $(obj-y) 的依赖与实现
在这里插入图片描述
由于没有定义 builtin-target 变量,所以这里条件不成立

346-358

$(modorder-target): $(subdir-ym) 的依赖与实现
在这里插入图片描述

359-371

$(lib-target): $(lib-y) 的依赖与实现
在这里插入图片描述
由于这里没有定义 lib-target 变量,所以这里条件不成立。

372-399

执行 multi_depend 命令
在这里插入图片描述

400-413

追加 targets 目标内容
在这里插入图片描述

414-444

默认目标的追加和设置为伪目标
在这里插入图片描述

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值