#打卡不停更# 移植案例与原理 - build lite hb命令__main__.py 原创 精华
移植案例与原理 - build lite源码分析 之 hb命令__main__.py
hb命令可以通过python pip包管理器进行安装,应该是OpenHarmony Build的缩写,在python包名称是ohos-build。hb作为编译构建子系统提供的命令行,用于编译构建产品、芯片厂商组件或者单个组件。本文,我们来学习hb的源码。
1、hb的安装、卸载与简单介绍
在源码根目录下执行下述命令可以进行安装。
执行hb -h有相关帮助信息,有打印信息即表示安装成功:
需要注意的是,需要在OpenHarmony的源代码目录下才能执行hb命令,否则会提示:hb_error: Please call hb utilities inside source root directory
。后文源码分析时,会讲述为啥要在源码目录下才能执行该hb。
卸载方法,执行下述命令即可:
另外,需要了解的一个比较好用的命令,如下,可以查看安装的python包的信息:
执行后,输出如下信息。比较关键的是,可以知道hb命令对应源文件的安装位置在...lib/python3.8/site-packages
。
。hb命令工具的位置可以通过which hb
来查看。
在文件夹...lib/python3.8/site-packages/hb
有3个文件,__init__.py
是空文件表示python模块,__main__.py
是执行入口文件,__entry__.py
事实上并没有使用到。这3个文件和目录build/lite/hb
下的文件是一模一样的。
2、hb源码分析
通过which hb
来查看hb命令工具的位置,我的环境上,位置为~/.local/bin/hb
,该文件是通过pip安装的,其实是个python文件。我们来查看其文件内容。⑴处导入的main函数来自...lib/python3.8/site-packages/hb/__main__.py
。⑵处sys.argv[0]指的是执行的程序名称,这里等于hb
,该语句表示以-script.pyw
或者.exe
结尾的部分去除,例如,假设sys.argv[0]为test-script.pyw,则替换后的sys.argv[0]为test。使用pip安装的包通常都是这样的写法。
接下来,我们来分析下源文件...lib/python3.8/site-packages/hb/__main__.py
。
2.1、hb/main.py 动态执行python代码片段EXECV_FRAGMENT
python -c
命令可以直接在命令行中调用python代码, 实际上-c
就是command
的意思,就是python -c
可以在命令行中执行python代码, 跟把代码放置在.py
文件中,然后运行这个文件是一样的效果。
__main__.py
文件中会动态执行python代码片段如下,解释下⑴处的代码。当我们导入一个模块时:import XXX,默认情况下python解释器会搜索当前目录、已安装的内置模块和第三方模块,如果都搜索不到,则会报错。
我们的搜索路径存放在sys模块中的path中,sys.path是当前路径的一个列表。[即默认路径可以通过sys.path来打印查看]。当我们要添加自己的引用模块搜索目录时,可以通过list的append方法。sys.argv.pop()表示参数列表中的最后一项,指的是openharmony\build\lite\hb\
目录,下文会详细解释。
⑵处动态导入模块对象,"entry"指的是openharmony\build\lite\hb\__entry__.py
。所以,我们只使用到了openharmony\build\lite\hb\__entry__.py
,而不是使用python3.8/site-packages/hb/__entry__.py.py
。
2.2、hb/main.py find_top()函数
find_top()函数用于获取OpenHarmony源代码根目录。⑴处先获取当前工作目录,hb命令在哪个目录下执行,就是当前的工作目录。⑵处开始while循环,结束条件是遍历到系统根目录或者return返回。⑶处判断是否存在目录’build/lite/hb_internal’,如果存在,即可获得OpenHarmony源码根目录。如果不存在,则执行⑷获取上一级目录,继续循环。遍历的目录不存在’build/lite/hb_internal’目录,则抛出异常。从这些源码可知,hb不能在非OpenHarmony源代码目录下执行,但又可以在OpenHarmony源码目录下的任何一个目录执行。
2.3、hb/main.py search()函数
search()函数从指定的目录下查询是否存在指定的文件,如果存在,则返回包含指定文件的目录路径。代码如下,这代码也容易被挑战。对于不存在指定文件的情况下,就没有return语句,这样代码不规范。
2.4、hb/main.py main()函数
接下来,我们来看下main()函数。首先调用find_top()函数获得OpenHarmony源码根目录。⑴处判断是否存在文件’prebuilts/python’,如果不存在则打印,告知开发者需要"please execute build/prebuilts_download.sh"来完成环境准备。⑵处开始,获取4个变量的值,如下表:
变量 | 值 | 说明 |
---|---|---|
python_dir | openharmony/prebuilts/python/linux-x86/3.9.2/bin | 包含python3执行文件的目录 |
python_executable | openharmony/prebuilts/python/linux-x86/3.9.2/bin/python3 | python3执行文件路径 |
lite_dir | openharmony/build/lite | build lite目录 |
hb_dir | openharmony/build/lite/hb | __entry__.py所在的目录 |
⑶处封装要参数列表,要动态执行的脚本EXECV_FRAGMENT,已经在前文解释。⑷处把命令行执行hb命令时传入的参数,添加到param_list变量,⑸处最后添加的参数是__entry__.py所在的目录。在解释动态执行python代码片段EXECV_FRAGMENT时,提到的sys.argv.pop()
就是刚刚添加的这个目录。接下来,⑹处的代码设置环境变量,然后调用函数os.execv来执行。后文再详细分析__entry__.py。
3、参考站点
4、小结
本文介绍了build lite 轻量级编译构建系统hb命令的源码,主要分析了__main__.py文件。因为时间关系,仓促写作,或能力限制,若有失误之处,请各位读者多多指正。遗漏之处,欢迎补充。感谢阅读,有什么问题,请留言。
轻量和小型系统编译构建指导 的链接好像挂了,方便补一下吗?
docs文档系统更新了,链接不存在了,已修复,感谢反馈
围观大佬源码讲解
讲解的很细,学到了很多