概述
相比起 Linux 中常用的 cmake 和 make 构建工具,在 OpenHarmony 主要采用 GN 和 ninja 用于构建项目。
如上图所示,GN 和 ninja 可以类比为 Cmake 和 make 的关系。
以下是 GN 和 ninja 的介绍。
一.GN
GN(generate ninja)即自动生成 ninja 的工具。
由Google开发,设计目标是解决传统构建工具(如 Make)在大型项目中存在的配置复杂、构建速度慢等问题。
它本身并不直接执行编译操作,而是通过简洁的脚本语法定义构建目标(如可执行文件、库)、依赖关系、编译选项(如宏定义、头文件路径)等,最终生成 Ninja 构建文件(.ninja
)
1.1 代码
下面,我们查看一下 GN 文件,在以后的开发中,我们会修改该文件,来编译不同的代码文件,以实现温湿度检测,LED 板显示等功能。
GN
# 定义一个动态库模块
shared_library("my_module") {
sources = [ # 源码文件
"src/main.cpp",
"src/utils.cpp"
]
include_dirs = [ # 头文件路径
"include"
]
deps = [ # 依赖的其他模块
":base_module", # 同一目录下的base_module
"//third_party:log" # 第三方log库
]
defines = [ "ENABLE_DEBUG" ] # 宏定义
}
除上述外,GN 还支持逻辑判断
GN
# 根据目标架构设置不同编译 flags
if (target_cpu == "arm64") {
cflags = [ "-march=armv8-a" ] # ARM64 架构的编译选项
} else if (target_cpu == "x86_64") {
cflags = [ "-march=x86-64" ] # X86_64 架构的编译选项
}
1.2 特点
- 简洁的脚本语法:更接近自然语言,减少冗余代码
- 快速的解析速度:GN 对脚本的解析和依赖分析效率高,在大型项目(如 OpenHarmony 包含数万模块)中,比 CMake 等工具更快生成构建文件。
- 强类型与严格检查:GN 脚本有明确的类型约束(如字符串、列表),解析时会报错语法错误,减少配置隐患。
- 深度集成 Ninja:GN 专为生成 Ninja 文件设计,能充分利用 Ninja 的并行构建能力(自动识别可并行的编译任务),提升构建效率。
ninja
Ninja 是一种轻量级的构建执行工具,负责按照 .ninja
文件中的指令高效执行编译、链接等具体操作。
Ninja的设计之初,目的并不是让人直接进行编写,所以不适合手写配置,一般与 GN 和 Cmake 搭配使用(cmake 使用时需要在命令行中特殊制定,不过一般用 GN)
优点
- 并行编译:
ninja
默认使用的并行数为CPU数量,一般不用手动设置并行数 - 增量编译:根据文件的时间戳进行分析,如果某个文件的时间戳发生了改变,则依赖于这个文件的命令以及其他依赖于这个命令的命令都会被重新执行,以此达到增量编译的效果
参考文章: