OpenHarmony下gn相关使用

OpenHarmony下gn相关使用

引言

为了提高OpenHarmony下移植vivante gpu的成功率,先得把准备工作做足了,这样后续就好搞了。所以本文档的核心工作介绍GN构建工具在OpenHarmony中的常见使用方法,指导三方库由cmake或者其它的脚本构建到GN构建的转换!


一.GN常用的内置变量

名称 描述
current_cpu 当前工具链的处理器架构
current_os 当前工具链的操作系统类型
current_toolchain 表示当前使用的工具链
default_toolchain 表示默认使用的工具链
target_cpu 表示目标平台的CPU类型
target_os 表示目标平台的操作系统类型
root_build_dir 表示根目录的构建目录
root_gen_dir 表示根目录的生成目录
root_out_dir 表示根目录的输出目录
target_out_dir 表示目标文件的输出目录
target_gen_dir 表示中间文件的生成目录
defines 表示当前目标的预定义宏列表
include_dirs 表示当前目标的头文件搜索路径列表
cflags 表示当前目标的C语言编译选项列表
cxxflags 表示当前目标的C++语言编译选项列表
ldflags 表示当前目标的连接选项列表
asmflags 表示当前目标的汇编语言编译选项列表
libs 表示当前目标依赖的库文件列表

二.GN常用的内置函数

名称 描述
assert() 断言函数,如果条件不成立,则会抛出一个异常
defined() 判断变量是否已经定义
exec_script() 执行一个Python脚本
get_label_info() 获取标签信息,例如标签的名称、路径、类型等等
get_path_info() 获取路径信息,例如路径是否存在、是否是目录、是否是文件等等
group() 将一组目标文件组合成一个库文件
import() 导入其它GN构建文件
read_file() 读取文件内容
read_json() 读取JSON格式的文件
read_path() 读取路径中的内容,返回一个字符串列表
rebase_path() 重新定位路径,将路径中的某个部分替换为新的值
write_file() 写入文件内容
template() 处理字符串模板,将模板中的变量替换为实际的值,其功能类似与函数
action() 定义一个自定义的构建动作,通过action调用python脚本完成期望动作
action_foreach() 针对每个元素执行一个自定义的构建动作
executable() 定义一个可执行文件
shared_library() 定义一个动态库
static_library() 定义一个静态库

三.如何使用

当使用GN进行相关的构建时,需要了解如何指定动态库、静态库和可执行文件的构建规则。以下是一个简单的指南,介绍如何在GN中指定这些构建规则:

3.1 动态库

在GN中,可以使用shared_library模板来指定动态库的构建规则,创建BUILD.gn文件,内容如下:

cpp 复制代码
# 指定动态库名称
mylib_name = "mylib"

# 指定动态库源文件
mylib_sources = [
  "src/foo.cpp",
  "src/bar.cpp",
]

# 指定动态库编译选项和链接选项
mylib_cflags = [
  "-Wall",
]
mylib_ldflags = [
  "-L/usr/local/lib",
]

# 指定动态库构建规则
shared_library(mylib_name) {
  sources = mylib_sources
  cflags = mylib_cflags
  ldflags = mylib_ldflags
}

3.2 静态库

在GN中,可以使用static_library模板来指定静态库的构建规则,创建BUILD.gn文件,内容如下:

cpp 复制代码
# 指定静态库名称

# 指定静态库源文件
mylib_sources = [
    "src/foo.cpp",
    "src/bar.cpp"
]

# 指定静态库编译选项
mylib_cflags = [
    "-Wall",
]

# 指定静态库的构建规则
static_library(mylib_name){
    sources = mylib_sources
    cflags = mylib_cflags
}

3.3 可执行文件

在GN中,可以使用executable模板来指定可执行文件的构建规则。例如:

cpp 复制代码
# 指定可执行文件名称
myapp_name = "myapp"

# 指定可执行文件源文件
myapp_sources = [
    "src/main.cpp",
]

# 指定可执行文件编译选项和链接选项
myapp_cflags = [
    "-Wall",
]
myapp_ldflags = [
    "-L/usr/local/lib",
]

# 指定可执行文件构建规则
executable(myapp_name){
    sources = myapp_sources
    cflags = myapp_cflags
    ldflags = myapp_ldflags
}

3.4 GN在OpenHarmony上的扩展

OpenHarmony在GN原生模板的基础上进行了功能扩展,提供了ohos_shared_library、ohos_static_library、ohos_executable模板,在BUILD.gn中import("//build/ohos.gni")即可使用,ohos_shared_library示例如下:

cpp 复制代码
import("//build/ohos.gni")
ohos_shared_library("helloworld") {
  sources = []
  include_dirs = []
  cflags = []
  cflags_c = []
  cflags_cc = []
  ldflags = []
  configs = []
  deps = []  # 部件内模块依赖

  # 跨部件模块依赖定义,
  # 定义格式为 "部件名:模块名称"
  # 这里依赖的模块必须是依赖的部件声明在inner_kits中的模块
  external_deps = [
    "part_name:module_name",
  ]

  output_name = ""           # 可选,模块输出名
  output_extension = ""      # 可选,模块名后缀
  module_install_dir = ""    # 可选,缺省在/system/lib64或/system/lib下, 模块安装路径,模块安装路径,从system/,vendor/后开始指定
  relative_install_dir = ""  # 可选,模块安装相对路径,相对于/system/lib64或/system/lib;如果有module_install_dir配置时,该配置不生效
  install_images = []        # 可选,缺省值system,指定模块安装到那个分区镜像中,可以指定多个

  part_name = "" # 必选,所属部件名称
}

写在最后

好了今天的博客OpenHarmony下gn相关使用就到这里了。总之,青山不改绿水长流先到这里了。如果本博客对你有所帮助,麻烦关注或者点个赞,如果觉得很烂也可以踩一脚!谢谢各位了!!

友情参考:

1.OpenHarmony下cmake转gn指导
2.OpenHarmony标准系统如何添加一个模块

前面两个文档是官方aosp下Build/doc下面的文档

3.gn语法及在鸿蒙的使用

相关推荐
特立独行的猫a4 小时前
CMake与GN构建系统对比及GN使用指南
harmonyos·cmake·openharmony·构建·gn
左手厨刀右手茼蒿3 天前
Flutter 三方库 all_lint_rules_community 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、基于全量社区 Lint 规则的工业级静态代码质量与安全审计引擎
flutter·harmonyos·鸿蒙·openharmony·all_lint_rules_community
王码码20353 天前
Flutter 三方库 servicestack 的鸿蒙化适配指南 - 实现企业级 Message-based 架构集成、支持强类型 JSON 序列化与跨端服务调用同步
flutter·harmonyos·鸿蒙·openharmony·message-based
里欧跑得慢3 天前
Flutter 三方库 jsonata_dart 的鸿蒙化适配指南 - 实现高性能的 JSON 数据查询与转换、支持 JSONata 表达式引擎与端侧复杂数据清洗
flutter·harmonyos·鸿蒙·openharmony·jsonata_dart
国医中兴3 天前
Flutter 三方库 superclass 的鸿蒙化适配指南 - 支持原生高性能类构造、属性代理与深层元数据解析实战
flutter·harmonyos·鸿蒙·openharmony
加农炮手Jinx3 天前
Flutter 组件 ubuntu_service 适配鸿蒙 HarmonyOS 实战:底层系统服务治理,构建鸿蒙 Linux 子系统与守护进程交互架构
flutter·harmonyos·鸿蒙·openharmony·ubuntu_service
王码码20353 天前
Flutter 三方库 login_client 的鸿蒙化适配指南 - 打造工业级安全登录、OAuth2 自动化鉴权、鸿蒙级身份守门员
flutter·harmonyos·鸿蒙·openharmony·login_client
国医中兴4 天前
Flutter 三方库 dson 的鸿蒙化适配指南 - 极简的序列化魔法、在鸿蒙端实现反射式 JSON 映射实战
flutter·harmonyos·鸿蒙·openharmony
国医中兴4 天前
Flutter 三方库 cloudflare_r2_uploader 的鸿蒙化适配指南 - 云端存储的疾速通道、在鸿蒙端实现 R2 分段上传实战
flutter·harmonyos·鸿蒙·openharmony·cloudflare_r2_uploader
国医中兴4 天前
Flutter 三方库 weaver 的鸿蒙化适配指南 - 玩转轻量级服务发现、在鸿蒙端实现模块化治理与解构实战
flutter·harmonyos·鸿蒙·openharmony