OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py
摘要:本文介绍了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文件。因为时间关系,仓促写作,或能力限制,若有失误之处,请各位读者多多指正。遗漏之处,欢迎补充。感谢阅读,有什么问题,请留言。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
openKylin 小程序上线啦!带你探索更多玩法~
为方便openKylin社区用户更好的参与社区互动,社区平台组推出了openKylin小程序,整合了会议管理、活动管理和问题反馈等功能。 会议管理模块:SIG小组管理员可快速的创建会议,SIG成员可查看与预约会议,会议临近时可进行消息提醒,满足日常便捷开会诉求。 活动管理模块:可随时查看社区发布的线上或线下活动,并可在小程序上进行报名。 问题反馈模块:可一键提交问题或需求,并可查看问题处理进度,非常的高效便捷。 点开长按识别下方二维码进入openKylin小程序 1分钟,带你了解openKylin微信小程序所有功能 1.注册登录 以下是openKylin小程序的注册登录流程: 其中,微信授权登录小程序后会提示您与openKylin社区ID绑定,这样更方便的让您看到您在社区里的所有贡献成果以及获得的所有积分信息。 2.会议创建权限申请 1、openKylin SIG小组角色有3种:Owner、Maintainer、Contributor。 2、原则上只有SIG小组的Owner和Maintainer才有创建会议的权限。 3、首次创建会议时,需要先填写giee账号进行权限的申请,由运营人员在...
- 下一篇
想会用synchronized锁,先掌握底层核心原理
摘要:synchronized锁修饰方法和代码块时底层实现上是一样的,但是在修饰方法时,不需要JVM编译出的字节码完成加锁操作,而synchronized在修饰代码块时,是通过编译出来的字节码生成的monitorenter和monitorexit指令来实现的。 本文分享自华为云社区《Synchronized底层核心原理》,作者: 小威要向诸佬学习呀 。 synchronized锁用于同步实例方法,同步静态方法和同步代码块。自从Java1.6开始,就对synchronized锁进行了很多方面的优化。对其引入了偏向锁,轻量级锁,适应性自旋锁,锁粗化,锁消除等各种技术方面的优化。 synchronized锁是基于monitor锁实现的,因此在讲解synchronized锁之前,有必要了解一下monitor锁。 monitor锁的原理 monitor,在中文中有监视器的意思,当创建对象时,每一个创建出来的对象都会关联一个monitor对象,对于一个java对象,当拿到这个monitor对象时,这个monitor对象就会处于锁定的状态,其他对象不会再获取,synchronized锁的本质就是基于...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作