Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
b40cd561
D
Docs
项目概览
OpenHarmony
/
Docs
大约 2 年 前同步成功
通知
161
Star
293
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
b40cd561
编写于
12月 14, 2021
作者:
O
openharmony_ci
提交者:
Gitee
12月 14, 2021
浏览文件
操作
浏览文件
下载
差异文件
!983 add period to documents
Merge pull request !983 from yaoxiaoyu_903c/master
上级
d68a946f
dae138d3
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
27 addition
and
27 deletion
+27
-27
zh-cn/device-dev/subsystems/subsys-build-gn-coding-style-and-best-practice.md
...systems/subsys-build-gn-coding-style-and-best-practice.md
+27
-27
未找到文件。
zh-cn/device-dev/subsystems/subsys-build-gn-coding-style-and-best-practice.md
浏览文件 @
b40cd561
...
@@ -6,9 +6,9 @@ gn是generate ninja的缩写,它是一个元编译系统(meta-build system
...
@@ -6,9 +6,9 @@ gn是generate ninja的缩写,它是一个元编译系统(meta-build system
### gn简介
### gn简介
-
目前采用gn的大型软件系统有:Chromium,Fuchsia和OpenHarmony
-
目前采用gn的大型软件系统有:Chromium,Fuchsia和OpenHarmony
。
-
gn语法自设计之初就自带局限性,比如不能求list的长度,不支持通配符等。这些局限性源于其
**有所为有所不为**
的设计哲学,见https://gn.googlesource.com/gn/+/main/docs/language.md#Design-philosophy。所以在使用gn的过程中,如果发现某件事情用gn实现起来很复杂,请先停下来思考这件事情是否真的需要做。
-
gn语法自设计之初就自带局限性,比如不能求list的长度,不支持通配符等。这些局限性源于其
**有所为有所不为**
的设计哲学,见https://gn.googlesource.com/gn/+/main/docs/language.md#Design-philosophy。
所以在使用gn的过程中,如果发现某件事情用gn实现起来很复杂,请先停下来思考这件事情是否真的需要做。
-
关于gn的更多详情见gn官方文档,见https://gn.googlesource.com/gn/+/main/docs/
-
关于gn的更多详情见gn官方文档,见https://gn.googlesource.com/gn/+/main/docs/
。
### 本文的目标读者和覆盖范围
### 本文的目标读者和覆盖范围
...
@@ -28,7 +28,7 @@ gn是generate ninja的缩写,它是一个元编译系统(meta-build system
...
@@ -28,7 +28,7 @@ gn是generate ninja的缩写,它是一个元编译系统(meta-build system
我们这里对局部变量的定义为:在某作用域内,且不向下传递的变量。
我们这里对局部变量的定义为:在某作用域内,且不向下传递的变量。
为了更好的区别于全局变量,局部变量统一采用
**下划线开头**
为了更好的区别于全局变量,局部变量统一采用
**下划线开头**
。
```
```
# 例1
# 例1
...
@@ -51,7 +51,7 @@ action("some_action") {
...
@@ -51,7 +51,7 @@ action("some_action") {
全局变量使用
**小写字母**
开头。
全局变量使用
**小写字母**
开头。
如果变量值可以被gn args修改,则需要使用declare_args来声明,否则不要使用declare_args
如果变量值可以被gn args修改,则需要使用declare_args来声明,否则不要使用declare_args
。
```
```
# 例2
# 例2
...
@@ -63,13 +63,13 @@ declare_args() {
...
@@ -63,13 +63,13 @@ declare_args() {
#### 目标命名
#### 目标命名
目标命名采用
**小写字母+下划线**
的命名方式
目标命名采用
**小写字母+下划线**
的命名方式
。
模板中的
**子目标**
命名方式采用"${target_name}+双下划线+后缀"的命名方式。这样做有两点好处:
模板中的
**子目标**
命名方式采用"${target_name}+双下划线+后缀"的命名方式。这样做有两点好处:
-
加入"${target_name}"可以防止子目标重名
-
加入"${target_name}"可以防止子目标重名
。
-
加入双下划线可以很方便地区分出子目标属于哪一个模块,方便在出现问题时快速定位
-
加入双下划线可以很方便地区分出子目标属于哪一个模块,方便在出现问题时快速定位
。
```
```
# 例3
# 例3
...
@@ -87,7 +87,7 @@ declare_args() {
...
@@ -87,7 +87,7 @@ declare_args() {
#### 自定义模板的命名
#### 自定义模板的命名
推荐采用
**动宾短语**
的形式来命名
推荐采用
**动宾短语**
的形式来命名
。
```
```
# 例4
# 例4
...
@@ -122,7 +122,7 @@ import("//a.gni")
...
@@ -122,7 +122,7 @@ import("//a.gni")
import("//b.gni")
import("//b.gni")
```
```
如果想保证原有的import顺序,可以添加空注释行
如果想保证原有的import顺序,可以添加空注释行
。
```
```
import("//b.gni")
import("//b.gni")
...
@@ -173,7 +173,7 @@ import("//a.gni")
...
@@ -173,7 +173,7 @@ import("//a.gni")
还是上面的例子,如果我们指定ninja编译目标为images,由于images仅仅依赖b,所以a不会参与编译。由于b实质上依赖a, 这时b在链接时会出现必现错误。
还是上面的例子,如果我们指定ninja编译目标为images,由于images仅仅依赖b,所以a不会参与编译。由于b实质上依赖a, 这时b在链接时会出现必现错误。
有一种不太常见的问题是
**过多的依赖**
。
**过多的依赖会降低并发,导致编译变慢**
。见下面的例子
有一种不太常见的问题是
**过多的依赖**
。
**过多的依赖会降低并发,导致编译变慢**
。见下面的例子
:
_compile_
js_target不需要依赖 _compile_resource_target,增加这层依赖,会导致 _compile_js_target在 _compile_resource_target编译完成之后才能开始编译。
_compile_
js_target不需要依赖 _compile_resource_target,增加这层依赖,会导致 _compile_js_target在 _compile_resource_target编译完成之后才能开始编译。
...
@@ -258,13 +258,13 @@ write_file("a.out")
...
@@ -258,13 +258,13 @@ write_file("a.out")
不推荐使用原生模板的原因有二:
不推荐使用原生模板的原因有二:
-
**原生模板是最小功能模板**
,无法提供external_deps的解析,notice收集,安装信息生成等的额外功能,这些额外功能最好是随着模块编译时同时生成,所以必须对原生模板做额外的扩展才能满足实际的需求
-
**原生模板是最小功能模板**
,无法提供external_deps的解析,notice收集,安装信息生成等的额外功能,这些额外功能最好是随着模块编译时同时生成,所以必须对原生模板做额外的扩展才能满足实际的需求
。
-
当输入文件依赖的文件发生变化时,gn原生的action模板不能自动感知不到这种编译,无法重新编译。见例8
-
当输入文件依赖的文件发生变化时,gn原生的action模板不能自动感知不到这种编译,无法重新编译。见例8
原生模板和编译系统提供的模板之间的对应关系
原生模板和编译系统提供的模板之间的对应关系
:
| 编译系统提供的模板 | 原生模板 |
| 编译系统提供的模板 | 原生模板 |
| :------------------ | -------------- |
| :------------------ | -------------- |
...
@@ -280,10 +280,10 @@ write_file("a.out")
...
@@ -280,10 +280,10 @@ write_file("a.out")
action中的script推荐使用python脚本,不推荐使用shell脚本。相比于shell脚本,python脚本:
action中的script推荐使用python脚本,不推荐使用shell脚本。相比于shell脚本,python脚本:
-
python语法友好,不会因为少写一个空格就导致奇怪的错误
-
python语法友好,不会因为少写一个空格就导致奇怪的错误
。
-
python脚本有很强的可读性
-
python脚本有很强的可读性
。
-
可维护性强,可调试
-
可维护性强,可调试
。
-
OpenHarmony对python任务做了缓存,可以加快编译速度
-
OpenHarmony对python任务做了缓存,可以加快编译速度
。
### rebase_path
### rebase_path
...
@@ -309,7 +309,7 @@ action中的script推荐使用python脚本,不推荐使用shell脚本。相比
...
@@ -309,7 +309,7 @@ action中的script推荐使用python脚本,不推荐使用shell脚本。相比
}
}
```
```
-
同一变量做两次rebase_path会出现意想不到的结果
-
同一变量做两次rebase_path会出现意想不到的结果
。
```
```
# 例11
# 例11
...
@@ -361,7 +361,7 @@ action中的script推荐使用python脚本,不推荐使用shell脚本。相比
...
@@ -361,7 +361,7 @@ action中的script推荐使用python脚本,不推荐使用shell脚本。相比
### forward_variable_from
### forward_variable_from
-
自定义模板需要首先将testonly传递(forward)进来。因为该模板的target有可能被testonly的目标依赖
-
自定义模板需要首先将testonly传递(forward)进来。因为该模板的target有可能被testonly的目标依赖
。
```
```
# 例13
# 例13
...
@@ -396,7 +396,7 @@ action中的script推荐使用python脚本,不推荐使用shell脚本。相比
...
@@ -396,7 +396,7 @@ action中的script推荐使用python脚本,不推荐使用shell脚本。相比
### target_name
### target_name
target_name会随着作用域变化而变化,使用时需要注意
target_name会随着作用域变化而变化,使用时需要注意
。
```
```
# 例15
# 例15
...
@@ -422,7 +422,7 @@ template("foo") {
...
@@ -422,7 +422,7 @@ template("foo") {
### public_configs
### public_configs
如果模块需要向外export头文件,请使用public_configs
如果模块需要向外export头文件,请使用public_configs
。
```
```
# 例16
# 例16
...
@@ -443,7 +443,7 @@ executable("b") {
...
@@ -443,7 +443,7 @@ executable("b") {
### template
### template
自定义模板中必须有一个子目标的名字是target_name。该子目标会作为template的主目标。其他子目标都应该被主目标依赖,否则子目标不会被编译
自定义模板中必须有一个子目标的名字是target_name。该子目标会作为template的主目标。其他子目标都应该被主目标依赖,否则子目标不会被编译
。
```
```
# 例17
# 例17
...
@@ -471,7 +471,7 @@ template("foo") {
...
@@ -471,7 +471,7 @@ template("foo") {
### set_source_assignment_filter
### set_source_assignment_filter
set_source_assignment_filter除了可以过滤sources,还可以用来过滤其他变量。过滤完成后记得将过滤器和sources置空
set_source_assignment_filter除了可以过滤sources,还可以用来过滤其他变量。过滤完成后记得将过滤器和sources置空
。
```
```
# 例18
# 例18
...
@@ -490,19 +490,19 @@ sources = []
...
@@ -490,19 +490,19 @@ sources = []
set_source_assignment_filter([])
set_source_assignment_filter([])
```
```
最新版本上set_source_assignment_filter被filter_include和filter_exclude取代
最新版本上set_source_assignment_filter被filter_include和filter_exclude取代
。
### 部件内依赖采用deps,跨部件依赖采用external_deps
### 部件内依赖采用deps,跨部件依赖采用external_deps
-
部件在OpenHarmony上指能提供某个能力的一组模块。
-
部件在OpenHarmony上指能提供某个能力的一组模块。
-
在模块定义的时候可以声明part_name,用来表明当前模块属于哪个部件。
-
在模块定义的时候可以声明part_name,用来表明当前模块属于哪个部件。
-
每个部件会声明其inner-kit,供其他部件调用。部件innerkit的声明见源码中的ohos.build
.
-
每个部件会声明其inner-kit,供其他部件调用。部件innerkit的声明见源码中的ohos.build
。
-
部件间依赖只能依赖innerkit,不能依赖非innerkit的模块。
-
部件间依赖只能依赖innerkit,不能依赖非innerkit的模块。
-
如果a模块和b模块的part_name相同,那么a、b模块属于同一个部件,a,b模块之间的依赖关系可以用deps来声明
-
如果a模块和b模块的part_name相同,那么a、b模块属于同一个部件,a,b模块之间的依赖关系可以用deps来声明
。
-
如果a、b模块的part_name不同,那么a、b模块不属于同一个部件,a、b模块之间的依赖关系需要通过external_deps来声明,依赖方式为"部件名:模块名"的方式。见例19
-
如果a、b模块的part_name不同,那么a、b模块不属于同一个部件,a、b模块之间的依赖关系需要通过external_deps来声明,依赖方式为"部件名:模块名"的方式。见例19
。
```
```
# 例19
# 例19
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录