• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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## 目录<a name="section161941989596"></a>
21
22```
23/build                           # 编译构建主目录
24├── config                       # 编译相关的配置项
25├── core
26│   └── gn                       # 编译入口BUILD.gn配置
27├── loader                       # 各个部件配置加载、模板生成
28├── ohos                         # OpenHarmony编译打包流程配置
29│   ├── kits                     # kits编译打包模板和处理流程
30│   ├── ndk                      # ndk模板和处理流程
31│   ├── notice                   # notice模板和处理流程
32│   ├── packages                 # 版本打包模板和处理流程
33│   ├── sa_profile               # sa模板和处理流程
34│   ├── sdk                      # sdk模板和处理流程,包括sdk中包含的模块配置
35│   └── testfwk                  # 测试相关的处理
36├── scripts                      # 编译相关的python脚本
37├── templates                    # c/c++编译模板定义
38└── toolchain                    # 编译工具链配置
39```
40
41## 约束与限制<a name="section2029921310472"></a>
42
43-   编译环境需要Ubuntu18.04及以上版本。
44
45-   安装编译所需的程序包。
46
47    安装命令:
48
49    ```
50    sudo apt-get install binutils git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4
51    ```
52
53
54## 说明<a name="section1312121216216"></a>
55
561.  代码根目录下执行全量版本的编译命令:
57
58    ```
59    ./build.sh --product-name {product_name}
60    ```
61
62    编译结果镜像输出在 out/${device_name}/packages/phone/images/目录下。
63
642.  编译命令支持选项:
65
66    ```
67      --product-name    # 必须  编译的产品名称,如:Hi3516DV300
68      --build-target    # 可选  指定编译目标,可以指定多个
69      --gn-args         # 可选  gn参数,支持指定多个
70      --ccache          # 可选  编译使用ccache,需要本地安装ccache
71      --sparse-image    # 可选  生成sparse镜像,需要本地安装img2simg,默认镜像为raw
72    ```
73
743.  在已有部件中增加模块。
75
76    **支持的模板类型:**
77
78    ```
79    ohos_executable
80    ohos_shared_library
81    ohos_static_library
82    ohos_source_set
83
84    # 预编译模板:
85    ohos_prebuilt_executable
86    ohos_prebuilt_shared_library
87    ohos_prebuilt_etc
88    ```
89
90    在模块目录下配置BUILD.gn,根据类型选择对应的模板。
91
92    **例子:**
93
94    _ohos\_shared\_library示例:_
95
96    ```
97    import("//build/ohos.gni")
98    ohos_shared_library("helloworld") {
99      sources = []
100      include_dirs = []
101      cflags = []
102      cflags_c = []
103      cflags_cc = []
104      ldflags = []
105      configs = []
106      deps =[]  # 部件内模块依赖
107
108      # 跨部件模块依赖定义,
109      # 定义格式为 "部件名:模块名称"
110      # 这里依赖的模块必须是依赖的部件声明在inner_kits中的模块
111      external_deps = [
112        "part_name:module_name",
113      ]
114
115      output_name = "" # 可选,模块输出名
116      output_extension = "" # 可选,模块名后缀
117      module_install_dir = "" # 可选,缺省在/system/lib64/system/lib下, 模块安装路径,模块安装路径,从system/,vendor/后开始指定
118      relative_install_dir = "" # 可选,模块安装相对路径,相对于/system/lib64/system/lib;如果有module_install_dir配置时,该配置不生效
119      install_images = [] # 可选,缺省值system,指定模块安装到那个分区镜像中,可以指定多个
120
121      part_name = "" # 必选,所属部件名称
122    }
123    ```
124
125    _ohos\_executable示例:_
126
127    ohos\_executable模板属性和ohos\_shared\_library基本一致
128
129    _注意:可执行模块(即ohos\_executable模板定义的)默认是不安装的,如果要安装,需要指定install\_enable = true_
130
131    _ohos\_prebuilt\_etc示例:_
132
133    ```
134    import("//build/ohos.gni")
135    ohos_prebuilt_etc("etc_file") {
136      source = "file"
137      deps = []  # 部件内模块依赖
138      module_install_dir = "" #可选,模块安装路径,从system/,vendor/后开始指定
139      relative_install_dir = "" #可选,模块安装相对路径,相对于system/etc;如果有module_install_dir配置时,该配置不生效
140      install_images = [] # 可选,缺省值system,指定模块安装到那个分区镜像中,可以指定多个
141      part_name = "" # 必选,所属部件名称
142    }
143    ```
144
1454.  部件配置。
146
147    部件配置在所属子系统的根目录下的 ohos.build文件中,一个子系统可以配置多个部件。
148
149    一个部件包含module\_list、inner\_kits、system\_kits、test\_list四个部分的声明:
150
151    -   module\_list:部件包含的模块列表
152    -   inner\_kits:部件提供其它部件的接口
153    -   system\_kits:部件提供给生成应用的接口
154    -   test\_list:部件对应模块的测试用例
155
156    ohos.build中各个配置,都只是声明,具体的模块配置还是在对应的BUILD.gn中。
157
1585.  ohos-sdk编译。
159
160    **编译命令:**
161
162    ``` ./build.sh --product-name ohos-sdk --ccache ```
163
164    **结果输出:**
165
166    ``` out/sdk/packages/ohos-sdk/ ```
167
168    **ohos-sdk模块配置:**
169
170    ``` build/ohos/sdk/ohos_sdk_description_std.json ```
171
172
173
174## 常见问题说明<a name="section131336181"></a>
175
176**如何将一个模块编译并打包到版本中?**
177
178-   模块要指定part\_name,指定它归属的部件,一个模块只能属于一个部件;
179-   部件的模块,要在部件配置的module\_list中,或者可以被module\_list中的模块依赖到;
180-   部件要加到对应产品的部件列表中;
181
182[FAQ](docs/FAQ.md)
183
184[关于deps和external_deps的使用](docs/关于deps及external_deps的使用.md)
185
186[标准系统如何添加一个模板并参与编译](docs/标准系统如何添加一个模块.md)
187
188[标准系统如何修改镜像文件的打包参数](docs/标准系统如何修改镜像文件的打包参数.md)
189
190[如何跟随系统使用gn编译hap](docs/how-to-build-a-hap.md)
191
192[开源软件Notice收集策略说明](docs/开源软件Notice收集策略说明.md)
193
194[关于生成开源软件包](docs/生成开源软件包.md)
195
196[构建系统编码规范与最佳实践](https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-gn-coding-style-and-best-practice.md)
197
198[部件化编译最佳实践](docs/部件化编译最佳实践.md)
199
200
201## 相关仓<a name="section1371113476307"></a>
202
203编译构建子系统
204
205**build**
206
207