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/...

相关推荐
拖拉斯旋风5 分钟前
深入理解 JavaScript 执行机制之V8引擎:从编译到执行的完整生命周期
javascript·面试
虎子_layor10 分钟前
PostgreSQL这么多优势,为什么还要使用MySQL
后端·sql
Bunny021215 分钟前
1-Freemarker入门
后端
回家路上绕了弯18 分钟前
QPS 百万级分布式数据库:高并发订单号生成方案设计与落地
分布式·后端
R.lin21 分钟前
mmap内存映射文件
java·后端
技术小丁32 分钟前
使用 PHP 和 PhpSpreadsheet 在 Excel 中插入图片(附完整代码)
后端·php
SimonKing33 分钟前
消息积压、排查困难?Provectus Kafka UI 让你的数据流一目了然
java·后端·程序员
考虑考虑38 分钟前
点阵图更改背景文字
java·后端·java ee
晴殇i38 分钟前
千万级点赞系统架构演进:从单机数据库到分布式集群的完整解决方案
前端·后端·面试
ldmd28439 分钟前
Go语言实战:入门篇-5:函数、服务接口和Swagger UI
开发语言·后端·golang