六、make目录中的main.mk

一、android build system编译系统概述
二、envsetup.sh脚本(Android10)
三、soong_ui.bash脚本
四、soong_ui的main.go
五、kati中调用main.mk
六、make目录中的main.mk
七、AndroidProducts.mk
八、module-info.json
九、子模块的执行


编译的逻辑顺序

1. 执行source envsetup.sh脚本

执行source envsetup.sh脚本,初始化环境变量和常用命令函数,如lunch,make,m/mm/mmm,mma/mmma

参考envsetup目录相关文档

2. 执行lunch命令

执行lunch命令读取项目配置信息

此时会调用build/make/core/config.mk脚本

3. 执行makeorm命令开始编译

这一步会用到build/make/core/main.mk

main.mk

1. kati与main.mk

ifndef KATI
... #1流程
else #KATI 
... #2流程
endif #KATI 

第一次是没有KATI的话就去执行流程1 (这时用的是make命令)

第二次是有KATI的话就去执行流程2 (这时用的是kati命令)

一般来讲,不会走到流程1,soong_ui调用kati,直接走流程2

2. Android.mk加载

/build/make/core/main.mk文件中,通过如下方式include每个子目录的Android.mk

#
# Include all of the makefiles in the system
#

subdir_makefiles := $(SOONG_ANDROID_MK) $(file <$(OUT_DIR)/.module_paths/Android.mk.list)
subdir_makefiles_total := $(words int $(subdir_makefiles) post finish)
.KATI_READONLY := subdir_makefiles_total

$(foreach mk,$(subdir_makefiles),$(info [$(call inc_and_print,subdir_makefiles_inc)/$(subdir_makefiles_total)] including $(mk) ...)$(eval include $(mk)))

正因为这一块儿逻辑,所以我们经常能在编译时看到[xxx/xxx] including xxxx这样的log

2.1 inc_and_print宏函数

此函数是用计数,每调用一次传进来的$1变量多一个.字符串。计算$1变量总共有几个.

可以理解为调用一次计数+1一次。

这里的$1就是subdir_makefiles_inc变量

具体函数定义如下

# $1 is the variable name to increment
define inc_and_print
$(strip $(eval $(1) := $($(1)) .)$(words $($(1))))
endef
2.2 subdir_makefiles_total变量

subdir_makefiles_total变量通过$(words),计算$subdir_makefiles加上intpostfinish三个字符串一供几个字符串,得出需要include的makefile文件的总数字

subdir_makefiles_total变量和subdir_makefiles_inc变量,配合起来使用。显示编译进度。

2.3 Android.mk.list

$(OUT_DIR)/.module_paths/Android.mk.list中存放着此次编译找到的所有Android.mk文件

2.4 build/soong/ui/build/finder.go

build/soong/ui/build/finder.go中的func FindSources(ctx Context, config Config, f *finder.Finder)函数定义了如下逻辑:

  • 搜索Android源码中的Android.mk文件,将对应的文件路径放入Android.mk.list文件中
  • 搜索Android源码中的Android.bp文件,将对应的文件路径放入Android.bp.list文件中
  • 搜索Android源码中的CleanSpec.mk文件,将对应的文件路径放入CleanSpec.mk.list文件中
  • 搜索Android源码devicevendorproduct目录中的AndroidProducts.mk文件,将对应的文件路径放入AndroidProducts.mk.list文件中

FindSources函数会在soong_ui中被调用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值