鸿蒙南向开发——GN快速入门指南

运行GN(Generate Ninja)

运行gn,你只需从命令行运行gn,对于大型项目,GN是与源码一起的。

  • 对于Chromium和基于Chromium的项目,有一个在depot_tools中的脚本,它需要加入到你的PATH环境变量中。该脚本将在包含当前目录的源码树中找到二进制文件并运行它。
  • 对于Fuchsia树内开发,运行fx gn ...,它将找到正确的GN二进制文件,并使用给定的参数运行它。

设置一个构建

与其他一些构建系统不同,在GN中你可以设置你自己的构建目录,和你想要的设置。这让你可以根据需要维护不同的构建,可以根据自己的需要并行维护不同的构建。

一旦你生成了一个构建目录,ninja文件将被自动生成,如果你在该目录下进行构建时,文件已经过期,ninja则会自动重新生成,所以你不必重新运行gn

建立一个构建目录:

gn gen out/my_build

配置构建参数

在你的构建目录上运行设置构建参数:

gn args out/my_build

这将弹出一个编辑器,在该文件中输入build args,像这样:

is_component_build = true
is_debug = false

可用的变量将取决于你的构建,你可以看到可用参数的列表和它们的默认值。

通过键入:

gn args --list out/my_build

可以看到可用的参数列表和默认值,这个命令必须指定编译目录,因为不同的目录有不同的参数值。

Chrome的开发者也可以阅读Chrome特有的构建配置说明以了解更多信息。

交叉编译至目标操作系统或架构

运行 gn args out/Default(根据需要替换成你的构建目录),然后为常见的交叉编译选项添加以下一行或多行:

target_os = "chromeos"
target_os = "android"target_cpu = "arm"
target_cpu = "x86"
target_cpu = "x64"

更多信息请参见 GN cross compiles 。

添加BUILD.gn的详细步骤

添加一个构建文件

转到examples/simple_build目录,这是一个最小的GN仓库的root目录。

在该目录中,有一个tutorial目录。这里已经有一个tutorial.cc文件,但没有与构建挂钩。在该目录中为我们的新目标创建一个新的BUILD.gn文件,用于我们的新目标:

executable("tutorial") {sources = ["tutorial.cc"]
}

现在我们只需要告诉编译器这个新的目标。

打开目录(simple_build)下的BUILD.gn文件,GN从加载这个根文件,然后从这里开始加载所有的依赖项,所以我们只需要在这里添加对这个文件中的新目标的引用。

你可以把我们的新目标作为一个依赖关系加入到现有的目标中去,但把一个可执行文件作为依赖关系并没有什么意义。通常情况下,将一个可执行文件作为另一个可执行文件的依赖项是没有意义的(它们不能被链接)。

所以让我们做一个 tools group组。在GN中,一个group只是一个依赖关系的集合,没有编译或链接:

group("tools") {deps = [# 这将扩展到"//tutorial:tutorial "这个名字,这是新目标的全名# 新目标,运行 "gn help labels "可以获得更多信息# ‘//’双斜杠代表的是从source-root目录开始的路径,也可以用绝对路径来写,比如'/usr/local/foo:bar'"//tutorial"]
}

执行gn help labels可以看到help的详细的解释,关于如何添加子目录的目标到BUILD.gn里面。

测试你的添加

simple_build目录下的命令行:

$ gn gen out$ ninja -C out tutorialninja: Entering directory `out'[2/2] LINK tutorial

执行./out/tutorial

你应该看到 Hello from the tutorial.输出到控制台。

题外话:GN鼓励静态库的目标名称不是全局唯一的。要建立一个这样的库,你可以把标签和它的路径(但没有前面的//)给ninja

ninja -C out some/path/to/target:my_target

所以前面的tutorial可以是:

$ ninja -C out tutorial:tutorialninja: Entering directory `out'ninja: no work to do.

声明依赖性

让我们看看在下列文件examples/simple_build/BUILD.gn中定义的目标。这里有一个静态库定义了一个函数,GetStaticText()

static_library("hello_static") {sources = [	"hello_static.cc",    "hello_static.h",    ] }

还有一个共享库,定义了一个函数GetSharedText()

shared_library("hello_shared") {	sources = [		"hello_shared.cc",		"hello_shared.h",    ]	defines = [ "HELLO_SHARED_IMPLEMENTATION" ]}

这也说明了如何为一个目标设置预处理程序的定义,要设置多个以上的定义或赋值,请使用这种形式:

defines = [    "HELLO_SHARED_IMPLEMENTATION",    "ENABLE_DOOM_MELON=0",]

现在我们来看看依赖这两个库的可执行文件:

executable("hello") {    sources = [    	"hello.cc",    ]         # 以冒号开头的标签指的是当前BUILD.gn文件中的标签    deps = [    	":hello_shared",    	":hello_static",    ]}

这个可执行文件包括一个源文件,并依赖于前面的两个库,以冒号开头的标签指的是当前BUILD.gn文件中具有该名称的目标。

测试二进制文件

simple_build目录下的命令行中:

ninja -C out helloout/hello

注意,你不需要重新运行GN。当任何构建文件发生变化时,GN会自动重新构建
ninja文件。因为ninja在开始执行时打印出[1/1] Regenerating ninja files时,你就知道这个发生了。

将设置放在config

一个库的用户经常需要用到compile flagsdefinesinclude directories,要做到这一点,把所有这些设置放到一个 "config "中就可以,这是一个命名的设置集合(但不包括源和依赖关系)。

config("my_lib_config") {  defines = [ "ENABLE_DOOM_MELON" ] 。  include_dirs = [ "//third_party/something" ] 。}

要将一个配置的设置应用于目标,请将其添加到configs列表中。

static_library("Hello_shared") {  ...  # 注意这里的 "+="通常是必须的,见下面的 "默认配置"。  configs += [    ":my_lib_config",  ]}

一个配置可以应用于所有依赖当前配置的目标,只要把它的标签放在public_configs 列表中。

static_library("Hello_shared") {  ...  public_configs = [    ":my_lib_config",  ]}

public_configs也适用于当前的目标,所以不需要在两个地方都列出一个配置。

默认配置

构建配置将设置一些默认适用于每个target的设置。

默认情况下,这些通常会被设置为默认的配置列表。你可以用print命令看到 你可以使用print命令看到这一点,这对调试很有用:

executable("hello") {  print(configs)}

运行GN将打印类似的东西:

$ gn gen out["//build:compiler_defaults", "//build:executable_ldconfig"]

目标可以修改这个列表以改变其默认值。

例如,构建设置可能会通过添加no_exceptions配置来默认关闭异常,但目标可以通过用不同的配置来重新启用它们:

executable("hello") {  ...  configs -= [ "//build:no_exceptions" ] # 删除全局默认。  configs += [ "//build:exceptions" ] # 用一个不同的来代替.}

我们上面的打印命令也可以用字符串插值来表达,这是一种将数值转换成字符串的方法。它使用符号"$"来指代一个变量。

print("The configs for the target $target_name are $configs")

执行ninja -C out hello

$ ninja -C out helloninja: Entering directory `out'[0/1] Regenerating ninja filesThe configs for the target hello are ["//build:compiler_defaults", "//build:executable_ldconfig"]ninja: no work to do.

添加一个新的构建参数

你可以通过declare_args声明你接受哪些参数并指定默认值。

declare_args() {  enable_teleporter = true  enable_doom_melon = false}

参见gn help buildargs以了解其工作原理。
参见gn help declare_args以了解声明参数的具体细节。

在一个给定的范围内多次声明一个参数是一个错误,所以在确定参数的范围和命名时应该谨慎。

不知道发生了什么?

你可以在verbose模式下运行GN,以看到很多详细过程,使用-v参数就可以:

$ gn gen out -vUsing source root /home/hui/disk4t/codes/gn/examples/simple_buildGot dotfile /home/hui/disk4t/codes/gn/examples/simple_build/.gnUsing build dir //out/Loading //build/BUILDCONFIG.gnLoading //BUILD.gnRunning //BUILD.gn with toolchain //build/toolchain:gccThe configs for the target hello are ["//build:compiler_defaults", "//build:executable_ldconfig"]Defining target //:hello(//build/toolchain:gcc)Defining target //:hello_shared(//build/toolchain:gcc)Defining target //:hello_static(//build/toolchain:gcc)Defining target //:tools(//build/toolchain:gcc)Loading //build/BUILD.gn (referenced from //build/BUILDCONFIG.gn:22)Loading //build/toolchain/BUILD.gn (referenced from //BUILD.gn:5)Loading //tutorial/BUILD.gn (referenced from //BUILD.gn:34)Running //build/BUILD.gn with toolchain //build/toolchain:gccRunning //tutorial/BUILD.gn with toolchain //build/toolchain:gccDefining config //build:compiler_defaults(//build/toolchain:gcc)Defining target //tutorial:tutorial(//build/toolchain:gcc)Defining config //build:executable_ldconfig(//build/toolchain:gcc)Running //build/toolchain/BUILD.gn with toolchain //build/toolchain:gccDefining toolchain //build/toolchain:gccComputing //:hello_shared(//build/toolchain:gcc)Computing //:hello_static(//build/toolchain:gcc)Computing //:hello(//build/toolchain:gcc)Computing //tutorial:tutorial(//build/toolchain:gcc)Computing //:tools(//build/toolchain:gcc)Done. Made 5 targets from 5 files in 5ms

"desc "命令

你可以运行gn desc <build_dir> <targetname>来获取有关
一个给定的目标。

gn desc out //tutorial:tutorialThe configs for the target hello are ["//build:compiler_defaults", "//build:executable_ldconfig"]Target //tutorial:tutorialtype: executabletoolchain: //build/toolchain:gcc...

获取ldflags信息

$ gn desc out //tutorial:tutorial ldflagsThe configs for the target hello are ["//build:compiler_defaults", "//build:executable_ldconfig"]-Wl,-rpath=$ORIGIN/-Wl,-rpath-link=

假设你想知道你的TWO_PEOPLE定义来自哪里:

gn desc out/Default //foo/bar:say_hello defines --blame...lots of other stuff omitted...  From //foo/bar:hello_config       (Added //foo/bar/BUILD.gn:12)    TWO_PEOPLE

另一个特别有趣的变体:

gn desc out/Default //base:base_i18n deps --tree

更多信息见gn help desc

附:gn labels

关于标签

所有可以参与依赖关系的图(目标、配置和工具链)都由标签来识别,一个常见的标签看起来像:

//base/test:test_support

这个例子包括一个source-root绝对路径、一个冒号和一个target,这意味着要在 "base/test/BUILD.gn "中寻找名为 "test_support "的目标。 如果有必要,你也可以指定系统的绝对路径。通常情况下,这样的路径会通过构建参数来指定,所以开发者可以指定组件在他们系统中的位置。

/usr/local/foo:bar (Posix)/C:/Program Files/MyLibs:bar (Windows)

工具链

一个规范的标签包括正在使用的工具链的标签。通常情况下,工具链标签隐含地继承自当前的执行环境,但你可以覆盖它以指定跨工具链的依赖关系。

//base/test:test_support(//build/toolchain/win:msvc)

这里 GN 将在文件"//build/toolchain/win "中寻找名为 "msvc "的工具链定义,以知道如何编译这个目标。

相对标签

如果你想引用同一构建文件中的东西,你可以省略路径名称,只用冒号开头。这种格式被推荐用于同文件中的标签引用。

:base

标签可以被指定为相对于当前目录的标签。从风格上看,我们更倾向于对所有非文件本地的引用使用绝对路径,除非一个构建文件需要在不同的环境下运行(比如一个项目既需要独立运行,又需要拉到目录层次中不同位置的其他项目中)。

source/plugin:myplugin.../net:url_request

隐式名称

如果一个名字没有被指定,它将继承目录名称。从风格上看,我们倾向于在可能的情况下省略冒号和名称。

//net -> //net:net//tools/gn -> //tools/gn:gn

为了能让大家更好的学习鸿蒙 (OpenHarmony) 开发技术,这边特意整理了《鸿蒙 (OpenHarmony)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (OpenHarmony)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. ……

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门?:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/359627.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统分析师-22年-下午题目

系统分析师-22年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选其中两题作答 试题一 (25分) 说明 某软件公司拟开发一套博客系统&#xff0c;要求能够向用户提供一个便捷发布自已心得&#xff0c;及时有效的…

什么是事务?

事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体&#xff0c;一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功&#xff0c;要么同时失败。 1. 事务管理 怎么样来控制这组操作&#xff0c;让这组操作同时成功或…

故障诊断 | 一文解决,CNN卷积神经网络故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,CNN卷积神经网络故障诊断(Matlab) 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

oracle错误:The Network Adapter could not establish the connection

执行请求的操作时遇到错误: IO 错误: The Network Adapter could not establish the connection (CONNECTION_IDU34sFBqOSayf4o4C6pwQ6A) 供应商代码 17002 原因&#xff1a; 错误代码 17002 表示 Oracle 数据库客户端遇到了网络适配器无法建立连接的问题 解决办法&#x…

ModelArts加速识别,助力新零售电商业务功能的实现

前言 如果说为客户提供最好的商品是产品眼中零售的本质&#xff0c;那么用户的思维是什么呢&#xff1f; 在用户眼中&#xff0c;极致的服务体验与优质的商品同等重要。 企业想要满足上面两项服务&#xff0c;关键在于提升效率&#xff0c;也就是需要有更高效率的零售&#…

Apache Flink文件上传漏洞(CVE-2020-17518)漏洞代码分析

漏洞复现参考如下文章 Apache Flink文件上传漏洞&#xff08;CVE-2020-17518&#xff09;漏洞复现分析_文件上传漏洞复现cve-CSDN博客 分析代码的话&#xff0c;首先找到漏洞修复的邮件 漏洞详情&#xff0c;可以看到漏洞概要&#xff0c;影响的版本&#xff0c;漏洞描述以及…

EasyExcel实现Excel文件导入导出

1 EasyExcel简介 EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址: https://github.com/alibaba/easyexcel 官方文档: https://www.yuque.com/easyexcel/doc/easyexcel Excel解析流程图: EasyExcel读取…

事务、MVCC、锁

目录 事务MVCC锁 事务 四大特性&#xff1a;ACID 脏读&#xff1a;事务A读取到未提交事务B修改的数据 不可重复读&#xff1a;事务A修改了未提交事务B读取的数据 幻读&#xff1a;事务A增删了未提交事务B读取的数据 不可重复读与幻读都是读取的结果不同&#xff0c;前者侧重于…

SQL注入:宽字节注入

SQL注入系列文章&#xff1a; 初识SQL注入-CSDN博客 SQL注入&#xff1a;联合查询的三个绕过技巧-CSDN博客 SQL注入&#xff1a;报错注入-CSDN博客 SQL注入&#xff1a;盲注-CSDN博客 SQL注入&#xff1a;二次注入-CSDN博客 ​SQL注入&#xff1a;order by注入-CSDN博客 …

读AI3.0笔记10_读后总结与感想兼导读

1. 基本信息 AI 3.0 (美)梅拉妮米歇尔 著 四川科学技术出版社,2021年2月出版 1.1. 读薄率 书籍总字数355千字&#xff0c;笔记总字数33830字。 读薄率33830355000≈9.53% 1.2. 读厚方向 千脑智能 脑机穿越 未来呼啸而来 虚拟人 新机器人 如何创造可信的AI 新机器智…

【计算机网络】【练习题及解答】【新加坡南洋理工大学】【Computer Control Network】

说明&#xff1a; 仅供学习使用。 一、题目描述 题目共4问&#xff0c;描述网络通信中的 帧传输时延&#xff08;Frame Delay&#xff09;、传播时延&#xff08;Propagation Delay&#xff09;&#xff0c;以及 链接利用率&#xff08;Link Utilization&#xff09; 的相关…

【Go】微服务架构下实现etcd服务注册与服务发现

中心网关&#xff1a;gateway 四个微服务&#xff1a;user、message、note、relationship 1 中心网关实现服务发现 1.1 设计EtcdDiscovery类 package entityimport ("context""fmt"clientv3 "go.etcd.io/etcd/client/v3""gonote/gatewa…

IP 层转发分组的过程

目录 IP 层转发分组的过程 1.1 基于终点的转发 1.2 最长前缀匹配 转发表中的 2 种特殊的路由 主机路由 (host route) 默认路由 (default route) 路由器分组转发算法 1.3 使用二叉线索查找转发表 IP 层转发分组的过程 1.1 基于终点的转发 分组在互联网中是逐跳转发的。…

网络异常案例一_RST

本文以及后面几篇会整理输出下以前处理过的一些网络相关的异常 4G定向卡上网问题 问题现象&#xff0c;自研路由器&#xff0c;使用运营商定向的4G卡上网&#xff0c;访问服务器异常&#xff0c;相应的开发同学反馈被服务器拒绝了&#xff1b; 复现问题&#xff0c;同步在cli…

CRF条件随机场学习记录

阅读建议 仔细阅读书[1]对应的序列标注章节&#xff0c;理解该方法面向的问题以及相关背景&#xff0c;然后理解基础的概念。 引言 威胁情报挖掘的相关论文中&#xff0c;均涉及到两部分任务&#xff1a;命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER&a…

某赛通电子文档安全管理系统 PolicyAjax SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

Apollo与微服务架构

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言引言&#xff1a;1. 什么是微服务架构&#xff1f;2. 微服务架构的组成要素…

python 标准库random生成随机数

当前版本&#xff1a; Python 3.8.4 文章目录如下 1. random的特点 2. random的用法 2.1. 随机整数 2.2. 随机小数 2.3. 随机元素 2.4. 随机字符串 1. random的特点 random 提供了生成伪随机数的功能&#xff0c;可以用于各种随机相关的操作&#xff0c;如生成随机数、…

《HTML 简易速速上手小册》第6章:HTML 语义与结构(2024 最新版)

文章目录 6.1 语义化标签的重要性6.1.1 基础知识6.1.2 案例 1&#xff1a;使用 <article>, <section>, <aside>, <header>, 和 <footer>6.1.3 案例 2&#xff1a;构建带有嵌套语义化标签的新闻网站6.1.4 案例 3&#xff1a;创建一个带有 <mai…

干货 | 大模型在图数据分析、推荐系统和生物科学中的综合应用

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 图机器学习、推荐系统与大语言模型的融合正成为新的前沿热点。图机器学习通过利用图结构数据&#xff0c;能够有效地捕捉和分析复杂关系和模式。同时&#xff0c;推荐系统正逐步成为我们日常生活的一部分&#…