1# Copyright (c) 2023 Huawei Device Co., Ltd. 2# Licensed under the Apache License, Version 2.0 (the "License"); 3# you may not use this file except in compliance with the License. 4# You may obtain a copy of the License at 5# 6# http://www.apache.org/licenses/LICENSE-2.0 7# 8# Unless required by applicable law or agreed to in writing, software 9# distributed under the License is distributed on an "AS IS" BASIS, 10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11# See the License for the specific language governing permissions and 12# limitations under the License. 13 14import("//build/config/python.gni") 15import("//build/ohos.gni") 16import("//build/ohos/build_var.gni") 17import("//build/ohos_var.gni") 18 19template("check_abi_and_copy_deps") { 20 action(target_name) { 21 abidiff_target = "//third_party/libabigail/tools:abidiff($host_toolchain)" 22 abidw_target = "//third_party/libabigail/tools:abidw($host_toolchain)" 23 deps = invoker.sources 24 deps += [ abidiff_target ] 25 deps += [ abidw_target ] 26 outputs = [] 27 check_params = [] 28 foreach(element, invoker.sources) { 29 element_target_out_dir = get_label_info(element, "target_out_dir") 30 element_name = get_label_info(element, "name") 31 32 param_data = [] 33 param_data = { 34 type = invoker.type 35 target_out_dir = rebase_path(element_target_out_dir, root_build_dir) 36 target_name = element_name 37 root_out_dir = rebase_path(invoker.root_out_dir, root_build_dir) 38 } 39 check_params += [ param_data ] 40 41 outputs += [ "${element_target_out_dir}/${element_name}_abi_info.dump" ] 42 } 43 44 check_datas_file = 45 "${target_out_dir}/${invoker.target_name}_check_datas.json" 46 write_file(check_datas_file, check_params, "json") 47 48 inputs = [ check_datas_file ] 49 script = "//build/ohos/update/check_abi_and_copy_deps.py" 50 51 args = [ 52 "--clang-readelf", 53 rebase_path("$clang_base_path/bin/llvm-readelf", root_build_dir), 54 "--target-out-dir", 55 rebase_path(target_out_dir, root_build_dir), 56 "--check-datas-file", 57 rebase_path(check_datas_file, root_build_dir), 58 "--abidiff-target-name", 59 get_label_info(abidiff_target, "name"), 60 "--abidiff-target-out-dir", 61 rebase_path(get_label_info(abidiff_target, "target_out_dir"), 62 root_build_dir), 63 "--abidw-target-name", 64 get_label_info(abidw_target, "name"), 65 "--abidw-target-out-dir", 66 rebase_path(get_label_info(abidw_target, "target_out_dir"), 67 root_build_dir), 68 "--abi-dumps-path", 69 rebase_path("//prebuilts/abi_dumps", root_build_dir), 70 ] 71 } 72} 73 74template("ohos_module_package") { 75 if (defined(invoker.subsystem_name) && defined(invoker.part_name)) { 76 subsystem_name = invoker.subsystem_name 77 part_name = invoker.part_name 78 } else if (defined(invoker.part_name)) { 79 part_name = invoker.part_name 80 _part_subsystem_info_file = 81 "$root_build_dir/build_configs/parts_info/part_subsystem.json" 82 _arguments = [ 83 "--part-name", 84 part_name, 85 "--part-subsystem-info-file", 86 rebase_path(_part_subsystem_info_file, root_build_dir), 87 ] 88 get_subsystem_script = "//build/templates/common/get_subsystem_name.py" 89 subsystem_name = 90 exec_script(get_subsystem_script, _arguments, "trim string") 91 } else if (defined(invoker.subsystem_name)) { 92 subsystem_name = invoker.subsystem_name 93 part_name = subsystem_name 94 } else { 95 subsystem_name = "build" 96 part_name = "build_framework" 97 } 98 99 if (defined(invoker.zip_private_key)) { 100 zip_private_key = invoker.zip_private_key 101 } 102 103 if (defined(invoker.sign_cert)) { 104 sign_cert = invoker.sign_cert 105 } 106 107 if (defined(invoker.img_private_key)) { 108 img_private_key = invoker.img_private_key 109 } else { 110 img_private_key = "//base/startup/hvb/tools/vb_pub_key/test_priv.pem" 111 } 112 113 if (defined(invoker.img_public_key)) { 114 img_public_key = invoker.img_public_key 115 img_output_dir = "sign_img_output" 116 } else { 117 img_public_key = "//base/startup/hvb/tools/vb_pub_key/test_pub.pem" 118 img_output_dir = "img_output" 119 } 120 121 if (defined(invoker.libraries) && invoker.libraries != []) { 122 libraries = invoker.libraries 123 check_abi_and_copy_deps("${target_name}_libraries") { 124 sources = libraries 125 type = "shared_library" 126 } 127 } 128 129 if (defined(invoker.prebuilts) && invoker.prebuilts != []) { 130 prebuilts = invoker.prebuilts 131 check_abi_and_copy_deps("${target_name}_prebuilts") { 132 sources = prebuilts 133 type = "prebuilt" 134 } 135 } 136 137 if (defined(invoker.binaries) && invoker.binaries != []) { 138 binaries = invoker.binaries 139 check_abi_and_copy_deps("${target_name}_binaries") { 140 sources = binaries 141 type = "executable" 142 } 143 } 144 145 if (defined(invoker.etc) && invoker.etc != []) { 146 etc = invoker.etc 147 check_abi_and_copy_deps("${target_name}_etc") { 148 sources = etc 149 type = "etc" 150 } 151 } 152 153 if (defined(invoker.empty)) { 154 empty = invoker.empty 155 } else { 156 empty = false 157 } 158 159 output_dir = "${target_out_dir}/" 160 package_name = target_name 161 162 if (defined(invoker.module_config)) { 163 module_config = invoker.module_config 164 } 165 166 assert(subsystem_name != "") 167 assert(part_name != "") 168 assert(zip_private_key != "") 169 assert(sign_cert != "") 170 assert(img_private_key != "") 171 assert(img_public_key != "") 172 assert(module_config != "") 173 174 ohos_copy("module_config_inner") { 175 sources = [ "$module_config" ] 176 outputs = [ "$output_dir/module_package/img_input/{{source_file_part}}" ] 177 } 178 179 action("build_image") { 180 script = "//base/update/packaging_tools/build_module_img.py" 181 182 deps = [ 183 ":module_config_inner", 184 "//third_party/e2fsprogs:e2fsprogs_host_toolchain", 185 "//third_party/e2fsprogs:resize2fs($host_toolchain)", 186 ] 187 if (defined(invoker.etc) && etc != []) { 188 deps += [ ":${package_name}_etc" ] 189 } 190 if (defined(invoker.libraries) && libraries != []) { 191 deps += [ ":${package_name}_libraries" ] 192 } 193 if (defined(invoker.prebuilts) && prebuilts != []) { 194 deps += [ ":${package_name}_prebuilts" ] 195 } 196 if (defined(invoker.binaries) && binaries != []) { 197 deps += [ ":${package_name}_binaries" ] 198 } 199 200 dac_config = "//build/ohos/images/mkimage/dac.txt" 201 file_context = 202 "$root_build_dir/obj/base/security/selinux_adapter/file_contexts.bin" 203 image_input_path = "$output_dir/module_package/img_input" 204 output_image_file = "$output_dir/module_package/img_output/module.img" 205 output_sign_image_file = 206 "$output_dir/module_package/sign_img_output/module.img" 207 if (host_cpu == "arm64") { 208 build_image_tools_path = [ 209 "//${root_build_dir}/clang_arm64/thirdparty/e2fsprogs", 210 "//${root_build_dir}/clang_arm64/thirdparty/f2fs-tools", 211 ] 212 } else { 213 build_image_tools_path = [ 214 "//${root_build_dir}/clang_x64/thirdparty/e2fsprogs", 215 "//${root_build_dir}/clang_x64/thirdparty/f2fs-tools", 216 ] 217 } 218 build_image_tools_path += [ 219 "//third_party/e2fsprogs/prebuilt/host/bin", 220 "//build/ohos/images/mkimage", 221 "//base/startup/hvb/tools", 222 ] 223 224 sources = [ dac_config ] 225 outputs = [ 226 output_image_file, 227 output_sign_image_file, 228 ] 229 args = [ 230 "--image-name", 231 "module", 232 "--input-path", 233 rebase_path(image_input_path, root_build_dir), 234 "--fs-type", 235 "ext4", 236 "--dac-config", 237 rebase_path(dac_config, root_build_dir), 238 "--file-context", 239 rebase_path(file_context, root_build_dir), 240 "--output-image", 241 rebase_path(output_image_file, root_build_dir), 242 "--target-cpu", 243 target_cpu, 244 "--build-image-tools-path", 245 ] 246 args += rebase_path(build_image_tools_path, root_build_dir) 247 if (defined(invoker.img_public_key)) { 248 args += [ 249 "--pubkey", 250 rebase_path(img_public_key, root_build_dir), 251 "--privkey", 252 rebase_path(img_private_key, root_build_dir), 253 "--output-sign-image-path", 254 rebase_path(output_sign_image_file, root_build_dir), 255 ] 256 } 257 } 258 259 ohos_copy("module_config_outer") { 260 sources = [ "$module_config" ] 261 outputs = 262 [ "$output_dir/module_package/$img_output_dir/{{source_file_part}}" ] 263 } 264 265 ohos_copy("pub_key_outer") { 266 sources = [ "$img_public_key" ] 267 outputs = [ "$output_dir/module_package/sign_img_output/pub_key.pem" ] 268 } 269 270 action(target_name) { 271 script = "//base/update/packaging_tools/build_module_package.py" 272 deps = [ 273 ":module_config_outer", 274 "//base/update/sys_installer/tools/zipalign:zipalign", 275 ] 276 if (defined(invoker.img_public_key)) { 277 deps += [ ":pub_key_outer" ] 278 } 279 if (!empty) { 280 deps += [ ":build_image" ] 281 } 282 283 source_dir = "$output_dir/module_package/$img_output_dir" 284 out_dir = "$output_dir/module_package/zip_output" 285 286 sources = get_target_outputs(":module_config_outer") 287 outputs = [ "$out_dir/$package_name.zip" ] 288 289 args = [ 290 "-pn", 291 package_name, 292 "-pk", 293 rebase_path(zip_private_key, root_build_dir), 294 "-sc", 295 rebase_path(sign_cert, root_build_dir), 296 rebase_path(source_dir, root_build_dir), 297 rebase_path(out_dir, root_build_dir), 298 ] 299 } 300} 301 302template("ohos_hmp") { 303 output_dir = "${root_out_dir}/" 304 305 _deps = [] 306 module_packages = [] 307 if (defined(invoker.module_packages)) { 308 module_packages += invoker.module_packages 309 _deps += module_packages 310 } 311 312 if (defined(invoker.pack_info)) { 313 pack_info = invoker.pack_info 314 } 315 316 assert(module_packages != "") 317 assert(pack_info != "") 318 319 package_name = target_name 320 321 action("build_hmp") { 322 script = "//base/update/packaging_tools/build_hmp.py" 323 deps = _deps 324 325 out_dir = "$output_dir/hmp" 326 327 sources = [] 328 foreach(module_package, module_packages) { 329 module_name = get_label_info(module_package, "name") 330 module_out_dir = get_label_info(module_package, "target_out_dir") 331 sources += 332 [ "$module_out_dir/module_package/zip_output/$module_name.zip" ] 333 } 334 335 outputs = [ "$out_dir/$package_name.zip" ] 336 337 args = [ 338 "-pn", 339 package_name, 340 "-op", 341 rebase_path(out_dir, root_build_dir), 342 "-pi", 343 rebase_path(pack_info, root_build_dir), 344 "-mf", 345 ] 346 foreach(source, sources) { 347 source_path = rebase_path(source, root_build_dir) 348 args += [ source_path ] 349 } 350 } 351 352 group(target_name) { 353 deps = [ ":build_hmp" ] 354 } 355} 356