OpenHarmony基线功能之编译 原创 精华
鸿蒙系统的编译构建是基于 gn 和 ninja 完成的。
构建工具介绍
构建工具演进史
代码规模 | 构建工具 | 命令 |
---|---|---|
几个代码文件 | Gcc | gcc helloworld.c |
几十个源代码文件 | GNU Make | |
软件规模进一步扩大 | cmake | Makefile |
现代跨平台 | ninja、gn | build.ninja、 |
cmake
使用cmake,编写统一的makefile文件,最后由cmake自动生成各平台相关的makefile文件执行编译,这一点上,cmake已经是比较好的跨平台工具了,一般的跨平台工程基本已经满足需求了。
Ninja
Ninja 是借由 Google Chrome 项目而诞生的一个构建工具,它的诞生目标是为了速度。换句话说,在 Google Chrome 项目的开发过程中,开发者们认为同类型的其它构建工具不给力,所以才会考虑重新开发更高效的工具。
参考:https://harmonyos.51cto.com/posts/2972#bkwz
编译的过程就是将c文件先编译成o文件,再把多个o文件链接成可执行目标文件。构建文件build.ninja包含三个部分:动作定义、上下游关系、构建目标,Ninja通过解析构建文件,完成编译动作,最终输出编译目标文件。因为大型工程的编译,很大一部分时间都花在了源文件编译依赖树的分析这块,而ninja更像是一个编译器的预处理,其主要目的是舍弃gcc、msvc、clang等编译器在编译过程中递归查找依赖的方式,因为这里存在很多重复的依赖查找,而ninja改进了这一过程,提前生成编译依赖树,编译期间按照编译依赖树的顺序依次编译,这样就大大减少了编译期间杂乱的编译顺序造成的重复依赖关系查找。
gn
当工程规模增大到难以想象的量级时,工程模块的划分和编译速度变得尤为重要,其中chromium工程就遇到这两个问题,于是最初诞生了gyp,最后演化升级为gn,其旨在追求工程更加清晰的模块和结构呈现,以及更快的编译速度。前者通过语法层面实现,后者则依靠ninja来提升编译速度。
gn、ninja、make和cmake的关系
ninja工具 Make GUN工具 功能作用
gn <---------->cmake ------------->生成构建文件
xxx.gn<---------->CMakeList -------------->描述构建所需的编译文件
xxx.ninja<----------> Makefile --------------->描述代码的具体编译步骤
ninja <----------> Make ----------------> 编译代码
代码库和目录
代码
OpenHarmony的代码开源并维护在https://gitee.com/openharmony,使用git/repo工具下载和上传代码。代码下载参见:https://www.openharmony.cn/download。到目前为止,OpenHarmony项目已经建有库341个。
git:对单个配置库进行代码pull和push。
repo:repo需要维护当前git库的数量、名称、路径等,有了这些基本信息,才能对这些git库进行操作。
default.xml指定项目包含哪些库、库在项目中代码路径
manifest.project.name:库名
manifest.project.path:库在项目中代码路径
以uuid库为例
库
Mainfest/default.xml
OpenHarmony/third_pard/libuuid
建本地项目代码:repo init -u ssh://gitlab@gitlab.kaihongdigi.com:3322/L2/OpenHarmonyrk/manifest.git -b home_os_1102 -m khbox.xml --no-repo-verify
-b:分支
-m:库文件,不指定即用default.xml
同步代码:repo sync -c
切换分支:repo start home_os_1102 --all
取消本地修改:repo forall -vc “git reset --hard”
2.目录结构
项目目录结构
库目录结构
OpenHarmony编译流程
编译命令:./build.sh --product-name rk3566
gn gen构建流程为:
1.在当前目录中查找.gn 文件,然后沿着目录树向上走,直到找到.gn文件所在目录为止。将此目录设置为“source root”并解析此文件以查找构建配置文件的名称。
2.执行构建配置文件(这是默认的工具链)。
3.将BUILD.gn文件加载到根目录中。
4.递归加载BUILD.gn其他目录以解析所有当前依赖项。
5.解决目标的依赖关系后,将.ninja文件写入磁盘。
6.解决所有目标后,写出根build.ninja文件。
增加第三方库
1.在项目库新增git库:third_party_sdl
2.将代码拷贝到git库相应的分支
3.修改项目文件manifest/anbox.xml
4.在third_party_sdl根目录新建BUILD.gn,必须要在其他项目配置依赖于该第三库,不然不会参与编译。
5.参照makefile文件,编译并输出动态库或者静态库
6.单独编译第三方库:hb build -T //third_party/sdl:libSDL2
FAQ
重新全量编译
删除~/OpenHarmonyrk/out/ohos-arm-release
把虚拟机代码共享到本地
https://www.linuxidc.com/Linux/2018-11/155466.htm
六、参考:
跨平台:GN实践详解(ninja, 编译, windows/mac/android实战)强烈推荐
https://harmonyos.51cto.com/posts/10614
ninja和gn
https://zhuanlan.zhihu.com/p/136954435
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
anbox怎么移植到鸿蒙系统上编译呢?