OpenHarmonyOS-gn与Ninja

news2024/11/15 4:55:58

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 ] 目标源文件 .

坚持就有收获!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python入门到精通(三)——Python循环语句

Python循环语句 一、while 循环 1、基础语法 2、嵌套应用 二、for 循环 1、基础语法 2、嵌套应用 三、循环中断:break 和 continue 1、break 2、continue 四、综合案例 一、while 循环 1、基础语法 while的条件需得到布尔类型,True表示继续循环…

linux C语言socket函数send

在Linux中,使用C语言进行网络编程时,send函数是用于发送数据到已连接的套接字的重要函数之一。它通常用于TCP连接,但也可以用于UDP(尽管对于UDP,通常更推荐使用sendto,因为它允许你指定目标地址和端口&…

定时关机应用V2.1

# 在ShutDown_2.0的基础上,作了如下改进: # 1) 修正了默认模式无法选择其他时间的bug,还增加了2.5小时和3小时两个选项; # 2)自定义模式将计时单位从“秒”改为“分钟”,倒计时显示也优化为“小时:分钟:秒”…

小白水平理解面试经典题目LeetCode 125 Valid Palindrome(验证回文串)

125 验证回文串 说到公司面试,那就是得考出高度,考出水平,什么兼顾这两者呢,那就得看这道 原题描述: 给定一个字符串,判断它是否是回文串。回文串是指正读和反读都一样的字符串。 输入: “A man, a pla…

JS-WebAPIS(四)

日期对象(常用) • 实例化 在代码中发现了 new 关键字时,一般将这个操作称为实例化创建一个时间对象并获取时间 获得当前时间 获得指定时间 • 时间对象方法 使用场景:因为日期对象返回的数据我们不能直接使用,所以…

Android Studio安卓开发--ListView学习整理

ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。 1.ListView的简单用法 (1)activity_main.xml布局中加入ListView控件:(先占满整个布局的空间)…

网络安全与人工智能的交叉点

网络安全和人工智能 (AI) 的联系日益紧密,人工智能在增强网络安全措施方面发挥着重要作用。这种集成并不新鲜,但随着技术的进步和网络威胁变得更加复杂,它已经随着时间的推移而发展。 在网络安全的早期,防火墙和防病毒软件等传统…

用git bash调用md5sum进行批量MD5计算

对于非常大的文件或者很重要的文件,在不稳定的网络环境下,可能文件的某些字节会损坏。此时,对文件计算MD5即可以校验其完整性。比如本次的 OpenStreetMap 导出包,我的学弟反馈通过网盘下载无法解压,并建议我增加每个文…

uni-app使用HBuilderX打包Web项目

非常简单,就是容易忘记 一、找到manifest.json配置Web配置 二、源码视图配置 "h5" : {"template" : "","domain" : "xxx.xx.xx.xxx","publicPath" : "./","devServer" : {&quo…

如何启动Windows平台轻量级RTSP服务生成RTSP拉流URL

为满足内网无纸化/电子教室等内网超低延迟需求,避免让用户配置单独的服务器,我们在推送端发布了轻量级RTSP服务模块: 简单来说,之前推送端SDK支持的功能,内置轻量级RTSP服务模块后,功能继续支持。 轻量级…

00-Rust前言

问:为什么要近期想学习Rust? 答: Rust出来也是有一段时间了,从Microsoft吵着要重构他们的C"祖传代码"开始,Rust就披着“高效,安全”的头衔。而自己决定要学习Rust,是因为近期发现:与…

git本地分支的合并

目录 第一章、本地分支的切换测试1.1)切换之前的master分支下文件内容1.2)切换到develop分支后修改文件1.3)切回master分支出现报错:1.4)报错分析 第二章、解决方式2.1)方式1:commit2.2&#xf…

线程同步--生产者消费者模型--单例模式线程池

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器基于生产者消费者模型实现单例线程池 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件…

[已解决]前端使用el-upload,后端使用文件上传阿里云报错:异常信息:java.lang.NullPointerException: null

前端使用el-upload,后端使用文件上传阿里云报错: 报错原因:前端image参数未传进去 解决方法:在el-upload添加属性 name"image" 文件传进去了!

Redis实战之-分布式锁-redission

一、分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题: 重入问题:重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中,可重入锁的意义在于防止死锁,比如HashTable这样的代码中,他的方法都…

2.4 网络层03

2.4 网络层03 2.4.7 路由表 1、什么是路由? 路由就是报文从源端到目的端的路径。当报文从路由器到目的网段有多条路由可达时,路由器可以根据路由表中最佳路由进行转发。 2、什么是路由表? 在计算机网络中,路由表&#xff08…

关于java中的Super详解

关于java中的Super详解 我们在上一篇文章中了解到了面向对象三大基本特征,继承,我们本篇文章中来了解一下Super😀。 一、Super和this调用属性 this:当前类中使用。super:父类使用。 我们直接用代码来说明一下。 1…

C#调用C++ dll异常排查

基本情况 最近在做的一款程序,长时间运行总会出现莫名的问题。有时是自动关闭,有时程序报错,有时调用的dll异常…… 提出假设——dll内存泄漏 由于开始与C组合作时,使用其提供的dll出现过数据读写时异常(内存操作异常…

Python 面向对象绘图(Matplotlib篇-16)

Python 面向对象绘图(Matplotlib篇-16)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…