1# Copyright (c) 2021 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/app/app_internal.gni") 16import("//build/ohos/notice/notice.gni") 17import("//build/ohos_var.gni") 18import("//build/templates/metadata/module_info.gni") 19 20# Declare an OHOS AppScope target 21# 22# Variables: 23# app_profile: common config of hap. 24# sources: list of asset files to be included in hap. 25# 26template("ohos_app_scope") { 27 forward_variables_from(invoker, [ "testonly" ]) 28 assert(defined(invoker.app_profile), 29 "app_profile must be defined for ohos_app_scope") 30 assert(defined(invoker.sources), "sources must be defined for ohos_app_scope") 31 32 _metadata = "$target_gen_dir/$target_name.metadata" 33 _metadata_target = "${target_name}__metadata" 34 write_meta_data(_metadata_target) { 35 forward_variables_from(invoker, [ "app_profile" ]) 36 type = "app_profile" 37 meta_data = _metadata 38 resources = invoker.sources 39 app_profile = invoker.app_profile 40 } 41 group(target_name) { 42 public_deps = [ ":$_metadata_target" ] 43 } 44} 45 46# Declare an OHOS assets target 47# 48# Variables: 49# deps: dependencies of this target. 50# sources: list of asset files to be included in hap. 51# 52template("ohos_assets") { 53 forward_variables_from(invoker, [ "testonly" ]) 54 assert(defined(invoker.sources), "sources must be defined for ohos_assets") 55 _metadata = "$target_gen_dir/$target_name.metadata" 56 57 _metadata_target = "${target_name}__metadata" 58 write_meta_data(_metadata_target) { 59 forward_variables_from(invoker, [ "deps" ]) 60 type = "assets" 61 meta_data = _metadata 62 raw_assets = invoker.sources 63 } 64 group(target_name) { 65 public_deps = [ ":$_metadata_target" ] 66 } 67} 68 69# Declare a js assets target 70# 71# Variables: 72# source_dir: js assets directory, only one directory supported, string not list. 73# js2abc: whether to transform js bundle to ark bytecode, default value 74# follows build_ark. 75# ets2abc: whether to transform ets bundle to ark bytecode, default value false 76# deps: dependencies of this target. 77# 78template("ohos_js_assets") { 79 forward_variables_from(invoker, [ "testonly" ]) 80 assert(defined(invoker.source_dir), 81 "source_dir must be defined for ohos_js_assets") 82 83 _metadata = "$target_gen_dir/$target_name.metadata" 84 _metadata_target = "${target_name}__metadata" 85 write_meta_data(_metadata_target) { 86 forward_variables_from(invoker, 87 [ 88 "source_dir", 89 "deps", 90 ]) 91 meta_data = _metadata 92 if (defined(invoker.ets2abc) && invoker.ets2abc) { 93 type = "ets_assets" 94 ets_assets = [ source_dir ] 95 } else if (defined(invoker.js2abc) && invoker.js2abc) { 96 type = "js_assets" 97 js_assets = [ source_dir ] 98 } else { 99 type = "unresolved_assets" 100 unresolved_assets = [ source_dir ] 101 } 102 if (defined(invoker.hap_profile)) { 103 hap_profile = invoker.hap_profile 104 } 105 } 106 group(target_name) { 107 public_deps = [ ":$_metadata_target" ] 108 } 109} 110 111# Declare an OHOS resource target 112# 113# Variables: 114# deps: dependencies of this target. 115# sources: list of resource files to be compiled. 116# hap_profile: hap_profile is used when building resources. 117# 118template("ohos_resources") { 119 forward_variables_from(invoker, [ "testonly" ]) 120 assert(defined(invoker.sources), "sources must be defined for ohos_resources") 121 _metadata = "$target_gen_dir/$target_name.metadata" 122 123 _deps = [] 124 if (defined(invoker.deps)) { 125 _deps += invoker.deps 126 } 127 128 module_config = "" 129 module_configs = string_split(invoker.hap_profile, "/") 130 foreach(_module_config, module_configs) { 131 module_config = _module_config 132 } 133 _generated_profile = "$target_gen_dir/${target_name}/${module_config}" 134 _metadata_target = "${target_name}__metadata" 135 write_meta_data(_metadata_target) { 136 forward_variables_from(invoker, [ "package_name" ]) 137 type = "resources" 138 meta_data = _metadata 139 resources = invoker.sources 140 hap_profile = _generated_profile 141 deps = _deps 142 possible_deps = _deps 143 } 144 145 _deps += [ ":$_metadata_target" ] 146 147 # compile_resources target here only used for concat app.json to module.json 148 _compile_profile_target = "${target_name}__compile_profile" 149 merge_profile(_compile_profile_target) { 150 forward_variables_from(invoker, 151 [ 152 "deps", 153 "hap_profile", 154 ]) 155 meta_data = _metadata 156 generated_profile = _generated_profile 157 if (defined(deps)) { 158 deps += _deps 159 } else { 160 deps = _deps 161 } 162 } 163 164 _deps += [ ":$_compile_profile_target" ] 165 166 # compile_resources target here only used for resources.h generation 167 _compile_resources_target = "${target_name}__compile_resources" 168 _generated_header_dir = "$target_gen_dir/$target_name" 169 compile_resources(_compile_resources_target) { 170 forward_variables_from(invoker, 171 [ 172 "deps", 173 "package_name", 174 ]) 175 hap_profile = _generated_profile 176 meta_data = _metadata 177 generated_header_dir = _generated_header_dir 178 if (defined(deps)) { 179 deps += _deps 180 } else { 181 deps = _deps 182 } 183 } 184 185 _resources_config = "${target_name}__resources_headers" 186 config(_resources_config) { 187 include_dirs = [ _generated_header_dir ] 188 } 189 190 group(target_name) { 191 public_deps = [ ":$_metadata_target" ] 192 deps = [ 193 ":$_compile_profile_target", 194 ":$_compile_resources_target", 195 ] 196 public_configs = [ ":$_resources_config" ] 197 } 198} 199 200template("ohos_app") { 201 forward_variables_from(invoker, [ "testonly" ]) 202 203 _unsigned_hap_path_list = 204 "${target_out_dir}/${target_name}/unsigned_hap_path_list.json" 205 206 _abs_path = get_path_info("./", "abspath") 207 _hap_out_dir = "${target_out_dir}/${target_name}" 208 if (defined(invoker.hap_out_dir)) { 209 _hap_out_dir = invoker.hap_out_dir 210 } 211 212 _hap_name = target_name 213 if (defined(invoker.hap_name)) { 214 _hap_name = invoker.hap_name 215 } 216 217 if (defined(invoker.build_profile)) { 218 build_profile = invoker.build_profile 219 } else { 220 build_profile = "./build-profile.json5" 221 } 222 223 _js_build_mode = "release" 224 if (defined(invoker.js_build_mode)) { 225 _js_build_mode = invoker.js_build_mode 226 } 227 228 if (defined(invoker.system_lib_deps)) { 229 _system_lib_deps = invoker.system_lib_deps 230 } 231 232 _main_target_name = target_name 233 234 if (defined(invoker.subsystem_name) && defined(invoker.part_name)) { 235 _subsystem_name = invoker.subsystem_name 236 _part_name = invoker.part_name 237 } else if (defined(invoker.part_name)) { 238 _part_name = invoker.part_name 239 _part_subsystem_info_file = 240 "$root_build_dir/build_configs/parts_info/part_subsystem.json" 241 _arguments = [ 242 "--part-name", 243 _part_name, 244 "--part-subsystem-info-file", 245 rebase_path(_part_subsystem_info_file, root_build_dir), 246 ] 247 _get_subsystem_script = "//build/templates/common/get_subsystem_name.py" 248 _subsystem_name = 249 exec_script(_get_subsystem_script, _arguments, "trim string") 250 } else if (defined(invoker.subsystem_name)) { 251 _subsystem_name = invoker.subsystem_name 252 _part_name = _subsystem_name 253 } else { 254 _subsystem_name = "build" 255 _part_name = "build_framework" 256 } 257 258 assert(_subsystem_name != "") # Mark as used 259 assert(_part_name != "") # Mark as used 260 261 _module_info_target = "${_main_target_name}_info" 262 generate_module_info(_module_info_target) { 263 module_name = _main_target_name 264 module_type = "app" 265 module_source_dir = get_path_info(_hap_out_dir, "dir") 266 267 if (defined(invoker.install_images)) { 268 module_install_images = [] 269 module_install_images += invoker.install_images 270 } else { 271 module_install_images = [ "system" ] 272 } 273 install_enable = true 274 if (defined(invoker.install_enable)) { 275 install_enable = invoker.install_enable 276 } 277 278 if (defined(invoker.module_install_dir)) { 279 module_install_dir = invoker.module_install_dir 280 } else { 281 module_install_dir = "${module_type}" 282 } 283 284 if (defined(invoker.symlink_target_name)) { 285 symlink_target_name = invoker.symlink_target_name 286 } 287 288 if (defined(invoker.relative_install_dir)) { 289 relative_install_dir = invoker.relative_install_dir 290 } 291 292 notice = "$target_out_dir/$_main_target_name.notice.txt" 293 } 294 295 _notice_target = "${target_name}_notice" 296 collect_notice(_notice_target) { 297 forward_variables_from(invoker, 298 [ 299 "license_as_sources", 300 "license_file", 301 ]) 302 module_name = _main_target_name 303 module_type = "app" 304 module_source_dir = get_label_info(":${_main_target_name}", "dir") 305 } 306 307 _compile_app_target = "${target_name}_compile_app" 308 compile_app(_compile_app_target) { 309 build_mode = _js_build_mode 310 cwd = _abs_path 311 unsigned_hap_path_list = _unsigned_hap_path_list 312 deps = [ ":$_notice_target" ] 313 if (defined(invoker.deps)) { 314 deps += invoker.deps 315 } 316 if (defined(invoker.system_lib_deps)) { 317 system_lib_deps = _system_lib_deps 318 deps += _system_lib_deps 319 } 320 if (defined(invoker.test_hap)) { 321 test_hap = invoker.test_hap 322 } 323 if (defined(invoker.test_module)) { 324 test_module = invoker.test_module 325 } 326 if (defined(invoker.module_libs_dir)) { 327 module_libs_dir = invoker.module_libs_dir 328 } 329 if (defined(invoker.sdk_home)) { 330 sdk_home = invoker.sdk_home 331 } else { 332 sdk_home = "//prebuilts/ohos-sdk/linux" 333 } 334 if (defined(invoker.sdk_type_name)) { 335 sdk_type_name = invoker.sdk_type_name 336 } 337 if (defined(invoker.build_modules)) { 338 build_modules = invoker.build_modules 339 } 340 if (defined(invoker.assemble_type)) { 341 assemble_type = invoker.assemble_type 342 } 343 if (defined(invoker.build_level)) { 344 build_level = invoker.build_level 345 } 346 } 347 app_sign(target_name) { 348 forward_variables_from(invoker, 349 [ 350 "private_key_path", 351 "signature_algorithm", 352 "certificate_profile", 353 "keystore_path", 354 "keystore_password", 355 "key_alias", 356 "certificate_file", 357 "compatible_version", 358 ]) 359 unsigned_hap_path_list = _unsigned_hap_path_list 360 deps = [ 361 ":$_compile_app_target", 362 ":$_module_info_target", 363 ] 364 hap_out_dir = _hap_out_dir 365 hap_name = _hap_name 366 install_module_info = { 367 module_def = get_label_info(":$target_name", "label_with_toolchain") 368 module_info_file = 369 rebase_path(get_label_info(module_def, "target_out_dir"), 370 root_build_dir) + "/${target_name}_module_info.json" 371 toolchain = current_toolchain 372 toolchain_out_dir = rebase_path(root_out_dir, root_build_dir) 373 part_name = _part_name 374 subsystem_name = _subsystem_name 375 } 376 } 377} 378 379# Declare an OHOS hap target 380# 381# Variables: 382# deps: dependencies of this target. 383# hap_name: name of output hap file. 384# final_hap_path: full path of output hap file, final_hap_path overwrites hap_name. 385# js2abc: whether to transform js bundle to ark bytecode, default value 386# follows build_ark. 387# ets2abc: whether to transform js bundle to ark bytecode, default value false 388# 389# 390template("ohos_hap") { 391 forward_variables_from(invoker, [ "testonly" ]) 392 assert(defined(invoker.hap_profile), 393 "hap_profile must be defined for ohos_hap") 394 395 _deps = [] 396 if (defined(invoker.deps)) { 397 _deps = invoker.deps 398 } 399 400 _hap_profile = invoker.hap_profile 401 _hap_name = target_name 402 if (defined(invoker.hap_name)) { 403 _hap_name = invoker.hap_name 404 } 405 406 _hap_path = "$target_out_dir/$_hap_name.hap" 407 if (defined(invoker.final_hap_path)) { 408 _hap_path = invoker.final_hap_path 409 } 410 411 _js2abc = build_ark 412 if (defined(invoker.js2abc)) { 413 _js2abc = invoker.js2abc 414 } 415 416 _ets2abc = false 417 if (defined(invoker.ets2abc)) { 418 _ets2abc = invoker.ets2abc 419 } 420 421 if (_ets2abc) { 422 _js2abc = false 423 } 424 425 _js_build_mode = "release" 426 if (defined(invoker.js_build_mode)) { 427 _js_build_mode = invoker.js_build_mode 428 } 429 430 _main_target_name = target_name 431 432 if (defined(invoker.subsystem_name) && defined(invoker.part_name)) { 433 _subsystem_name = invoker.subsystem_name 434 _part_name = invoker.part_name 435 } else if (defined(invoker.part_name)) { 436 _part_name = invoker.part_name 437 _part_subsystem_info_file = 438 "$root_build_dir/build_configs/parts_info/part_subsystem.json" 439 _arguments = [ 440 "--part-name", 441 _part_name, 442 "--part-subsystem-info-file", 443 rebase_path(_part_subsystem_info_file, root_build_dir), 444 ] 445 _get_subsystem_script = "//build/templates/common/get_subsystem_name.py" 446 _subsystem_name = 447 exec_script(_get_subsystem_script, _arguments, "trim string") 448 } else if (defined(invoker.subsystem_name)) { 449 _subsystem_name = invoker.subsystem_name 450 _part_name = _subsystem_name 451 } else { 452 _subsystem_name = "build" 453 _part_name = "build_framework" 454 } 455 456 assert(_subsystem_name != "") # Mark as used 457 assert(_part_name != "") # Mark as used 458 459 # metadata is used to record all necessary data for hap. 460 _metadata_target = "${target_name}__metadata" 461 _meta_data = "$target_gen_dir/$target_name.metadata" 462 write_meta_data(_metadata_target) { 463 forward_variables_from(invoker, 464 [ 465 "raw_assets", 466 "resources", 467 "js_assets", 468 "ets_assets", 469 ]) 470 hap_profile = invoker.hap_profile 471 meta_data = _meta_data 472 possible_deps = _deps 473 type = "hap" 474 js2abc = _js2abc 475 hap_path = _hap_path 476 } 477 478 _js_assets_target = "${target_name}__js_assets" 479 _packaged_js_assets = "$target_out_dir/$target_name/js_assets.zip" 480 compile_js_assets(_js_assets_target) { 481 hap_profile = _hap_profile 482 packaged_js_assets = _packaged_js_assets 483 meta_data = _meta_data 484 deps = [ ":$_metadata_target" ] + _deps 485 build_mode = _js_build_mode 486 js2abc = _js2abc 487 ets2abc = _ets2abc 488 if (defined(testonly) && testonly == true) { 489 main_target_name = _main_target_name 490 } 491 } 492 493 _resources_target = "${target_name}__compile_resources" 494 _packaged_resources = "$target_out_dir/$target_name/resources.zip" 495 _generated_header_dir = "$target_out_dir/$target_name" 496 compile_resources(_resources_target) { 497 hap_profile = _hap_profile 498 packaged_resources = _packaged_resources 499 generated_header_dir = _generated_header_dir 500 meta_data = _meta_data 501 deps = [ ":$_metadata_target" ] + _deps 502 } 503 504 _notice_target = "${target_name}__notice" 505 collect_notice(_notice_target) { 506 forward_variables_from(invoker, 507 [ 508 "license_as_sources", 509 "license_file", 510 ]) 511 module_type = "app" 512 module_name = _main_target_name 513 module_source_dir = get_label_info(":${_main_target_name}", "dir") 514 } 515 516 _module_info_target = "${_main_target_name}_info" 517 generate_module_info(_module_info_target) { 518 module_name = _main_target_name 519 module_type = "app" 520 521 module_source_dir = get_path_info(_hap_path, "dir") 522 module_install_name = get_path_info(_hap_path, "name") 523 if (defined(invoker.module_install_name)) { 524 module_install_name = invoker.module_install_name 525 } 526 527 module_install_images = [ "system" ] 528 if (defined(invoker.install_images)) { 529 module_install_images = [] 530 module_install_images += invoker.install_images 531 } 532 install_enable = true 533 if (defined(invoker.install_enable)) { 534 install_enable = invoker.install_enable 535 } 536 537 module_output_extension = ".hap" 538 539 module_install_dir = "${module_type}" 540 if (defined(invoker.module_install_dir)) { 541 module_install_dir = invoker.module_install_dir 542 } 543 544 if (defined(invoker.relative_install_dir)) { 545 relative_install_dir = invoker.relative_install_dir 546 } 547 548 if (defined(invoker.symlink_target_name)) { 549 symlink_target_name = invoker.symlink_target_name 550 } 551 notice = "$target_out_dir/$_main_target_name.notice.txt" 552 } 553 554 package_app(target_name) { 555 forward_variables_from(invoker, 556 [ 557 "shared_libraries", 558 "private_key_path", 559 "signature_algorithm", 560 "certificate_profile", 561 "keystore_path", 562 "keystore_password", 563 "key_alias", 564 "certificate_file", 565 "compatible_version", 566 ]) 567 deps = [ 568 ":$_js_assets_target", 569 ":$_metadata_target", 570 ":$_notice_target", 571 ":$_resources_target", 572 "//developtools/packing_tool:packing_tool", 573 ] 574 if (!skip_gen_module_info) { 575 deps += [ ":$_module_info_target" ] 576 } 577 enable_ark = build_ark 578 if (defined(shared_libraries)) { 579 deps += shared_libraries 580 } 581 packaged_js_assets = _packaged_js_assets 582 packaged_resources = _packaged_resources 583 hap_profile = _hap_profile 584 meta_data = _meta_data 585 hap_path = _hap_path 586 build_mode = _js_build_mode 587 588 install_module_info = { 589 module_def = get_label_info(":$target_name", "label_with_toolchain") 590 module_info_file = 591 rebase_path(get_label_info(module_def, "target_out_dir"), 592 root_build_dir) + "/${target_name}_module_info.json" 593 subsystem_name = _subsystem_name 594 part_name = _part_name 595 toolchain = current_toolchain 596 toolchain_out_dir = rebase_path(root_out_dir, root_build_dir) 597 } 598 } 599} 600