02 基础篇-OpenHarmony 的编译工具

概述

相比起 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 特点

  1. 简洁的脚本语法:更接近自然语言,减少冗余代码
  2. 快速的解析速度:GN 对脚本的解析和依赖分析效率高,在大型项目(如 OpenHarmony 包含数万模块)中,比 CMake 等工具更快生成构建文件。
  3. 强类型与严格检查:GN 脚本有明确的类型约束(如字符串、列表),解析时会报错语法错误,减少配置隐患。
  4. 深度集成 Ninja:GN 专为生成 Ninja 文件设计,能充分利用 Ninja 的并行构建能力(自动识别可并行的编译任务),提升构建效率。

ninja

Ninja 是一种轻量级的构建执行工具,负责按照 .ninja 文件中的指令高效执行编译、链接等具体操作。

Ninja的设计之初,目的并不是让人直接进行编写,所以不适合手写配置,一般与 GN 和 Cmake 搭配使用(cmake 使用时需要在命令行中特殊制定,不过一般用 GN)

优点

  1. 并行编译:ninja默认使用的并行数为CPU数量,一般不用手动设置并行数
  2. 增量编译:根据文件的时间戳进行分析,如果某个文件的时间戳发生了改变,则依赖于这个文件的命令以及其他依赖于这个命令的命令都会被重新执行,以此达到增量编译的效果

参考文章:

【1】zhuanlan.zhihu.com/p/676733751

【2】blog.csdn.net/fangye945a/...

相关推荐
Coder_Boy_43 分钟前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
发现一只大呆瓜1 小时前
AI流式交互:SSE与WebSocket技术选型
前端·javascript·面试
园小异1 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
掘金者阿豪2 小时前
关系数据库迁移的“暗礁”:金仓数据库如何规避数据完整性与一致性风险
后端
ServBay2 小时前
一个下午,一台电脑,终结你 90% 的 Symfony 重复劳动
后端·php·symfony
sino爱学习2 小时前
高性能线程池实践:Dubbo EagerThreadPool 设计与应用
java·后端
颜酱2 小时前
从二叉树到衍生结构:5种高频树结构原理+解析
javascript·后端·算法
掘金者阿豪2 小时前
UUID的隐形成本:一个让数据库“慢下来”的陷阱
后端
用户084465256373 小时前
Docker 部署 MongoDB Atlas 到服务端
后端
Anita_Sun3 小时前
一看就懂的 Haskell 教程 - 类型推断机制
后端·haskell