xref: /build/
Name Date Size #Lines LOC

..--

.gitee/24-Mar-2024-5525

build_scripts/24-Mar-2024-391292

common/24-Mar-2024-693568

config/24-Mar-2024-7,6026,618

core/24-Mar-2024-375327

docs/24-Mar-2024-3,3042,591

hb/24-Mar-2024-11,9389,423

lite/24-Mar-2024-9,9127,985

misc/24-Mar-2024-844443

ohos/24-Mar-2024-17,06613,831

rust/24-Mar-2024-2,5201,496

scripts/24-Mar-2024-6,8485,158

templates/24-Mar-2024-7,4356,432

test/24-Mar-2024-2,5182,044

toolchain/24-Mar-2024-3,0312,255

tools/24-Mar-2024-5,5454,462

.gitattributesD31-Dec-2023631 1615

.gitignoreD31-Dec-202369 76

LICENSED31-Dec-20232.2 KiB4739

OAT.xmlD31-Dec-202312.5 KiB15194

README_zh.mdD31-Dec-202315.4 KiB346271

bundle.jsonD31-Dec-20231.6 KiB7069

compile_env_allowlist.jsonD31-Dec-202325 54

compile_standard_whitelist.jsonD31-Dec-202355.9 KiB699698

gn_helpers.pyD31-Dec-202312.1 KiB360266

ohos.gniD31-Dec-20231.5 KiB4337

ohos_system.propD31-Dec-2023867 2821

ohos_var.gniD31-Dec-20236.5 KiB302229

prebuilts_download.pyD31-Dec-202317.7 KiB379329

prebuilts_download.shD31-Dec-20238.4 KiB306260

prebuilts_download_config.jsonD31-Dec-202319.8 KiB515513

print_python_deps.pyD31-Dec-20235 KiB139108

subsystem_compoents_whitelist.jsonD31-Dec-20231.3 KiB3938

subsystem_config.jsonD31-Dec-20234.2 KiB223222

subsystem_config_example.jsonD31-Dec-2023172 98

test.gniD31-Dec-202322.9 KiB823749

version.gniD31-Dec-2023957 3429

zip.pyD31-Dec-20231.1 KiB4226

README_zh.md

1# 编译构建<a name="ZH-CN_TOPIC_0000001124588563"></a>
2
3-   [简介](#section11660541593)
4-   [目录](#section161941989596)
5-   [约束与限制](#section2029921310472)
6-   [说明](#section1312121216216)
7-   [常见问题说明](#section131336181)
8-   [相关仓](#section1371113476307)
9
10## 简介<a name="section11660541593"></a>
11
12编译构建子系统提供了一个基于Gn和ninja的编译构建框架。
13
14根据产品配置,编译生成对应的镜像包。其中编译构建流程为:
15
161.  使用Gn配置构建目标。
172.  Gn运行后会生成ninja文件。
183.  通过运行ninja来执行编译任务。
19
20**图 1**  编译构建子系统架构图<a name="fig16488143010409"></a>
21![](docs/figures/build_framework_ZN.png "编译构建子系统架构图")
22
23## 目录<a name="section161941989596"></a>
24
25```
26/build                           # 编译构建主目录
27
28├── __pycache__
29├── build_scripts/                # 编译相关的python脚本
30├── common/
31├── config/                       # 编译相关的配置项
32├── core
33│   ├── gn/                       # 编译入口BUILD.gn配置
34│   └── build_scripts/
35├── docs
36├── gn_helpers.py*
37├── lite/                         # hb和preloader入口
38├── misc/
39├── ohos                          # OpenHarmony编译打包流程配置
40│   ├── kits                      # kits编译打包模板和处理流程
41│   ├── ndk                       # ndk模板和处理流程
42│   ├── notice                    # notice模板和处理流程
43│   ├── packages                  # 版本打包模板和处理流程
44│   ├── sa_profile                # sa模板和处理流程
45│   ├── sdk                       # sdk模板和处理流程,包括sdk中包含的模块配置
46│   └── testfwk                   # 测试相关的处理
47├── ohos.gni*                     # 汇总了常用的gni文件,方便各个模块一次性import
48├── ohos_system.prop
49├── ohos_var.gni*
50├── prebuilts_download.sh*        # 预编译脚本
51├── print_python_deps.py*
52├── scripts/
53├── subsystem_config.json
54├── subsystem_config_example.json
55├── templates/                    # c/c++编译模板定义
56├── test.gni*
57├── toolchain                     # 编译工具链配置
58├── tools                         # 常用工具
59├── version.gni
60├── zip.py*
61```
62
63## 约束与限制<a name="section2029921310472"></a>
64
65-   编译环境需要Ubuntu18.04及以上版本。
66
67-   安装编译所需的程序包。
68
69    安装命令:
70
71    ```
72    sudo apt-get install bison ccache default-jdk flex gcc-arm-linux-gnueabi gcc-arm-none-eabi  genext2fs liblz4-tool libssl-dev libtinfo5 mtd-utils mtools openssl ruby scons unzip u-boot-tools  zip
73    ```
74
75
76
77## 说明<a name="section1312121216216"></a>
78
79**代码根目录下执行全量版本的编译命令**
80
81    ```
82    ./build.sh --product-name {product_name}
83    ```
84
85    编译结果镜像输出在 out/${device_name}/packages/phone/images/目录下。
86
87**编译命令支持选项**
88
89    ```
90    -h, --help                                        # 显示帮助信息并退出
91    --source-root-dir=SOURCE_ROOT_DIR                 # 指定路径
92    --product-name=PRODUCT_NAME                       # 指定产品名
93    --device-name=DEVICE_NAME                         # 指定装置名称
94    --target-cpu=TARGET_CPU                           # 指定cpu
95    --target-os=TARGET_OS                             # 指定操作系统
96    -T BUILD_TARGET, --build-target=BUILD_TARGET      # 指定编译目标,可以指定多个
97    --gn-args=GN_ARGS                                 # gn参数,支持指定多个
98    --ninja-args=NINJA_ARGS                           # ninja参数,支持指定多个
99    -v, --verbose                                     # 生成时显示所有命令行
100    --keep-ninja-going                                # 让ninja持续到1000000个工作失败
101    --jobs=JOBS                                       # 指定编译线程数
102    --export-para=EXPORT_PARA
103    --build-only-gn                                   # 只做gn解析,不运行ninja
104    --ccache                                          # 可选  编译使用ccache,需要本地安装ccache
105    --fast-rebuild                                    # 快速重建,default=False
106    --log-level=LOG_LEVEL                             # 指定编译期间的日志级别','三个级别可选:debug, info and error,default='info'
107    --device-type=DEVICE_TYPE                         # 指定设备类型,default='default'
108    --build-variant=BUILD_VARIANT                     # 指定设备操作模式,default='user'
109    ```
110
111**配置文件说明**
112
113OpenHarmony的配置文件主要有四个。
114
1151.  每个模块对应的BUILD.gn文件。
116    可以使用提供的模板,也可以使用gn语法规则自定义编写。
117
118    **例子:**
119
120    _ohos\_shared\_library示例:_
121
122    ```
123    import("//build/ohos.gni")
124    ohos_shared_library("helloworld") {
125      sources = []
126      include_dirs = []
127      cflags = []
128      cflags_c = []
129      cflags_cc = []
130      ldflags = []
131      configs = []
132      deps =[]  # 部件内模块依赖
133
134      # 跨部件模块依赖定义,
135      # 定义格式为 "部件名:模块名称"
136      # 这里依赖的模块必须是依赖的部件声明在inner_kits中的模块
137      external_deps = [
138        "part_name:module_name",
139      ]
140
141      output_name = ""           # 可选,模块输出名
142      output_extension = ""      # 可选,模块名后缀
143      module_install_dir = ""    # 可选,缺省在/system/lib64/system/lib下, 模块安装路径,模块安装路径,从system/,vendor/后开始指定
144      relative_install_dir = ""  # 可选,模块安装相对路径,相对于/system/lib64/system/lib;如果有module_install_dir配置时,该配置不生效
145      install_images = []        # 可选,缺省值system,指定模块安装到那个分区镜像中,可以指定多个
146
147      part_name = "" # 必选,所属部件名称
148    }
149    ```
150
151    _ohos\_executable示例:_
152
153    ohos\_executable模板属性和ohos\_shared\_library基本一致
154
155    _注意:可执行模块(即ohos\_executable模板定义的)默认是不安装的,如果要安装,需要指定install\_enable = true_
156
157    _ohos\_prebuilt\_etc示例:_
158
159    ```
160    import("//build/ohos.gni")
161    ohos_prebuilt_etc("etc_file") {
162      source = "file"
163      deps = []                 # 部件内模块依赖
164      module_install_dir = ""   #可选,模块安装路径,从system/,vendor/后开始指定
165      relative_install_dir = "" #可选,模块安装相对路径,相对于system/etc;如果有module_install_dir配置时,该配置不生效
166      install_images = []       # 可选,缺省值system,指定模块安装到那个分区镜像中,可以指定多个
167      part_name = ""            # 必选,所属部件名称
168    }
169    ```
170    更多详细的模板信息请参照[模块配置规则](https://gitee.com/openharmony/docs/tree/master/zh-cn/device-dev/subsystems/subsys-build-module.md#模块配置规则)。
171
1722. 子系统中bundle.json文件或者ohos.build(看子系统具体支持哪一个,后续将全部用bundle.json)
173
174    **bundle.json**
175
176    ```
177    {
178       "name": "@ohos/<component_name>",                 # HPM部件英文名称,格式"@组织/部件名称"
179       "description": "xxxxxxxxxxxxxxxxxxx",             # 部件功能一句话描述
180       "version": "3.1",                                 # 版本号,版本号与OpenHarmony版本号一致
181       "license": "MIT",                                 # 部件License
182       "publishAs": "code-segment",                      # HPM包的发布方式,当前默认都为code_segment
183       "segment": {
184           "destPath": ""
185       },                                                # 发布类型为code_segment时为必填项,定义发布类型code_segment的代码还原路径(源码路径)
186       "dirs": {},                                       # HPM包的目录结构,字段必填内容可以留空
187       "scripts": {},                                    # HPM包定义需要执行的脚本,字段必填,值非必填
188       "licensePath": "COPYING",
189       "readmePath": {
190           "en": "README.rst"
191       },
192       "component": {                                    # 部件属性
193           "name": "<component_name>",                   # 部件名称
194           "subsystem": "",                              # 部件所属子系统
195           "syscap": [],                                 # 部件为应用提供的系统能力
196           "features": [],                               # 部件对外的可配置特性列表,一般与build中的sub_component对应,可供产品配置
197           "adapted_system_type": [],                    # 轻量(mini)小型(small)和标准(standard),可以是多个
198           "rom": "xxxKB"                                # ROM基线,没有基线写当前值
199           "ram": "xxxKB",                               # RAM基线,没有基线写当前值
200           "deps": {
201               "components": [],                         # 部件依赖的其他部件
202               "third_party": []                         # 部件依赖的三方开源软件
203           },
204           "build": {                                    # 编译相关配置
205               "sub_component": ["部件包含模块的gn目标"],  # 部件编译入口,新增模块在此处配置
206               "inner_kits": [],                         # 部件间接口
207               "test": []                                # 部件测试用例编译入口
208           }
209       }
210    }
211    ```
212    bundle.json文件定义了子系统包含的部件。每个部件定义它所包含的模块目标component.build.sub_component,以及部件间交互的接口component.build.inner_kits213    测试用例component.build.test_list。部件包含的 模块目标component.build.sub_component是必须要说明的。
214
215    **ohos.build**
216    ```
217    {
218    "parts": {
219      "napi": {
220        "module_list": [
221          "//foundation/arkui/napi:napi_packages"              # 部件包含模块的gn目标
222        ],
223        "inner_kits": [                                        # 部件间接口
224        ],
225        "test_list": [                                         # 测试用例
226          "//foundation/arkui/napi:napi_packages_test",
227          "//foundation/arkui/napi/test/unittest:unittest"
228        ]
229      }
230
231      "新增部件名": {
232        "module_list": [
233          "部件包含的gn目标"                                    # 部件包含模块的gn目标
234        ],
235        "inner_kits": [                                        # 部件间接口
236        ],
237        "test_list": [                                         # 测试用例
238          "包含的测试用例",
239        ]
240      }
241    }
242    ......
243    "subsystem": "ace",                                        # 所属子系统
244    }
245    ```
246    ohos.build文件包含两个部分,subsystem部分说明了子系统的名称,parts部分定义了该子系统包含的部件,要添加一个部件,需要把该部件对应的内容添加进parts中去。添加的时候需要指明该部件包含的模块module_list,假如有提供给其它部件的接口,需要在inner_kits中说明,假如有测试用例,需要在test_list中说明,inner_kits与test_list没有也可以不添加。
247
248    这两个文件均在对应的子系统根目录下,新增模块均在指定的目录下新增模块的gn目标即可,如果要新增一个部件,则需要在部件目录中新建一个bundle.json或者ohos.build,然后再在//vendor/{product_company}/{product-name}/config.json中添加对应的部件,直接添加到原有部件后即可。具体流程请参照编译构建指导的[配置规则](https://gitee.com/openharmony/docs/tree/master/zh-cn/device-dev/subsystems/subsys-build-all.md#配置规则)与[新增并编译不同配置](https://gitee.com/openharmony/docs/tree/master/zh-cn/device-dev/subsystems/subsys-build-all.md#新增并编译不同配置),其中详细的介绍了如何添加一个模块、部件或者子系统。
249
250    成功添加验证:
251    - 在输出文件夹的对应子系统文件夹下的部件文件夹下的BUILD.gn文件中module_list包含了新建模块的BUILD.gn中定义的目标。
252    - 编译完成后打包到image中去,生成对应的so文件或者二进制文件。
253
254
2553. vendor\产品厂商\产品名\config.json
256
257    ```
258    {
259      "product_name": "MyProduct",
260      "version": "3.0",
261      "type": "standard",
262      "target_cpu": "arm",
263      "ohos_version": "OpenHarmony 1.0",
264      "device_company": "MyProductVendor",
265      "board": "MySOC",
266      "enable_ramdisk": true,
267      "subsystems": [
268        {
269          "subsystem": "ace",
270          "components": [
271            { "component": "ace_engine_lite", "features":[""] }
272          ]
273        },
274        ...
275      ]
276    }
277    ```
278    指明了产品名,产品厂商,产品设备,版本,要编译的系统类型,以及产品包含的子系统。
279
2804. build目录下的subsystem_config.json文件。
281
282    ```
283    {
284      "arkui": {
285       "path": "foundation/arkui",
286       "name": "arkui"
287      },
288      "ai": {
289       "path": "foundation/ai",
290       "name": "ai"
291      },
292 	  ......
293    }
294    ```
295    该文件对子系统进行了说明,我们需要该子系统定义中的name与path,分别表示子系统的名称和所在文件夹路径。
296
297**ohos-sdk编译**
298
299    **编译命令:**
300
301    ``` ./build.sh --product-name ohos-sdk --ccache ```
302
303    **结果输出:**
304
305    ``` out/sdk/packages/ohos-sdk/ ```
306
307    **ohos-sdk模块配置:**
308
309    ``` build/ohos/sdk/ohos_sdk_description_std.json ```
310
311
312
313## 常见问题说明<a name="section131336181"></a>
314
315**如何将一个模块编译并打包到版本中?**
316
317-   模块要指定part\_name,指定它归属的部件,一个模块只能属于一个部件;
318-   部件的模块,要在部件配置的module\_list中,或者可以被module\_list中的模块依赖到;
319-   部件要加到对应产品的部件列表中;
320
321[FAQ](docs/FAQ.md)
322
323[关于deps和external_deps的使用](docs/关于deps及external_deps的使用.md)
324
325[标准系统如何添加一个模板并参与编译](docs/标准系统如何添加一个模块.md)
326
327[标准系统如何修改镜像文件的打包参数](docs/标准系统如何修改镜像文件的打包参数.md)
328
329[如何跟随系统使用gn编译hap](docs/how-to-build-a-hap.md)
330
331[开源软件Notice收集策略说明](docs/开源软件Notice收集策略说明.md)
332
333[关于生成开源软件包](docs/生成开源软件包.md)
334
335[构建系统编码规范与最佳实践](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-gn-coding-style-and-best-practice.md)
336
337[部件化编译最佳实践](docs/部件化编译最佳实践.md)
338
339
340## 相关仓<a name="section1371113476307"></a>
341
342**[编译构建子系统](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/编译构建子系统.md)**
343
344**[build\_lite](https://gitee.com/openharmony/build_lite/blob/master/README_zh.md)**
345
346