OpenHarmonyOS-gn与Ninja

GN语法及在鸿蒙的使用
[gn+ninja学习 0x01]gn和ninja是什么
ohos_sdk/doc/subsys-build-gn-coding-style-and-best-practice.md
GN 语言与操作

一、gn简介

gn是generate ninja的缩写,它是一个元编译系统(meta-build system),是ninja的前端,gn和ninja结合起来,完成OpenHarmony操作系统的编译任务。
元构建系统是一个生成其他构建系统的构建系统,cmake就是一个非常典型的元构建系统。本系统文章要学习的gn也是个元构建系统。

类别gn+ninjacmake+make
元构建系统gncmake
构建系统ninjamake
元构建文件BUILD.gnCMake.txt
构建文件*.ninjaMakefile

二、代码风格

命名

总体上遵循Linux kernel的命名风格,即小写字母+下划线的命名风格。

局部变量

我们这里对局部变量的定义为:在某作用域内,且不向下传递的变量。

为了更好的区别于全局变量,局部变量统一采用下划线开头。

# 例1 action运行脚本生成文件.
action("some_action") {
  ...
  # _output是个局部变量,所以使用下划线开头
  _output = "${target_out_dir}/${target_name}.out"
  outputs = [ _output ]
  args = [
    ...
      "--output",
      # 使用rebase_path转换目录.将相对于当前目录的文件名转换为根目录
      rebase_path(_output, root_build_dir),
      ...
  ]
  ...
}

全局变量

全局变量使用小写字母开头。

如果变量值可以被gn args修改,则需要使用declare_args来声明,否则不要使用declare_args。

#例2
declare_args() {
  # 可以通过gn args来修改some_feature的值
  some_feature = false
}

目标命名

目标命名采用小写字母+下划线的命名方式。

模板中的子目标命名方式采用"${target_name}+双下划线+后缀"的命名方式。这样做有两点好处:

加入"${target_name}"可以防止子目标重名。

加入双下划线可以很方便地区分出子目标属于哪一个模块,方便在出现问题时快速定位。

# 例3
#template是 GN 复用代码的主要方式.通常,模板扩展为一个或多个其他目标类型.
template("ohos_shared_library") {
  # "{target_name}"(主目标名)+"__"(双下划线)+"notice"(后缀)
  _notice_target = "${target_name}__notice"
  collect_notice(_notice_target) {
    ...
  }
  shared_library(target_name) {
    ...
  }
}

自定义模板的命名

推荐采用动宾短语的形式来命名。

# 例4
# Good
template("compile_resources") {
  ...
}

格式化

gn脚本在提交之前需要执行格式化。格式化可以保证代码对齐,换行等风格的统一。使用gn自带的format工具即可。命令如下:

$ gn format path-to-BUILD.gn

gn format会按照字母序对import文件做排序,如果想保证import的顺序,可以添加空注释行。

假设原来的import顺序为:

# 例5
import("//b.gni")
import("//a.gni")

经过format之后变为:
import("//a.gni")
import("//b.gni")

如果想保证原有的import顺序,可以添加空注释行。
import("//b.gni")
# Comment to keep import order
import("//a.gni")

三、编码实践

gn文件中很多内置变量,列举常用变量如下:

import:将文件导入当前范围.
print:打印到控制台.
rebase_path:将文件或目录重新定位到另一个位置.
template:定义模板规则.
defined:返回是否定义了标识符.
asmflags:[string list]传递给汇编程序的标志.
cflags:[string list]传递给所有C编译器变量的标志.
ldflags:[string list]传递给链接器的标志.
libs:[string list]链接的附加库.
sources:[ file list ] 目标源文件 .

坚持就有收获!

在这里插入图片描述

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

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

相关文章

系统架构设计师教程(十三)层次式架构设计理论与实践

层次式架构设计理论与实践 13.1 层次式体系结构概述13.2 表现层框架设计13.2.1 表现层设计模式13.2.2 使用XML设计表现层,统一Web Form与Windows Form的外观13.2.3表现层中UIP设计思想13.2.4 表现层动态生成设计思想 13.3 中间层架构设计13.3.1 业务逻辑层组件设计1…

C++ | 五、哈希表 Hash Table(数组、集合、映射)、迭代器

哈希表基础 哈希表是一类数据结构(哈希表包含数组、集合和映射,和前两篇文章叙述的字符串、链表平级)哈希表概念:类似于Python里的字典类型,哈希表把关键码key值通过哈希函数来和哈希表上的索引对应起来,之…

对testfire.net进行信息收集,采用googlehacking语法,fofa等包括子端口号、子域名,备案信息,所属资产等等

采用被动的信息收集对testfire.net进行信息收集。 使用命令查询真实IP地址: nslookup testfire.net 使用googlehacking语法: 使用子域名查询网站查询一下子域名: 利用fofa查询一些信息: 利用whois 查找备案信息等: 尝试绕过千锋官网的cdn 利…

国考省考行测:选词填空,逻辑填空,语境分析,语意辨析,刷题,

国考省考行测:选词填空,逻辑填空,语境分析 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧&#xff0…

【博士每天一篇论文-技术综述】Machine Learning With Echo State Networks 一篇系统讲解ESN知识的五星文章

阅读时间:2023-11-21 1 介绍 年份:2020 作者:徐元超,曼尼托巴大学 期刊: 无 引用量:无 这篇文章是一篇技术报告,从递归神经网络(RNNs)引入到回声状态网络(…

基于DRIVE数据集的视网膜UNet分割

1 数据集介绍 这是一个非常小的数据集,非常适合用于视觉分割任务练手。数据集的文件夹如图所示: 图1-1文件夹结构 test中存放的是测试图片,training中存放的是20张用于训练的图片。imges文件夹中存放的是20张原始图片,mask中存放…

Leetcode的AC指南 —— 栈与队列:232.用栈实现队列

摘要: **Leetcode的AC指南 —— 栈与队列:232.用栈实现队列 **。题目介绍:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类:…

解决 pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。

执行下面命令进行安装pnpm安装后 npm install -g pnpm 然后执行pnpm 报错 解决办法: 以管理员身份运行 Windows PowerShell , 在命令行输入以下命令后按回车, set-ExecutionPolicy RemoteSigned 再输入Y 回车即可。 再回到控制台输入p…

工作小记 cv-cuda使用

最近要实现RGB相关cuda算子的功能,最终通过自己手写核函数实现。这里记录一下对cv-cuda的调研和使用,因为项目要求gcc-5,而cv-cuda要求gcc11而放弃使用,但是相关的记录,以及使用方法都要记录下来,以便下次项…

在MD编辑器里插入20次方问题

前言 看了很多文章里面没写怎么插入20次方,最后在官网的一篇文章上看到了很详细的数学公式的插入。 问题 大家肯定以为这样就可以了 效果 明显是不行的 解决 使用{}把数字括起来就可以了。 1 20 1^{20} 120 小知识 在行内显示(就是与文字在一起) $ $另起…

《A++ 敏捷开发》- 5 量化管理从个人开始

我:你们管理层和客户都比较关心项目的进度,项目是否能按时完成?请问你们过去的项目如何? 开发:我们现在就是走敏捷开发,两周一个迭代。每次迭代前,我们聚一起开会,把所有用户故事按优…

互联网加竞赛 基于机器视觉的手势检测和识别算法

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势检测与识别算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng…

(超详细)9-YOLOV5改进-添加EffectiveSEModule注意力机制

1、在yolov5/models下面新建一个EffectiveSEModule.py文件,在里面放入下面的代码 代码如下: import torch from torch import nn as nn from timm.models.layers.create_act import create_act_layerclass EffectiveSEModule(nn.Module):def __init__…

【Leetcode】277.搜寻名人

一、题目 1、题目描述 假设你是一个专业的狗仔,参加了一个 n 人派对,其中每个人被从 0 到 n - 1 标号。在这个派对人群当中可能存在一位 “名人”。所谓 “名人” 的定义是:其他所有 n - 1 个人都认识他/她,而他/她并不认识其他任何人。 现在你想要确认这个 “名人” 是…

【Linux】基本指令收尾

文章目录 日期查找打包压缩系统信息Linux和Windows互传文件 日期 这篇是基本指令的收尾了,还有几个基本指令我们需要说一下 首先是Date,它是用来显示时间和日期 直接输入date的话显示是有点不好看的,所以我们可以根据自己的喜欢加上分隔符&…

java垃圾回收GC过程

GC(Gabage Collection) 用于回收堆中的垃圾数据 清理方法 1.标记-清理 对数据标记,然后清理 缺点:容易产生内存碎片 2.标记-整理 对标记后的数据清理,剩下数据前移 缺点:每次清理后数据都要迁移&#xff0…

二叉树(一)

📑前言 本文主要是【数据结构】——二叉树使用的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句&am…

第13节-简历中的开放性问题

(点击即可收听) 不少公司的开放式题目每年不会有太大的变化,所以在答题前可先去相关求职论坛看看这些公司往年的问题,分析和思考自己应当怎么回答 开放式问题回答技巧 开放式问题主要考察的是求职者的求职动机、解决问题的能力、创造力等软实力&#xff…

已解决java.lang.ClassNotFoundException——java连接mysql8/mysql5

1.准备工作 1.mysql8下载安装 这里大家没必要去mysql官网安装,可以直接安装phpStudy_pro,毕竟小皮面板的宣言是让天下没有难配的服务器环境,如下是小皮面板的界面(同样的,此次用到的所有资料文末公众号可免费领取)&a…

MSPM0L1306例程学习-UART部分(3)

MSPM0L1306例程学习系列 1.背景介绍 写在前边的话: 这个系列比较简单,主要是围绕TI官网给出的SDK例程进行讲解和注释。并没有针对模块的具体使用方法进行描述。所有的例程均来自MSPM0 SDK的安装包,具体可到官网下载并安装: https://www.ti…