写点什么

OpenHarmony 移植案例: build lite 源码分析之 hb 命令 __entry__.py

  • 2022-11-08
    中国香港
  • 本文字数:2480 字

    阅读完需:约 8 分钟

OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py

本文分享自华为云社区《移植案例与原理 - build lite源码分析 之 hb命令__entry__.py》,作者:zhushy 。


hb 命令可以通过 python pip 包管理器进行安装,应该是 OpenHarmony Build 的缩写,在 python 包名称是 ohos-build。hb 作为编译构建子系统提供的命令行,用于编译构建产品、芯片厂商组件或者单个组件。我们来学习 hb 命令行工具的源码,本文主要分析下文件 openharmony/build/lite/hb/__entry__.py。

1、find_top()函数


find_top()函数用于获取 OpenHarmony 源代码根目录,之前的系列文章分析过。代码也较简单,不再赘述。


def find_top():    cur_dir = os.getcwd()    while cur_dir != "/":        hb_internal = os.path.join(cur_dir, 'build/lite/hb_internal')        if os.path.exists(hb_internal):            return cur_dir        cur_dir = os.path.dirname(cur_dir)    raise Exception("Please call hb utilities inside source root directory")
复制代码

2、get_hb_commands()函数


get_hb_commands()函数用于返回 hb 命令行工具支持的命令集。hb 支持的命令定义在文件’build/lite/hb_internal/hb_command_set.json’中,支持的命令主要为 build、set、env、clean 和 tool。


def get_hb_commands(config_file):    if not os.path.exists(config_file):        raise Exception('Error: {} not exist, couldnot get hb command set'.format(config_file))    with open(config_file, 'r') as file:        config = json.load(file)        return config
复制代码

3、main()函数


在 main()函数中,首先获取 OpenHarmony 源代码根目录,然后把路径'build/lite'插入到 sys.path 系统搜索路径,为后续调用 importlib.import_module 接口进行动态加载做准备。⑴处定义 hb 命令行的支持的选项,使用和命令输出hb -h结合起来学习源代码。⑵处获取 hb 命令行工具支持的命令集合,然后添加到命令行解析参数列表里 parser_list。⑶和⑷配置支持的positional arguments(见 hb -h 的输出),⑶处动态引入支持的模块,这些对应文件 build/lite/hb_internal/hb_internal/XXX/XXX.py,其中 XXX 的取值为 build、set、clean、env 和 tool。在这几个 python 文件中,都会有 add_options()函数,用于提供具体命令的参数选项,还有个函数 exec_command(),执行具体的命令时,会调用这些函数。⑷处的代码会配置刚才描述的 add_options()函数和函数 exec_command()。


⑸处的语句获取 hb 命令传入的参数选项,接下来动态加载’hb_internal.common.utils’,获得函数地址,分别用于控制台输出日志、异常处理等。接下来处理 hb 命令行传入的选项,⑹处如果指定了’-root’|’–root_path’选项时,开发者主动提供 OpenHarmony 源代码根目录,会执行args[0].root_path = topdir把根目录传入到参数列表里。⑺根据是 hb tool 还是其他命令,分别调用对应的函数 exec_command(),命令行选项不一样时,传入的参数稍有差异,分别是 args 和 args[0]。对于 hb tool,args[1]会传递些要传递给 gn 命令行的参数 gn_args。


def main():    try:        topdir = find_top()    except Exception as ex:        return print("hb_error: Please call hb utilities inside source root directory")    sys.path.insert(0, os.path.join(topdir, 'build/lite'))⑴  parser = argparse.ArgumentParser(description='OHOS Build System '                                     f'version {VERSION}')    parser.add_argument('-v',                        '--version',                        action='version',                        version=f'[OHOS INFO] hb version {VERSION}')
subparsers = parser.add_subparsers() parser_list = []
⑵ command_set = get_hb_commands(os.path.join(topdir, 'build/lite/hb_internal/hb_command_set.json')) for key, val in command_set.items(): parser_list.append({'name': key, 'help': val})
for each in parser_list: module_parser = subparsers.add_parser(name=each.get('name'), help=each.get('help'))⑶ module = importlib.import_module('hb_internal.{0}.{0}'.format( each.get('name')))⑷ module.add_options(module_parser) module_parser.set_defaults(parser=module_parser, command=module.exec_command)
⑸ args = parser.parse_known_args()
module = importlib.import_module('hb_internal.common.utils') hb_error = getattr(module, 'hb_error') hb_warning = getattr(module, 'hb_warning') ohos_exception = getattr(module, 'OHOSException') try:⑹ if args[0].parser.prog == 'hb set' and 'root_path' in vars(args[0]): # Root_path is topdir. args[0].root_path = topdir⑺ if "tool" in args[0].parser.prog: status = args[0].command(args) else: status = args[0].command(args[0]) except KeyboardInterrupt: hb_warning('User Abort') status = -1 except ohos_exception as exception: hb_error(exception.args[0]) status = -1 except Exception as exception: if not hasattr(args[0], 'command'): parser.print_help() else: hb_error(traceback.format_exc()) hb_error(f'Unhandled error: {exception}') status = -1
return status
复制代码

4、参考站点


5、小结


本文介绍了 build lite 轻量级编译构建系统 hb 命令的源码,主要分析了_\entry__.py 文件。因为时间关系,仓促写作,或能力限制,若有失误之处,请各位读者多多指正。遗漏之处,欢迎补充。感谢阅读,有什么问题,请留言。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py_鸿蒙_华为云开发者联盟_InfoQ写作社区