# 编译构建使用指导 - [目录结构](#section56731811102915) - [编译命令](#section1475192018291) - [开发步骤](#section4207112818418) ## 目录结构 ``` build/lite # 编译构建主目录 ├── config # 编译相关的配置项 │ ├── boards # 开发板相关的变量定义。包括:开发板名、目标架构、目标CPU等 │ ├── component # OpenHarmony组件相关的模板定义。包括:静态库、动态库、扩展组件、模拟器库等 │ ├── kernel # OpenHarmony内核的编译变量定义与配置参数 │ └── subsystem # OpenHarmony子系统列表 ├── ndk # NDK相关编译脚本与配置参数 ├── platform # 平台相关的配置文件 │ ├── hi3516dv300_liteos_a # hi3516dv300, liteos_a平台。包括:平台全量配置表,启动文件。 │ ├── hi3518ev300_liteos_a # hi3518ev300, liteos_a平台。包括:平台全量配置表,启动文件。 │ └── hi3861v100_liteos_riscv # hi3861v100, liteos_riscv平台。包括:平台全量配置表,启动文件。 ├── product # 产品全量配置表。包括:配置单元、子系统列表、编译器等。 ├── toolchain # 编译工具链相关。包括:编译器路径、编译选项、链接选项等。 └── tools # 编译构建依赖的工具。包括:mkfs等。 ``` ## 编译命令 - 使用方法: ``` python build.py product [options] ``` product为build/lite/product/xxx.json, product名称和json配置文件中的组件均可自定义。默认json文件中的组件为对应平台支持的全集。 - 编译选项: -b, --build\_type Debug or release -t, --test Build with test suit -T, --target Build single target - 编译输出: 代码根目录/out/product ## 开发步骤 1. 添加组件 本节以添加一个自定义的组件为例,描述了如何编译组件、编译库、编译可执行文件。 示例组件example由两个功能feature1和feature2组成。feture1的目标为一个动态库,feature2的目标为一个可执行文件。示例组件example的完整目录结构如下: ``` example # 自定义组件 ├── BUILD.gn # 自定义组件gn脚本,BUILD.gn为固定名称 ├── feature1 # 自定义单元1 │ ├── BUILD.gn # 自定义单元1的gn脚本,BUILD.gn为固定名称 │ ├── include # 头文件文件夹 │ │ └── helloworld1.h # 头文件1 │ └── src # 源文件文件夹 │ └── helloworld1.c # 源文件1 ├── feature2 # 自定义单元2 │ ├── BUILD.gn # 自定义单元2的gn脚本,BUILD.gn为固定名称 │ ├── include # 头文件文件夹 │ │ └── helloworld2.h # 头文件2 │ └── src # 源文件文件夹 │ └── helloworld2.c # 源文件2 ├── build.sh # 自定义组件build.sh脚本,非必要 └── Makefile # 自定义组件Makefile脚本,非必要 ``` 示例1:编写动态库gn脚本example/feature1/BUILD.gn,示例如下: ``` # helloworld动态库编译示例 # helloworld的Build.gn文件 shared_library("helloworld_lib") { sources = [ "src/helloworld1.c" ] include_dirs = [ "include", "../feature2_example/include" #(可选)如果依赖 feature2_example 可以加入该include ] } ``` 示例2:编写可执行文件gn脚本example/feature2/BUILD.gn,示例如下: 内置函数executable,可编译出可执行文件。示例如下: ``` #编译可执行.bin文件 executable("hello_world_bin") { sources = [ "src/helloworld2.c" ] include_dirs = [ "include", "../feature2_example/include" #(可选)如果依赖 feature2_example 可以加入该include ] #(可选)如果依赖 feature1_example 可以加入该deps deps = [ "../feature1_example:helloworld1" ] } ``` 示例3,编译组件脚本example/BUILD.gn: ``` import("//build/lite/config/component/lite_component.gni") lite_component("example_gn") { features = [ "feature_example1:helloworld_lib", "feature_example2:hello_world_bin", ] } ``` 示例4,三方开源软件的build.sh或Makefile工程, 可用gn脚本调用混合编译: ``` build_ext_component("example_mk") { exec_path = rebase_path(rebase_path(".", root_build_dir)) outdir = rebase_path(get_path_info(".", "out_dir")) prebuilts = "sh build.sh" command = "make clean && make" } ``` 全局可引用的变量定义在:build/lite/ohos\_var.gni 用户常用变量说明见表1: **表 1** 用户常用变量