编译构建子系统

    1. 构建不同芯片平台的产品。如:Hi3518EV300平台的ipcamera产品,Hi3516DV300平台的ipcamera产品,Hi3861平台的wifi模组产品。
    2. 构建HPM包管理配置生成的自定义产品。

    编译构建框架开发者需预装GN和ninja构建工具,且加入环境变量。

    • 编译已有产品
    1. python build.py wifiiot
    2. # 编译基于Hi3518ev300的ipcamera:
    3. python build.py ipcamera_hi3518ev300
    4. # 编译基于Hi3516dv300的ipcamera:
    5. python build.py ipcamera_hi3516dv300
    • 编译组件

      本节以添加一个自定义的组件为例,描述了如何编译组件、编译库、编译可执行文件。

      示例组件example由两个功能feature1和feature2组成。feture1的目标为一个动态库,feature2的目标为一个可执行文件。

      示例组件example的完整目录结构如下:

      1. example # 自定义组件
      2. ├── BUILD.gn # 自定义组件gn脚本,BUILD.gn为固定名称
      3. ├── feature1 # 自定义单元1
      4. ├── BUILD.gn # 自定义单元1的gn脚本,BUILD.gn为固定名称
      5. ├── include # 头文件文件夹
      6. └── helloworld1.h # 头文件1
      7. └── src # 源文件文件夹
      8. └── helloworld1.c # 源文件1
      9. ├── feature2 # 自定义单元2
      10. ├── BUILD.gn # 自定义单元2的gn脚本,BUILD.gn为固定名称
      11. ├── include # 头文件文件夹
      12. └── helloworld2.h # 头文件2
      13. └── src # 源文件文件夹
      14. └── helloworld2.c # 源文件2
      15. ├── build.sh # 自定义组件build.sh脚本,非必要
      16. └── Makefile # 自定义组件Makefile脚本,非必

      第一步:编写example/feature1/BUILD.gn,动态库的gn脚本

      使用lite_library模板,可以编译出动态库与静态库。示例如下:

      使用gn自带模板executable,可编译出可执行文件。示例如下:

      1. #编译可执行.bin文件
      2. executable("hello_world_bin") {
      3. sources = [
      4. "src/helloworld.c"
      5. ]
      6. include_dirs = [
      7. #"../feature2_example/include" # 如果依赖 feature2_example 可以加入该include
      8. ]
      9. # 如果依赖 feature1_example 可以加入该deps
      10. #deps = [
      11. # "../feature1_example:helloworld1"
      12. }

      第三步:编写example/BUILD.gn,组件gn脚本

      1. import("//build/lite/config/component/lite_component.gni")
      2. #工程全篇使用BUILD.gn脚本编译
      3. lite_component("example_gn") {
      4. features = [
      5. "feature_example1:helloworld_lib",
      6. "feature_example2:hello_world_bin",
      7. ]
      8. }
      9. #融入自带build.sh或Makefile工程, 用gn脚本调用混合编译
      10. build_ext_component("example_mk") {
      11. exec_path = rebase_path(rebase_path(".", root_build_dir))
      12. outdir = rebase_path(get_path_info(".", "out_dir"))
      13. prebuilts = "sh build.sh"
      14. command = "make clean && make"
      15. }
    • 可用的编译构建变量

      全局可引用的变量定义在://build/lite/ohos_var.gni

      用户常用变量说明见表1:

      表1

      | 变量 | 取值范围 | 说明 | | —————————- | ————————————————————— | ——————— | | ohos_kernel_type | “liteos_a”, “liteos_riscv” | 内核类型 | | board_name | “hi3516dv300”, “hi3518ev300”, “hi3861v100” | 开发板类型 | | ohos_build_compiler | “gcc”, “clang” | 编译工具链类型 |

    • 编译HPM的解决方案

      通过HPM下载后,用户自定的全量模板在//build/lite/product 目录下。

      如ipcamera_hi3516dv300.json,构建时会读取该文件包含所有用户自定义子系统、组件等配置。

    • 编译输出

      编译所生产的文件都归档在out目录下,例在代码所在目录下,

      运行”python build.py wifiiot”,编译wifiiot完成后,会有如下结果生成:

      1. out/
      2. └── wifiiot # 产品名
      3. ├── args.gn # gn编译,用户自定义变量
      4. ├── build.log # 编译日志
      5. ├── build.ninja
      6. ├── build.ninja.d
      7. ├── gen
      8. ├── Hi3861_boot_signed_B.bin # 带签名的bootloader备份文件
      9. ├── Hi3861_boot_signed.bin # 带签名的bootloader文件
      10. ├── Hi3861_loader_signed.bin # 烧写工具使用的加载文件
      11. ├── Hi3861_wifiiot_app_allinone.bin # 产线工装烧写文件(已经包含独立烧写程序和loader程序)
      12. ├── Hi3861_wifiiot_app.asm # Kernel asm文件
      13. ├── Hi3861_wifiiot_app_burn.bin # 烧写文件
      14. ├── Hi3861_wifiiot_app_flash_boot_ota.bin # Flash Boot升级文件
      15. ├── Hi3861_wifiiot_app_ota.bin # Kernel 升级文件
      16. ├── Hi3861_wifiiot_app.out # Kernel 输出文件
      17. ├── Hi3861_wifiiot_app_vercfg.bin # 安全启动配置boot和kernel版本号,防版本回滚
      18. ├── libs # 库文件夹
      19. ├── obj
      20. ├── suites
      21. └── toolchain.ninja
      22. 注:烧写文件,烧写程序建议使用"Hi3861_wifiiot_app_allinone.bin"

      运行”python build.py ipcamera_hi3518ev300”,编译ipcamera_hi3518ev300完成后,会有如下结果生成(同ipcamera_hi3516dv300):

      1. out/
      2. └── ipcamera_hi3518ev300 # 产品名
      3. ├── args.gn # gn编译,用户自定义变量
      4. ├── bin # 链接bin所在文件夹
      5. ├── bm_tool.map # map文件
      6. ├── build.log # 编译日志
      7. ├── build.ninja
      8. ├── build.ninja.d
      9. ├── bundle_daemon_tool.map # map文件
      10. ├── data # 媒体camera依赖底层资源配置文件
      11. ├── dev_tools # 研发自测试
      12. ├── foundation.map # map文件
      13. ├── gen
      14. ├── libaudio_api.so
      15. ├── libs # 镜像包含库文件
      16. ├── liteos.bin # liteos基础内核bin文件
      17. ├── media_server.map # map文件
      18. ├── NOTICE_FILE
      19. ├── obj # 二进制文件,编译结果文件夹
      20. ├── OHOS_Image # liteos整包bin文件,未strip
      21. ├── OHOS_Image.asm # 汇编代码
      22. ├── OHOS_Image.bin # liteos整包烧录bin文件
      23. ├── OHOS_Image.map # map文件
      24. ├── rootfs.img # 编译出的库和app的镜像
      25. ├── rootfs.tar # rootfs的压缩
      26. ├── suites # xts编译结果
      27. ├── test # 测试用例编译结果
      28. ├── toolchain.ninja
      29. ├── userfs # 用户可读写的分区
      30. ├── userfs.img # img格式的用户可读写的分区,对应启动之后的/storage目录