[openharmony]liteos-a编译过程分析

2021-10-11  本文已影响0人  itsenlin

背景

最近搞一个sensor接入openharmony的事情,在分析源码中的加速度计驱动相关源码时,发现不紧有BUILD.gn文件,还有Makefile文件,并且里面都有记录源文件路径。所以很困惑,openharmony是通过gn+ninja编译的还是通过make编译的?
为了搞清楚,所以针对liteos-a系统下的编译过程进行分析,在这里记录一下

入口

通过官方文档看,liteos-a系统编译时用的是官方的hb命令hb sethb build命令,所以入口肯定是hb工具
查看openharmony源码中build目录下有一个lite/hb目录(hb命令的源码目录,使用python脚本)

编译过程调试

看鸿蒙研究站里面有一篇介绍hb命令的调试方法,通过vscode+python插件调试,参见《v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程》

说明:

  {//hb build
      "name": "hb build debug",
      "type": "python",
      "request": "launch",
      "program": "./build/lite/hb/__main__.py",
      "console": "integratedTerminal",
      "args": ["build", "-f"],
      "stopOnEntry": true
  },

hb set

设置好之后就可以开始在vscode上调试

  1. 选择"hb set"调试目标并按F5,会停在./build/lite/hb/__main__.py的代码开始处

    hb命令调试.png
  2. 在80行打断点并按F5


    hb_set_1.png
  3. 按F11可以进入set.py的exec_command接口

    hb_set_2.png
  4. 然后就可以继续后续的调试工作,hb set命令主要是生成ohos_config.json这个后面编译要使用的配置文件,这里就不详细记录调试的过程了

    hb_set_3.png

hb build -f

这个是整个编译的重点,通过调试可以看到最终是调用了gn/ninja/fs_make,如下分析

  1. 前两步跟hb set命令一样,第三步会进入build.py的exec_command接口

    hb_build_1.png
  2. 这个接口的前面我们先略过,我们先在接口最后的build.build接口处加断点,并按F5


    hb_build_2.png
  3. 按F11进入,并在build_process.py的135行加断点再按F5

    hb_build_3.png
  4. 查看cmd_list变量的值有3个(除去内置的)接口,分别是Build.gn_buildBuild.ninja_buildPacker.fs_make

    hb_build_4.png

这个就是整体的编译过程了,先调用gn生成ninja文件,再通过ninja进行编译,最后通过fs_make制作镜像

因为内容太多,下面对这三个编译动作先做个整体的介绍,后续再对每一个进行详细分析

gn_build

继续调试,会先进入gn_build接口,看实现就是调用了gn gen命令,如下

hb_build_gn.png

查看gn_cmd变量,详细命令为(比较多,经过了整理):


hb_build_gn_cmd.png

这个命令之后,就会将工程中所有用到的BUILD.gn文件转换成<module_name>.ninja文件(类似makefile)供后面ninja命令(类似make)调用并进行编译

ninja_build

再继续调试就会进入ninja_build接口,实现以及执行的详细的ninja命令如下

hb_build_ninja.png

这个命令与make命令类似,但是注重速度(详细信息可以在网上搜索两者区别);此命令执行即是通过build.ninja/toolchain.ninja/各BUILD.gn转换的.ninja来进行编译,并生成.bin/.so/.a等文件

fs_make

编译结束

整个编译OK之后会输出如下图中成功信息


hb_build_ok.png

在out目录下就会生成烧录用到的镜像文件,如下图


hb_build_ok_outfiles.png
上一篇 下一篇

猜你喜欢

热点阅读