1.5.4.3 hb build流程
build模块的run接口源码如下:
def run(self):
try:
self._prebuild()
self._preload()
self._load()
self._pre_target_generate()
self._target_generate()
self._post_target_generate()
self._pre_target_compilation()
self._target_compilation()
except OHOSException as exception:
raise exception
else:
self._post_target_compilation()
finally:
self._post_build()
build将全过程分为数个阶段依次进行:
-
_prebuild()
源码:
def _prebuild(self):
self._run_phase(BuildPhase.PRE_BUILD)
解析参数
调用_run_phase()接口,解析prebuild阶段的参数。参数如下表:
参数名称 | 说明 | 默认值 |
target_cpu | 目标cpu,可选值arm,arm64,x86_64,x64 | arm |
target_os | 目标os,可选值android,ohos | ohos |
product_name | 产品名称 | 空 |
rename_last_log | 是否保留上次的日志 | true |
ccache | 是否打开ccache | true |
enable_pycache | 是否打开pycache | false |
jobs | 已废弃 | |
disable_part_of_post_build | 已废弃 | |
build_target | 指定单个编译目标 | 空 |
ninja_args | 指定ninja的参数 | 空 |
full_compilation | 是否完整编译,默认是images,打开后,将增加make_all和make_test | false |
各个参数的处理函数源码位于build/hb/resolver/build_args_resolver.py:
-
-
-
resolve_target_cpu()
-
-
设置目标cpu,更新配置文件ohos_config.json
-
-
-
resolve_target_os()
-
-
设置目标os,更新配置文件ohos_config.json
-
-
- resolve_product()
-
读取配置,初始化BuildModuleInterface下的target_generator,流程:
-
-
-
resolve_rename_last_log()
-
-
将build.log文件重命名
-
-
-
resolve_ccache()
-
-
target_generator注册ohos_build_enable_ccache参数
设置ccache的环境变量,
设置ccache缓存目录
设置ccache日志文件
设置ccache缓存大小为100G
-
-
-
resolve_pycache()
-
-
如果为true,则执行命令:
/bin/bash -c python3 {src_root}/build/scripts/util/pyd.py --root /home/pan/.pycache --start &
命令将设置pycache根目录,并开启python缓存服务。
-
-
-
resolve_build_target()
-
-
为编译指定目标,如果该参数未指定,则编译目标为images。
注册参数build_target到target_compiler
-
-
-
resolve_ninja_args()
-
-
为ninja阶段指定参数
注册参数ninja_args到target_compiler
-
-
-
resolve_full_compilation()
-
-
是否全部编译参数。
如果为true,则target_compiler的build_target增加make_all和make_test。
-
_preload()
解析参数并运行服务。
def _preload(self):
self._run_phase(BuildPhase.PRE_LOAD)
if self.args_dict.get('fast_rebuild', None) and not self.args_dict.get('fast_rebuild').arg_value:
self.preloader.run()
参数解析
调用_run_phase()解析PRELOAD阶段的参数。该阶段无参数供解析。
服务
如果存在fast_rebuild参数,则跳过随后的preloader预加载过程。否则,执行preloader的run(),进行预加载。
preloader的源码位于services目录,目录结构如下:
build/hb/services/
├── gn.py
├── interface
│ ├── build_executor_interface.py
│ ├── build_file_generator_interface.py
│ ├── load_interface.py
│ ├── menu_interface.py
│ ├── preload_interface.py
│ └── service_interface.py
├── loader.py
├── menu.py
├── ninja.py
├── preloader.py
包括menu、loader、preloader、gn、ninja等服务。
预加载run()源码:
def run(self):
self.__post_init__()
self._generate_build_prop()
self._generate_build_config_json()
self._generate_parts_json()
self._generate_parts_config_json()
self._generate_build_gnargs_prop()
self._generate_features_json()
self._generate_syscap_json()
self._generate_exclusion_modules_json()
self._generate_platforms_build()
self._generate_subsystem_config_json()
self._generate_systemcapability_json()
self._generate_compile_standard_whitelist_json()
-
-
-
__post_init__()
-
-
加载配置,包括目录定义、输出目录、组件信息、工具链、子系统、白名单等。
-
-
-
_generate_build_prop()
-
-
写入编译用的变量信息。输出文件out/preloader/rk3568/build.prop
-
-
-
_generate_build_config_json()
-
-
与build.prop相同的信息,格式json,路径out/preloader/rk3568/build_config.json
-
-
-
_generate_parts_json()
-
-
写入所有组件信息,格式json,文件路径out/preloader/rk3568/parts.json
-
-
-
_generate_parts_config_json()
-
-
写入所有组件信息,子系统名称与组件名称用下划线链接,文件格式json,路径out/preloader/rk3568/parts_config.json
-
-
-
_generate_build_gnargs_prop()
-
-
写入所有组件的features信息,文件路径out/preloader/rk3568/build_gnargs.prop
-
-
-
_generate_features_json()
-
-
写入所有组件features信息以及features与parts关系map,json文件,文件路径out/preloader/rk3568/features.json
-
-
-
_generate_syscap_json()
-
-
写入所有组件的syscap信息,json文件,文件路径out/preloader/rk3568/syscap.json
-
-
-
_generate_exclusion_modules_json()
-
-
写入所有组件的exclusions信息,json文件,文件路径out/preloader/rk3568/exclusion_modules.json
-
-
-
_generate_platforms_build()
-
-
写入平台编译信息,文件路径out/preloader/rk3568/platforms.build
-
-
-
_generate_subsystem_config_json()
-
-
写入子系统信息,文件路径out/preloader/rk3568/subsystem_config.json
-
-
-
_generate_systemcapability_json()
-
-
写入产品的syscap信息,文件路径out/preloader/rk3568/SystemCapability.json
-
-
-
_generate_compile_standard_whitelist_json()
-
-
写入白名单信息,文件路径out/preloader/rk3568/compile_standard_whitelist.json