1# 移植准备 2 3 4由于OpenHarmony工程需要在Linux环境下进行编译,此章节将指导厂商搭建OpenHarmony的编译环境、获取OpenHarmony源码,并且创建厂商工作目录完成厂商芯片的编译框架适配。 5 6 7## 搭建编译环境 8 9开展移植前请参考[开发环境准备](../quick-start/quickstart-ide-env-win.md)完成环境搭建工作。 10 11 12## 获取源码 13 14 15### 获取操作 16 17请参考[获取源码](../get-code/sourcecode-acquire.md)完成源码下载并进行编译。 18 19> ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** 20> 本文档仅适用于OpenHarmony LTS 3.0.1及之前版本,所以请获取对应版本的源码。 21 22 23### 目录介绍 24 25OpenHarmony源码重要目录介绍见表1 OpenHarmony重要目录,其中device和vendor目录为芯片厂商和终端模组厂商工作区域(在[搭建编译框架](#搭建编译框架)部分详细介绍)。 26 27 **表1** OpenHarmony重要目录 28 29| 目录 | 用途 | 30| -------- | -------- | 31| build | 编译框架所在目录。 | 32| kernel/liteos_m | 内核所在的目录,其中arch目录描述支撑的内核架构。 | 33| device | 芯片厂商适配目录,其中“config.gni”描述当前芯片使用的arch,工具链,编译链接选项等。 | 34| vendor | 终端模组厂商适配目录,其中“config.json”描述需要集成的OpenHarmony子系统列表。 | 35| utils | file,kv等相关的适配。 | 36 37 38## 搭建编译框架 39 40厂商开展移植工作时,需要在工程中按照公司名、芯片型号、开发板型号等创建工作目录,并且将所创目录加入到OpenHarmony的编译框架中,使厂商的工作目录能够参与编译,开发者可参照以下步骤进行操作。 41 421. 新增芯片厂商。 43 基于某款芯片进行OpenHarmony的适配,需要在device目录下创建芯片厂商目录,目录内文件描述内核类型,编译工具链,编译链接选项,内核配置选项等。 44 45 创建目录规则:“device/{芯片厂商}/{芯片开发板}”。 46 47 例:“device/MyDeviceCompany/MyBoard” 48 49 ``` 50 device 51 ├── hisilicon # hisilicon芯片相关目录,创建目录时可供参考 52 ├── MyDeviceCompany # MyDeviceCompany 芯片厂商 53 │ └── MyBoard # MyBoard 芯片型号 54 │ ├── BUILD.gn 55 │ ├── liteos_m 56 │ │ └── config.gni # 芯片工具链,编译链接选项 57 │ └── target_config.h # 内核配置选项 58 └── qemu # qemu相关 59 ``` 60 61 编译脚本:将“device/MyDeviceCompany/MyBoard”下的文件添加到OpenHarmony编译框架中。 62 63 路径:“device/MyDeviceCompany/MyBoard/BUILD.gn” 64 65 66 ``` 67 group("MyBoard") { #将此BUILD.gn文件加入解析 68 print("MyDeviceCompany MyBoard is under developing.") 69 } 70 ``` 71 72 开发板编译配置:包括内核类型、工具链类型以及编译参数等内容(详见表2“config.gni”主要配置项)。 73 74 路径:“device/MyDeviceCompany/MyBoard/liteos_m/config.gni” 75 76 77 ``` 78 # Kernel type, e.g. "linux", "liteos_a", "liteos_m". 79 kernel_type = "liteos_m" 80 81 # Kernel version. 82 kernel_version = "" 83 84 # Board CPU type, e.g. "cortex-a7", "riscv32". 85 board_cpu = "cortex-m4" 86 87 # Board arch, e.g. "armv7-a", "rv32imac". 88 board_arch = "" 89 90 # Toolchain name used for system compiling. 91 # E.g. gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang, riscv32-unknown-elf. 92 # Note: The default toolchain is "ohos-clang". It's not mandatory if you use the default toochain. 93 board_toolchain = "arm-none-eabi-gcc" 94 95 # The toolchain path instatlled, it's not mandatory if you have added toolchian path to your ~/.bashrc. 96 board_toolchain_path = "" 97 98 # Compiler prefix. 99 board_toolchain_prefix = "arm-none-eabi-" 100 101 # Compiler type, "gcc" or "clang". 102 board_toolchain_type = "gcc" 103 104 # Board related common compile flags. 105 board_cflags = [] 106 board_cxx_flags = board_cflags 107 board_ld_flags = [] 108 109 # Board related headfiles search path. 110 board_include_dirs = [] 111 112 # Board adapter dir for OHOS components. 113 board_adapter_dir ="" 114 ``` 115 116 **表2** “config.gni”主要配置项 117 118 | 配置项 | 介绍 | 119 | -------- | -------- | 120 | kernel_type | 开发板使用的内核类型,例如:“liteos_a”,“liteos_m”,“linux”。 | 121 | kernel_version | 开发板使用的内核版本。 | 122 | board_cpu | 开发板CPU类型,例如:“cortex-m4”,“cortex-a7”,“riscv32”。 | 123 | board_arch | 开发芯片arch指令集, 例如:“armv7-a”。 | 124 | board_toolchain | 开发板自定义的编译工具链名称,例如:“gcc-arm-none-eabi”。若为空,则使用默认为ohos-clang。 | 125 | board_toolchain_path | 编译工具链路径,为空则默认使用环境变量中的工具链。 | 126 | board_toolchain_prefix | 编译工具链前缀,例如:“arm-none-eabi-”。 | 127 | board_toolchain_type | 编译工具链类型,目前支持gcc和clang。 | 128 | board_cflags | 开发板配置的c文件编译选项。 | 129 | board_cxx_flags | 开发板配置的cpp文件编译选项。 | 130 | board_ld_flags | 开发板配置的链接选项。 | 131 | board_include_dirs | 开发板配置的系统头文件路径列表。 | 132 | board_adapter_dir | 开发板适配文件路径。 | 133 1341. 新增模组终端厂商。 135 基于某款具备OpenHarmony能力的芯片进行模组终端开发,需要在vendor下创建模组厂商目录,目录内容主要是使用的OpenHarmony子系统能力。 136 137 创建目录规则:“vendor/{产品模组厂商}/{产品模组名称}”。 138 139 例:“vendor/MyVendorCompany/MyProduct” 140 141 ``` 142 vendor 143 ├── hisilicon # hisilicon 产品相关目录,可供参考 144 └── MyVendorCompany # MyVendorCompany 产品模组厂商 145 └── MyProduct # 具体产品 146 ├── BUILD.gn 147 └── config.json # 产品子系统列表 148 ``` 149 150 编译脚本:将“vendor/MyVendorCompany/MyProduct/BUILD.gn”下的文件添加到OpenHarmony编译框架中。 151 152 路径:“vendor/MyVendorCompany/MyProduct/BUILD.gn” 153 154 155 ``` 156 group("MyProduct") { 157 print("MyVendorCompany MyProduct is under developing.") 158 } 159 ``` 160 161 产品配置信息:包括产品名、设备厂商、内核类型以及所添加的子系统列表等信息(详见表3)。 162 163 路径:“vendor/MyVendorCompany/MyProduct/config.json” 164 165 166 ``` 167 { 168 "product_name": "MyProduct", 169 "ohos_version": "OpenHarmony 1.0", 170 "device_company": "MyDeviceCompany", 171 "board": "MyBoard", 172 "kernel_type": "liteos_m", 173 "kernel_version": "", 174 "subsystems": [ 175 { 176 "subsystem": "startup", 177 "components": [ 178 { "component": "bootstrap", "features":[] }, 179 { "component": "syspara_lite", "features": 180 [ 181 "enable_ohos_startup_syspara_lite_use_thirdparty_mbedtls = false" 182 ] 183 } 184 ] 185 } 186 ], 187 "vendor_adapter_dir": "", 188 "third_party_dir": "", 189 "product_adapter_dir": "//vendor/MyVendorCompany/MyProduct/hals", 190 } 191 ``` 192 193 **表3** “config.json”文件配置项 194 195 | 配置项 | 介绍 | 196 | -------- | -------- | 197 | product_name | 产品名称,hb set时显示产品名称。 | 198 | ohos_version | OpenHarmony版本号,与实际版本保持一致即可。 | 199 | device_company | 芯片厂商名称,与device的二级目录名称一致。 | 200 | board | 开发板名称,与device的三级目录名称一致。 | 201 | kernel_type | 内核类型,应与开发板移植的OpenHarmony系统内核类型匹配。 | 202 | kernel_version | 内核版本号,与config.gni中kernel_version值匹配。 | 203 | subsystem | 产品选择的子系统,应为OS支持的子系统。子系统定义请见build/lite/components目录下的各子系统描述文件。 | 204 | components | 产品选择的某个子系统下的组件,子系统支持的组件详见build/lite/components/{子系统}.json文件。 | 205 | features | 产品配置的某个组件的特性,详见子系统源码目录对应的BUILD.gn文件。 | 206 | vendor_adapter_dir | 适配IOT外设,UtilsFile文件读写能力,一般指向device下目录。使用详见[文件子系统移植实例步骤2。](porting-minichip-subsys-filesystem.md#移植实例) | 207 | third_party_dir | 芯片厂自身三方软件目录,例如mbedtls,lwip等。如果使用OpenHarmony提供的三方软件,可暂时设空,也可参考hispark_pegasus的配置 。 | 208 | product_adapter_dir | 适配hal_token以及系统参数,一般指向vendor下目录。使用详见[启动恢复子系统移植实例步骤1。](porting-minichip-subsys-startup.md#移植实例) | 209 210 > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:** 211 > 1. 编译构建系统会对字段进行有效性检查,其中: 212 > 213 > - device_company,board,kernel_type,kernel_version应与芯片厂商配置匹配。 214 > 215 > - subsystem,component应与“build/lite/components”下的部件描述匹配。 216