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

相关推荐
小蒜学长3 小时前
springboot基于BS的小区家政服务预约平台(代码+数据库+LW)
java·数据库·spring boot·后端
我命由我123453 小时前
Git 暂存文件警告信息:warning: LF will be replaced by CRLF in XXX.java.
java·linux·笔记·git·后端·学习·java-ee
简色3 小时前
预约优化方案全链路优化实践
java·spring boot·后端·mysql·spring·rabbitmq
nice_lcj5203 小时前
深入理解ArrayList与LinkedList:Java集合框架核心对比(含实战案例+面试考点)
java·面试
nju_spy3 小时前
大模型面经(一) Prompt + RAG + 微调
人工智能·面试·lora·大模型·rag·提示词工程·peft微调
聪明的笨猪猪4 小时前
Java 内存模型(JMM)面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
学编程的小鬼4 小时前
SpringBoot日志
java·后端·springboot
用户4099322502124 小时前
PostgreSQL备份不是复制文件?物理vs逻辑咋选?误删还能精准恢复到1分钟前?
后端·ai编程·trae
HWL56794 小时前
输入框内容粘贴时   字符净化问题
前端·vue.js·后端·node.js
IT_陈寒4 小时前
「JavaScript 性能优化:10个让V8引擎疯狂提速的编码技巧」
前端·人工智能·后端