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 build_image_tools_path = [ 208 "//${root_build_dir}/clang_x64/thirdparty/e2fsprogs", 209 "//${root_build_dir}/clang_x64/thirdparty/f2fs-tools", 210 "//third_party/e2fsprogs/prebuilt/host/bin", 211 "//build/ohos/images/mkimage", 212 "//base/startup/hvb/tools", 213 ] 214 215 sources = [ dac_config ] 216 outputs = [ 217 output_image_file, 218 output_sign_image_file, 219 ] 220 args = [ 221 "--image-name", 222 "module", 223 "--input-path", 224 rebase_path(image_input_path, root_build_dir), 225 "--fs-type", 226 "ext4", 227 "--dac-config", 228 rebase_path(dac_config, root_build_dir), 229 "--file-context", 230 rebase_path(file_context, root_build_dir), 231 "--output-image", 232 rebase_path(output_image_file, root_build_dir), 233 "--target-cpu", 234 target_cpu, 235 "--build-image-tools-path", 236 ] 237 args += rebase_path(build_image_tools_path, root_build_dir) 238 if (defined(invoker.img_public_key)) { 239 args += [ 240 "--pubkey", 241 rebase_path(img_public_key, root_build_dir), 242 "--privkey", 243 rebase_path(img_private_key, root_build_dir), 244 "--output-sign-image-path", 245 rebase_path(output_sign_image_file, root_build_dir), 246 ] 247 } 248 } 249 250 ohos_copy("module_config_outer") { 251 sources = [ "$module_config" ] 252 outputs = 253 [ "$output_dir/module_package/$img_output_dir/{{source_file_part}}" ] 254 } 255 256 ohos_copy("pub_key_outer") { 257 sources = [ "$img_public_key" ] 258 outputs = [ "$output_dir/module_package/sign_img_output/pub_key.pem" ] 259 } 260 261 action(target_name) { 262 script = "//base/update/packaging_tools/build_module_package.py" 263 deps = [ 264 ":module_config_outer", 265 "//base/update/sys_installer/tools/zipalign:zipalign", 266 ] 267 if (defined(invoker.img_public_key)) { 268 deps += [ ":pub_key_outer" ] 269 } 270 if (!empty) { 271 deps += [ ":build_image" ] 272 } 273 274 source_dir = "$output_dir/module_package/$img_output_dir" 275 out_dir = "$output_dir/module_package/zip_output" 276 277 sources = get_target_outputs(":module_config_outer") 278 outputs = [ "$out_dir/$package_name.zip" ] 279 280 args = [ 281 "-pn", 282 package_name, 283 "-pk", 284 rebase_path(zip_private_key, root_build_dir), 285 "-sc", 286 rebase_path(sign_cert, root_build_dir), 287 rebase_path(source_dir, root_build_dir), 288 rebase_path(out_dir, root_build_dir), 289 ] 290 } 291} 292 293template("ohos_hmp") { 294 output_dir = "${root_out_dir}/" 295 296 _deps = [] 297 module_packages = [] 298 if (defined(invoker.module_packages)) { 299 module_packages += invoker.module_packages 300 _deps += module_packages 301 } 302 303 if (defined(invoker.pack_info)) { 304 pack_info = invoker.pack_info 305 } 306 307 assert(module_packages != "") 308 assert(pack_info != "") 309 310 package_name = target_name 311 312 action("build_hmp") { 313 script = "//base/update/packaging_tools/build_hmp.py" 314 deps = _deps 315 316 out_dir = "$output_dir/hmp" 317 318 sources = [] 319 foreach(module_package, module_packages) { 320 module_name = get_label_info(module_package, "name") 321 module_out_dir = get_label_info(module_package, "target_out_dir") 322 sources += 323 [ "$module_out_dir/module_package/zip_output/$module_name.zip" ] 324 } 325 326 outputs = [ "$out_dir/$package_name.zip" ] 327 328 args = [ 329 "-pn", 330 package_name, 331 "-op", 332 rebase_path(out_dir, root_build_dir), 333 "-pi", 334 rebase_path(pack_info, root_build_dir), 335 "-mf", 336 ] 337 foreach(source, sources) { 338 source_path = rebase_path(source, root_build_dir) 339 args += [ source_path ] 340 } 341 } 342 343 group(target_name) { 344 deps = [ ":build_hmp" ] 345 } 346} 347