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

相关推荐
hui函数12 分钟前
Flask电影投票系统全解析
后端·python·flask
胡gh1 小时前
依旧性能优化,如何在浅比较上做文章,memo 满天飞,谁在裸奔?
前端·react.js·面试
在未来等你1 小时前
Redis面试精讲 Day 27:Redis 7.0/8.0新特性深度解析
数据库·redis·缓存·面试
胡gh2 小时前
你一般用哪些状态管理库?别担心,Zustand和Redux就能说个10分钟
前端·面试·node.js
小厂永远得不到的男人2 小时前
基于 Spring Validation 实现全局参数校验异常处理
java·后端·架构
bobz9655 小时前
复姓人口比例不到 0.11%
面试
uhakadotcom6 小时前
什么是esp32?
面试·架构·github
毅航6 小时前
从原理到实践,讲透 MyBatis 内部池化思想的核心逻辑
后端·面试·mybatis
Always_Passion6 小时前
二、开发一个简单的MCP Server
后端