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_kits, 213 测试用例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