1.5.5 hb其他
除了编译相关的hb set和hb build,hb还有其他模块。
1.5.5.1 hb env
env主要是打印编译环境信息。
env的相关源码与set、build类似:
- build/hb/modules/interface/env_module_interface.py
- build/hb/modules/ohos_env_module.py
- build/hb/resolver/env_args_resolver.py
- build/hb/resources/args/default/envargs.json
run()源码:
def run(self):self.env_check()self.env_install()
env的参数:
参数名称 | 说明 | 默认值 |
check | 检查运行环境下的全部依赖 | true |
install | 安装所有依赖 | false |
env_check():
解析参数check,调用resolve_check()函数,检查文件build/scripts/build_package_list.json列出的软件,提示错误。
读取文件ohos_config.json,打印保存的参数。
env_install():
执行脚本build/build_scripts/env_setup.sh,但该脚本运行时有错误,不建议将该参数设置为true。
1.5.5.2 hb clean
clean的功能是清除编译生成的文件
相关源码:
build/hb/modules/interface/clean_module_interface.py
build/hb/modules/ohos_clean_module.py
build/hb/resolver/clean_args_resolver.py
build/hb/resources/args/default/cleanargs.json
run()的源码:
def run(self):
self.clean_regular()
self.clean_deep()
clean的参数分为两个阶段REGULAR和DEEP,对应函数clean_regular()和clean_deep(),参数如下:
参数名称 | 说明 | 阶段 | 默认值 |
clean-args | 清除上次编译产生的所有参数 | REGULAR | true |
clean-all | 清除所有的producer | DEEP | false |
clean-out-product | 清除out/rk3568目录 | DEEP | false |
clean-ccache | 清除.ccache目录 | DEEP | false |
参数解析:
- clean-args:resolve_clean_args()
删除out/hb_args下的json文件
- clean-out-product:resolve_clean_out_product()
删除输出目录out_path
- clean-ccache:resolve_clean_ccache()
删除.ccache目录
- clean-all:resolve_clean_all()
删除输出目录,删除.ccache目录
1.5.5.3 hb tool
tool提供编译工具。
相关的源码:
build/hb/modules/interface/tool_module_interface.py
build/hb/modules/ohos_tool_module.py
build/hb/resolver/tool_args_resolver.py
build/hb/resources/args/default/toolargs.json
run()源码:
def run(self):
if self.args_dict['ls'].arg_value:
self.list_targets()
elif self.args_dict['desc'].arg_value:
self.desc_targets()
elif self.args_dict['path'].arg_value:
self.path_targets()
elif self.args_dict['refs'].arg_value:
self.refs_targets()
elif self.args_dict['format'].arg_value:
self.format_targets()
elif self.args_dict['clean'].arg_value:
self.clean_targets()
else:
Arg.get_help(ModuleType.TOOL)
tool的功能分为ls、desc、path、refs、format、clean。
各功能源码:
def list_targets(self):
self.args_resolver.resolve_arg(self.args_dict['ls'], self)
def desc_targets(self):
self.args_resolver.resolve_arg(self.args_dict['desc'], self)
def path_targets(self):
self.args_resolver.resolve_arg(self.args_dict['path'], self)
def refs_targets(self):
self.args_resolver.resolve_arg(self.args_dict['refs'], self)
def format_targets(self):
self.args_resolver.resolve_arg(self.args_dict['format'], self)
def clean_targets(self):
self.args_resolver.resolve_arg(self.args_dict['clean'], self)
tool的参数如下:
参数名称 | 说明 | 阶段 | 默认值 |
ls | 列出与给定目录匹配的所有目标 | prebuild | [] |
desc | 显示给定目标或配置的信息 | prebuild | [] |
path | 查找两个目标之间的依赖路径 | prebuild | [] |
refs | 查找反向依赖 | prebuild | [] |
format | 格式化.gn文件 | prebuild | [] |
clean | 删除输出目录中除args.gn以外的内容 | prebuild | 空 |
- ls:resolve_list_targets()
源码:
@staticmethod
def resolve_list_targets(target_arg: Arg, tool_module: ToolModuleInterface):
out_dir = ''
args_list = []for arg in target_arg.arg_value:if '-' not in arg and len(out_dir) == 0:
out_dir = argelse:
args_list.append(arg)
tool_module.gn.execute_gn_cmd(
cmd_type=CMDTYPE.LS, out_dir=out_dir, args_list=args_list)
执行gn ls 命令,列出所有目标。ls命令的子参数如下:
子参数名称 | 说明 | 阶段 | 默认值 |
all-toolchains | 工具链 | prebuild | false |
as | 列出不同格式的目标。可选值:buildfile、label、output | prebuild | 空 |
testonly | 测试,可选值true、false | prebuild | false |
type | 按类型显示,类型:action、copy、executable、group、loadable_module、shared_library、source_set、static_library | prebuild | 空 |
all-toolchains:
列出所有在 gn 配置中定义的工具链。
例如:
python build/hb/main.py tool --ls out/rk3568 --all-toolchains=true
as:
- --as=buildfiles:列出所有的 BUILD 文件的路径。
- --as=label:列出目标的标签。
- --as=outout:列出输出文件。
例如:
python build/hb/main.py tool --ls out/rk3568 --as=buildfiles
python build/hb/main.py tool --ls out/rk3568 --as=label
python build/hb/main.py tool --ls out/rk3568 --as=output
testonly:
列出testonly标记的目标
例如
python build/hb/main.py tool --ls out/rk3568 --testonly=true
type:
按照目标类型显示
action : 一次性执行脚本的动作
copy : 拷贝
executable: 可执行程序
group : 组
loadable_module: 可加载模块
shared_library : 动态库
source_set : 源码集
static_library : 静态库
例如,列出//base/startup/init下所有的可执行程序
python build/hb/main.py tool --ls out/rk3568 //base/startup/init/* --type=executable
- desc:resolve_desc_targets()
执行gn desc命令,打印目标的描述信息,包括defines、cflags、deps、libs、outputs等。
源码:
@staticmethod
def resolve_desc_targets(target_arg: Arg, tool_module: ToolModuleInterface):
out_dir = ''
args_list = []for arg in target_arg.arg_value:if ':' in arg:
try:
component_name, module_name = arg.split(':')
args_list.append(ComponentUtil.get_component_module_full_name(
out_dir, component_name, module_name))
except Exception:
raise OHOSException('Invalid desc args: {} ,need <component:module>'.format(arg))elif '-' not in arg and len(out_dir) == 0:
out_dir = arg
else:
args_list.append(arg)
tool_module.gn.execute_gn_cmd(cmd_type=CMDTYPE.DESC, out_dir=out_dir, args_list=args_list)
解析输入的组件名称和模块名称过程:
扫描out/rk3568/build_configs目录下的所有子目录,匹配组件名称与子文件夹名称是否相同,从子目录下的BUILD.gn文件中读取相关信息。
例如电话子系统中的ril_adapter:ril_vendor,解析后为//base/telephony/ril_adapter/services/vendor:ril_vendor。
python build/hb/main.py tool out/rk3568 --desc ril_adapter:ril_vendor
- path:resolve_path_targets()
执行gn path命令,打印两个目标之间的依赖路径项。
源码与desc类似。
这里组件与模块名称的格式与desc保持一致,需要与out/rk3568/build_configs目录下的名称保持一致。
例如:
python build/hb/main.py tool out/rk3568 --path ril_adapter:hril hilog:libhilog
- refs:resolve_refs_targets()
执行gn refs命令,打印反向依赖项。列出依赖于目标的所有目标项。
源码与desc类似。
例如:
python build/hb/main.py tool out/rk3568 --refs ril_adapter:hril
- format:resolve_format_targets()
执行gn format命令,格式化gn文件。
@staticmethod
def resolve_format_targets(target_arg: Arg, tool_module: ToolModuleInterface):
tool_module.gn.execute_gn_cmd(cmd_type=CMDTYPE.FORMAT, args_list=target_arg.arg_value)
例如:
python build/hb/main.py tool --format base/startup/init/services/BUILD.gn
- clean:resolve_clean_targets()
执行gn clean命令,删除输出目录中除args.gn和以外的内容。
源码:
@staticmethod
def resolve_clean_targets(target_arg: Arg, tool_module: ToolModuleInterface):
out_dir = ''
out_dir = target_arg.arg_value #这里稍微改了一下
tool_module.gn.execute_gn_cmd(cmd_type=CMDTYPE.CLEAN, out_dir=out_dir)
例如:
python build/hb/main.py tool --clean out/rk3568
1.5.5.4 hb help
help负责打印帮助信息。
读取各个模块argument的json文件,获取帮助信息打印。
主要源码位于build/hb/containers/arg.py文件get_help函数。