![[openharmony]liteos-a系统编译之GN,第1张 [openharmony]liteos-a系统编译之GN,第1张](/aiimages/%5Bopenharmony%5Dliteos-a%E7%B3%BB%E7%BB%9F%E7%BC%96%E8%AF%91%E4%B9%8BGN.png)
从前面文件可以看到hb build调用的gn命令参数如下
这里详细分析一下gn工具在编译过程中的使用
这里简单介绍谨拍下GN工具的使用方法,gn语法可以参考 http://weharmonyos.com/openharmony/compile/gn/docs/
,已经熟悉的可以跳过
从上面图中可以看到使用的命令类型为 gn gen <output_dir>[options] ,此命令裤行就是为了将所有需要的BUILD.gn文件生成为*.ninja文件供ninja进行编译可以通过 gn help gen 命令查看详细的用法说明, 如下
下面重点说一下gn_cmd中的 [options]
liteos-a编译系统的dotfile内容如下:
liteos-a是嵌入式系统,而编译环境是linux系统,这就需要用到交叉编译方式,这个就可以在环境配置中指定 target_os 、 target_cpu 、 board_cpu 等等信息
这些信息就是 buildconfig 参数指定的 BUILDCONFIG.gn 文件中胡晌哗配置的
除了以上信息,还配置了以下几个重要信息
详细信息可以查看 //build/lite/config/BUILDCONFIG.gn 文件内容
toolchain定义源码编译需要的工具,像编译器、汇编器、连接器等等,一般在.gn所在目录下有一个 toolchain 目录,里面的 BUILD.gn 定义详细的编译工具链信息
这里目录结构如下:
从结构信息中可以看到定义了clang和gcc两种工具链,通过变量 board_toolchain_type 来区分(此变量也是buildconfig中定义的),具体信息参见BUILD.gn文件内容,如下
在.gn文件所在目录下的BUILD.gn就是入口,此文件做了以下几个事情
这里重点说一下target为 ohos 的 group 如下:
这里也比较好理解,里面就是读取一个配置文件,几级循环来处理配置文件中配置的内容。流程如下
到此就将此board下各模块的依赖关系添加好了,然后 GN 会将依赖树中所有的BUILD.gn生成对应的.ninja文件,并且在out的根目录下生成下面几个ninja的入口文件以及配置文件
在 文章 中已经分析段唯openharmony的小型系统(liteos-a)编译过程,最主要的就是调用gn/ninja/makefs三个命令最终生成可烧录的镜像文件在 文章 详细介绍了liteos-a系统编译时gn命令的原理,本文中针对liteos-a编译时ninja的使用做一些详细说明
通过前面文章中可以看到调用的ninja命令如下
ninja工具源码及文档路径为 https://github.com/ninja-build/ninja
网上也有很多中文版的资料,如 Ninja - chromium核心构建工具
类似gn工具需要在根目录下有一个.gn以及BUILD.gn文件,ninja工具运行需要根目录下有一个build.ninja文件,也即ninja编译规则的入口,此文件所在路径可以通过选项 -C dir 来指定,例如野陆liteos-a中使用的就是gn的out路径 /home/itsenlin/code/ohos_3.0/out/hispark_taurus/ipcamera_hispark_taurus
此文件是ninja编译工具的入口,类似于make的makefile;相对于makefile,ninja文件规则、依赖更简单,编译速度也会更快
打开此文件可以看到主要包含以下几块内容
这样在执行ninja命令时,就会默认build这个 all ,然后根据前面这个依赖关系进而编译整个系统
但是有一个问题,查看这个文件内容,并没有看到各模块目录下ninja的信息,握脊培这个是怎么关联进来的呢?
查看这个文件内容,这里面不仅仅有编译工具链相关的定义,还有对编译所需要的各模块的 .ninja 文件的关联也在这里,以及build.gn中定义的一些规则也转换成rule放在这个文件中了,如下
这样就关联上了编译所需要的所有的ninja文件,然后 ninja就会对每个依赖项进行编译,最终生成 .o 、 .a 、 .so 、 .bin 等文件
当前openharmony编译系统中不仅仅使用了gn+ninja,还使用了make+makefile。
举个例子,linux kernel的编译就是通过make编译的;而liteos kernel两者都有用,编译的文件也不一样,后面再详细分析吧
是怎么实现使用两种编译工具同时编译的呢?看生成的ninja文件(或者gn中的定义)不难看出是通过执行bash脚本来实现的,以liteos-a的make为例:
gn中有下面这个定义
转换成ninja规则如下
从上面定义看,就是ninja在编译到这个build的时候就会执行 //kernel/liteos-a/build.sh 脚本,而此脚本最后就是执行的 make 命令,如下
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)