[openharmony]liteos-a系统编译之GN

[openharmony]liteos-a系统编译之GN,第1张

在 文章 中已经分析openharmony的小型系统(liteos-a)编译过程,最主要的就是调用gn/ninja/makefs三个命令最终生成可烧录的镜像文件

从前面文件可以看到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 命令,如下


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/8218955.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存