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_var.gni") 16import("//build/templates/metadata/module_info.gni") 17 18if (is_ohos) { 19 import("//build/config/ohos/abi.gni") 20} 21 22template("merge_profile") { 23 forward_variables_from(invoker, [ "testonly" ]) 24 assert(defined(invoker.hap_profile), 25 "hap_profile must be defined for compile_resources") 26 action(target_name) { 27 forward_variables_from(invoker, 28 [ 29 "meta_data", 30 "hap_profile", 31 "generated_profile", 32 "deps", 33 ]) 34 script = "//build/scripts/merge_profile.py" 35 depfile = "$target_gen_dir/$target_name.d" 36 37 _rebased_metadata = rebase_path(meta_data, root_build_dir) 38 inputs = [ 39 meta_data, 40 hap_profile, 41 ] 42 args = [ 43 "--resources-dir=@FileArg($_rebased_metadata:root:resources)", 44 "--depfile", 45 rebase_path(depfile, root_build_dir), 46 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 47 "--hap-profile", 48 rebase_path(hap_profile, root_build_dir), 49 "--generated-profile", 50 rebase_path(generated_profile, root_build_dir), 51 "--release-type", 52 release_type, 53 "--api-version", 54 api_version, 55 ] 56 outputs = [ generated_profile ] 57 } 58} 59 60template("compile_resources") { 61 forward_variables_from(invoker, [ "testonly" ]) 62 assert(defined(invoker.hap_profile), 63 "hap_profile must be defined for compile_resources") 64 assert( 65 defined(invoker.packaged_resources) || 66 defined(invoker.generated_header_dir), 67 "hap_profile or generated_header_dir must be defined for compile_resources") 68 _generate_resource = defined(invoker.packaged_resources) 69 if (_generate_resource) { 70 _packaged_resources = invoker.packaged_resources 71 } 72 _generate_header = defined(invoker.generated_header_dir) 73 if (_generate_header) { 74 _generated_header_file = invoker.generated_header_dir + "/ResourceTable.h" 75 } 76 action_with_pydeps(target_name) { 77 forward_variables_from(invoker, 78 [ 79 "meta_data", 80 "hap_profile", 81 "deps", 82 ]) 83 script = "//build/scripts/compile_resources.py" 84 depfile = "$target_gen_dir/$target_name.d" 85 if (ohos_indep_compiler_enable) { 86 restool_path = "${prebuilts_sdk_dir}/toolchains/restool" 87 } else { 88 if (defined(deps)) { 89 deps += [ 90 "//developtools/global_resource_tool:restool($host_toolchain)", 91 "//developtools/global_resource_tool:restool_id_defined($host_toolchain)", 92 ] 93 } else { 94 deps = [ 95 "//developtools/global_resource_tool:restool($host_toolchain)", 96 "//developtools/global_resource_tool:restool_id_defined($host_toolchain)", 97 ] 98 } 99 restool_path = 100 get_label_info( 101 "//developtools/global_resource_tool:restool($host_toolchain)", 102 "root_out_dir") + "/developtools/global_resource_tool/restool" 103 } 104 _rebased_metadata = rebase_path(meta_data, root_build_dir) 105 inputs = [ 106 meta_data, 107 restool_path, 108 hap_profile, 109 ] 110 args = [ 111 "--resources-dir=@FileArg($_rebased_metadata:root:resources)", 112 "--depfile", 113 rebase_path(depfile, root_build_dir), 114 "--restool-path", 115 rebase_path(restool_path, root_build_dir), 116 "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)", 117 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 118 ] 119 outputs = [] 120 if (_generate_resource) { 121 outputs += [ _packaged_resources ] 122 args += [ 123 "--output-resources-zipfile", 124 rebase_path(_packaged_resources, root_build_dir), 125 ] 126 } 127 if (_generate_header) { 128 outputs += [ _generated_header_file ] 129 args += [ 130 "--output-header-file", 131 rebase_path(_generated_header_file, root_build_dir), 132 ] 133 } 134 } 135} 136 137template("package_app") { 138 forward_variables_from(invoker, [ "testonly" ]) 139 assert(defined(invoker.hap_profile), 140 "hap_profile must be defined for $target_name") 141 assert(defined(invoker.hap_path), "hap_path must be defined for $target_name") 142 action_with_pydeps(target_name) { 143 forward_variables_from(invoker, 144 [ 145 "deps", 146 "external_deps", 147 "shared_libraries", 148 "hap_profile", 149 "hap_path", 150 "packaged_resources", 151 "packaged_js_assets", 152 "meta_data", 153 "private_key_path", 154 "signature_algorithm", 155 "certificate_profile", 156 "keystore_path", 157 "keystore_password", 158 "key_alias", 159 "certificate_file", 160 "install_module_info", 161 "enable_ark", 162 "build_mode", 163 "compatible_version", 164 ]) 165 script = "//build/scripts/hapbuilder.py" 166 depfile = "$target_gen_dir/$target_name.d" 167 _rebased_metadata = rebase_path(meta_data, root_build_dir) 168 outputs = [ hap_path ] 169 args = [ 170 "--depfile", 171 rebase_path(depfile, root_build_dir), 172 "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)", 173 "--hapsigner", 174 rebase_path(hapsigner, root_build_dir), 175 "--hap-packing-tool", 176 rebase_path(hap_packing_tool, root_build_dir), 177 "--hap-path", 178 rebase_path(hap_path, root_build_dir), 179 "--packaged-resources", 180 rebase_path(packaged_resources, root_build_dir), 181 "--packaged-js-assets", 182 rebase_path(packaged_js_assets, root_build_dir), 183 "--assets=@FileArg($_rebased_metadata:root:assets)", 184 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 185 "--build-mode", 186 build_mode, 187 ] 188 189 inputs = [ 190 hap_profile, 191 hapsigner, 192 hap_packing_tool, 193 packaged_js_assets, 194 packaged_resources, 195 meta_data, 196 ] 197 198 _private_key_path = default_hap_private_key_path 199 if (defined(private_key_path)) { 200 _private_key_path = private_key_path 201 } 202 _signature_algorithm = default_signature_algorithm 203 if (defined(signature_algorithm)) { 204 _signature_algorithm = signature_algorithm 205 } 206 _key_alias = default_key_alias 207 if (defined(key_alias)) { 208 _key_alias = key_alias 209 } 210 _keystore_path = default_keystore_path 211 if (defined(keystore_path)) { 212 _keystore_path = keystore_path 213 } 214 _keystore_password = default_keystore_password 215 if (defined(keystore_password)) { 216 _keystore_password = keystore_password 217 } 218 _certificate_file = default_hap_certificate_file 219 if (defined(certificate_file)) { 220 _certificate_file = certificate_file 221 } 222 223 inputs += [ 224 certificate_profile, 225 _keystore_path, 226 _certificate_file, 227 ] 228 _sign_hap_py_path = "//build/scripts/app_sign.py" 229 if (defined(sign_hap_py_path) && defined(compatible_version)) { 230 _sign_hap_py_path = sign_hap_py_path 231 } 232 233 args += [ 234 "--sign_hap_py_path", 235 rebase_path(_sign_hap_py_path), 236 ] 237 if (defined(sign_hap_py_path)) { 238 if (defined(compatible_version)) { 239 _sign_compatible_version = compatible_version 240 args += [ 241 "--sign_compatible_version", 242 _sign_compatible_version, 243 ] 244 } else { 245 _target_label = get_label_info(target_name, "label_no_toolchain") 246 print( 247 "warning: Please set compatible_version in ${_target_label} for remote sign") 248 } 249 } 250 args += [ 251 "--private-key-path", 252 _private_key_path, 253 "--sign-algo", 254 _signature_algorithm, 255 "--certificate-profile", 256 rebase_path(certificate_profile, root_build_dir), 257 "--keyalias", 258 _key_alias, 259 "--keystore-path", 260 rebase_path(_keystore_path, root_build_dir), 261 "--keystorepasswd", 262 _keystore_password, 263 "--certificate-file", 264 rebase_path(_certificate_file, root_build_dir), 265 ] 266 267 if (defined(shared_libraries)) { 268 foreach(lib, shared_libraries) { 269 _module_info = get_label_info(lib, "target_out_dir") + "/" + 270 get_label_info(lib, "name") + "_module_info.json" 271 _rebased_module_info = rebase_path(_module_info, root_build_dir) 272 args += [ "--dso=@FileArg($_rebased_module_info:source)" ] 273 } 274 if (is_ohos) { 275 args += [ 276 "--ohos-app-abi", 277 ohos_app_abi, 278 ] 279 } 280 } 281 282 if (defined(external_deps)) { 283 foreach(lib, external_deps) { 284 _module_info = get_label_info(lib, "target_out_dir") + "/" + 285 get_label_info(lib, "name") + "_module_info.json" 286 _rebased_module_info = rebase_path(_module_info, root_build_dir) 287 args += [ "--dso=@FileArg($_rebased_module_info:source)" ] 288 } 289 if (is_ohos) { 290 args += [ 291 "--ohos-app-abi", 292 ohos_app_abi, 293 ] 294 } 295 } 296 297 if (defined(install_module_info)) { 298 metadata = { 299 install_modules = [ install_module_info ] 300 } 301 } 302 if (defined(enable_ark) && enable_ark) { 303 if (ohos_indep_compiler_enable) { 304 _js2abc_js = 305 "${prebuilts_sdk_dir}/ets/build-tools/ets-loader/bin/ark/ts2abc.js" 306 } else { 307 _ark_deps = [ 308 "//arkcompiler/ets_frontend/es2panda:es2abc_js_file($host_toolchain)", 309 ] 310 external_deps = [ "ets_frontend:es2panda($host_toolchain)" ] 311 if (defined(deps)) { 312 deps += _ark_deps 313 } else { 314 deps = _ark_deps 315 } 316 _js2abc_js = get_label_info( 317 "//arkcompiler/ets_frontend/es2panda:es2abc_js_file($host_toolchain)", 318 "target_out_dir") + "/ts2abc.js" 319 } 320 args += [ 321 "--nodejs-path", 322 rebase_path(nodejs, root_build_dir), 323 "--js2abc-js", 324 rebase_path(_js2abc_js, root_build_dir), 325 "--enable-ark", 326 ] 327 inputs += [ 328 nodejs, 329 _js2abc_js, 330 ] 331 } 332 } 333} 334 335template("compile_js_assets") { 336 forward_variables_from(invoker, [ "testonly" ]) 337 assert(defined(invoker.meta_data) && defined(invoker.packaged_js_assets), 338 "meta_data and packaged_js_assets must be for compile_js_assets") 339 340 _packaged_js_assets = invoker.packaged_js_assets 341 action_with_pydeps(target_name) { 342 forward_variables_from(invoker, 343 [ 344 "deps", 345 "meta_data", 346 "hap_profile", 347 "build_mode", 348 "js2abc", 349 "ets2abc", 350 "main_target_name", 351 ]) 352 script = "//build/scripts/build_js_assets.py" 353 depfile = "$target_gen_dir/$target_name.d" 354 outputs = [ _packaged_js_assets ] 355 356 _rebased_metadata = rebase_path(meta_data, root_build_dir) 357 358 if (!defined(deps)) { 359 deps = [] 360 } 361 if (ohos_indep_compiler_enable) { 362 _ace_loader_home = "${prebuilts_sdk_dir}/js/build-tools/ace-loader" 363 _ets_loader_home = "${prebuilts_sdk_dir}/ets/build-tools/ets-loader/" 364 } else { 365 deps += [ 366 "//arkcompiler/ets_frontend/es2panda:build_es2abc_for_hap($host_toolchain)", 367 "//developtools/ace_js2bundle:ace_loader_ark_hap", 368 "//third_party/parse5:parse5_ark_hap", 369 "//third_party/weex-loader:weex_loader_ark_hap", 370 ] 371 external_deps = [ "ace_ets2bundle:ets_loader_ark_hap" ] 372 _ace_loader_home = 373 get_label_info("//developtools/ace_js2bundle:ace_loader_node_modules", 374 "target_out_dir") + "/ace_loader_ark" 375 _ets_loader_home = 376 get_label_info( 377 "//developtools/ace_ets2bundle:ets_loader_node_modules", 378 "target_out_dir") + "/ets_loader_ark" 379 } 380 381 _webpack_config_js = "${_ace_loader_home}/webpack.rich.config.js" 382 _webpack_config_ets = "${_ets_loader_home}/webpack.config.js" 383 _webpack_js = "${_ace_loader_home}/node_modules/webpack/bin/webpack.js" 384 _webpack_ets = "${_ets_loader_home}/node_modules/webpack/bin/webpack.js" 385 _manifest_file_path = "${target_gen_dir}/manifest_file" 386 387 inputs = [ 388 meta_data, 389 nodejs, 390 ] 391 392 args = [ 393 "--js-assets-dir=@FileArg($_rebased_metadata:root:js_assets)", 394 "--ets-assets-dir=@FileArg($_rebased_metadata:root:ets_assets)", 395 "--js-forms-dir=@FileArg($_rebased_metadata:root:js_forms)", 396 "--testrunner-dir=@FileArg($_rebased_metadata:root:testrunner)", 397 "--output", 398 rebase_path(_packaged_js_assets, root_build_dir), 399 "--depfile", 400 rebase_path(depfile, root_build_dir), 401 "--nodejs-path", 402 rebase_path(nodejs, root_build_dir), 403 "--webpack-js", 404 rebase_path(_webpack_js, root_build_dir), 405 "--webpack-ets", 406 rebase_path(_webpack_ets, root_build_dir), 407 "--webpack-config-js", 408 rebase_path(_webpack_config_js, root_build_dir), 409 "--webpack-config-ets", 410 rebase_path(_webpack_config_ets, root_build_dir), 411 "--build-mode", 412 build_mode, 413 "--ace-loader-home", 414 rebase_path(_ace_loader_home, root_build_dir), 415 "--ets-loader-home", 416 rebase_path(_ets_loader_home, root_build_dir), 417 "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)", 418 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 419 "--manifest-file-path", 420 rebase_path(_manifest_file_path, root_build_dir), 421 ] 422 if (defined(testonly) && testonly == true) { 423 _js_sources_file = target_gen_dir + "/$main_target_name.sources" 424 args += [ 425 "--js-sources-file", 426 rebase_path(_js_sources_file, root_build_dir), 427 ] 428 outputs += [ _js_sources_file ] 429 } 430 431 if (js2abc || ets2abc) { 432 if (ohos_indep_compiler_enable) { 433 _es2abc_dir = "${prebuilts_sdk_dir}/js/build-tools/ace-loader/bin/ark" 434 } else { 435 _es2abc_dir = get_label_info("ets_frontend:es2panda($host_toolchain)", 436 "target_out_dir") 437 } 438 if (ets2abc) { 439 args += [ "--ets2abc" ] 440 } else if (js2abc) { 441 args += [ "--js2abc" ] 442 } 443 args += [ 444 "--ark-es2abc-dir", 445 rebase_path(_es2abc_dir, root_build_dir), 446 ] 447 } 448 449 if (defined(hap_profile)) { 450 inputs += [ hap_profile ] 451 } 452 } 453} 454 455template("app_sign") { 456 forward_variables_from(invoker, [ "testonly" ]) 457 sign_variables = [ 458 "deps", 459 "private_key_path", 460 "signature_algorithm", 461 "certificate_profile", 462 "keystore_password", 463 "key_alias", 464 "certificate_file", 465 "keystore_path", 466 "unsigned_hap_path_list", 467 "hap_out_dir", 468 "hap_name", 469 "install_module_info", 470 "compatible_version", 471 ] 472 if (defined(invoker.hap_list)) { 473 sign_variables += [ "hap_list" ] 474 } 475 action(target_name) { 476 forward_variables_from(invoker, sign_variables) 477 _sign_hap_py_path = "//build/scripts/app_sign.py" 478 if (defined(sign_hap_py_path) && defined(compatible_version)) { 479 _sign_hap_py_path = sign_hap_py_path 480 } 481 script = _sign_hap_py_path 482 _private_key_path = default_hap_private_key_path 483 if (defined(private_key_path)) { 484 _private_key_path = private_key_path 485 } 486 _key_alias = default_key_alias 487 if (defined(key_alias)) { 488 _key_alias = key_alias 489 } 490 _signature_algorithm = default_signature_algorithm 491 if (defined(signature_algorithm)) { 492 _signature_algorithm = signature_algorithm 493 } 494 _keystore_path = default_keystore_path 495 if (defined(keystore_path)) { 496 _keystore_path = keystore_path 497 } 498 _certificate_file = default_hap_certificate_file 499 if (defined(certificate_file)) { 500 _certificate_file = certificate_file 501 } 502 _keystore_password = default_keystore_password 503 if (defined(keystore_password)) { 504 _keystore_password = keystore_password 505 } 506 if (defined(certificate_profile)) { 507 _certificate_profile = certificate_profile 508 } 509 510 inputs = [ 511 hapsigner, 512 certificate_profile, 513 _keystore_path, 514 _certificate_file, 515 ] 516 517 outputs = [ "${target_out_dir}/${target_name}.stamp" ] 518 519 args = [ 520 "--keyPwd", 521 _private_key_path, 522 "--sign-algo", 523 _signature_algorithm, 524 "--profileFile", 525 rebase_path(_certificate_profile, root_build_dir), 526 "--keyalias", 527 _key_alias, 528 "--keystoreFile", 529 rebase_path(_keystore_path, root_build_dir), 530 "--keystorePwd", 531 _keystore_password, 532 "--certificate-file", 533 rebase_path(_certificate_file, root_build_dir), 534 "--hapsigner", 535 rebase_path(hapsigner, root_build_dir), 536 "--unsigned-hap-path-list", 537 rebase_path(unsigned_hap_path_list, root_build_dir), 538 "--hap-out-dir", 539 rebase_path(hap_out_dir, root_build_dir), 540 "--hap-name", 541 hap_name, 542 ] 543 if (defined(invoker.hap_list)) { 544 args += [ 545 "--hap-list", 546 rebase_path(hap_list, root_build_dir), 547 ] 548 } 549 550 if (defined(sign_hap_py_path)) { 551 if (defined(compatible_version)) { 552 _sign_compatible_version = compatible_version 553 args += [ 554 "--compatible_version", 555 _sign_compatible_version, 556 ] 557 } else { 558 _target_label = get_label_info(target_name, "label_no_toolchain") 559 print( 560 "warning: Please set compatible_version in ${_target_label} for remote sign") 561 } 562 } 563 564 if (defined(install_module_info)) { 565 metadata = { 566 install_modules = [ install_module_info ] 567 } 568 } 569 } 570} 571 572template("compile_app") { 573 forward_variables_from(invoker, 574 [ 575 "testonly", 576 "nodejs_path", 577 ]) 578 if (defined(nodejs_path) && nodejs_path != "") { 579 _nodejs = nodejs_path 580 } else { 581 if (host_os == "mac") { 582 _nodejs = "//prebuilts/build-tools/common/nodejs/node-${default_hvigor_nodejs_version}-darwin-x64/bin/node" 583 } else if (host_os == "linux" && host_os == "arm64") { 584 _nodejs = "//prebuilts/build-tools/common/nodejs/node-${default_hvigor_nodejs_version}-linux-aarch64/bin/node" 585 } else { 586 _nodejs = "//prebuilts/build-tools/common/nodejs/node-${default_hvigor_nodejs_version}-${host_os}-x64/bin/node" 587 } 588 } 589 590 action(target_name) { 591 forward_variables_from(invoker, 592 [ 593 "deps", 594 "cwd", 595 "build_mode", 596 "build_profile", 597 "app_profile", 598 "hap_profile", 599 "build_level", 600 "assemble_type", 601 "sdk_home", 602 "unsigned_hap_path_list", 603 "system_lib_deps", 604 "hap_out_dir", 605 "hap_name", 606 "install_module_info", 607 "test_hap", 608 "test_module", 609 "module_libs_dir", 610 "sdk_type_name", 611 "build_modules", 612 "hvigor_home", 613 "product", 614 "module_target", 615 "modules_filter", 616 "ohos_test_coverage", 617 ]) 618 script = "//build/scripts/compile_app.py" 619 outputs = [ unsigned_hap_path_list ] 620 621 args = [ 622 "--nodejs", 623 rebase_path(_nodejs, root_build_dir), 624 "--cwd", 625 rebase_path(cwd, root_build_dir), 626 "--build-profile", 627 rebase_path(build_profile, root_build_dir), 628 "--sdk-home", 629 rebase_path(sdk_home), 630 "--output-file", 631 rebase_path(unsigned_hap_path_list, root_build_dir), 632 "--ohpm-registry", 633 ohpm_registry, 634 "--product", 635 product, 636 "--module-target", 637 module_target, 638 ] 639 640 if (defined(modules_filter) && modules_filter) { 641 args += [ "--modules-filter" ] 642 } 643 644 if (defined(ohos_test_coverage) && ohos_test_coverage) { 645 args += [ "--ohos-test-coverage" ] 646 } 647 648 if (defined(hvigor_home) && hvigor_home != "") { 649 args += [ 650 "--hvigor-home", 651 rebase_path(hvigor_home, root_build_dir), 652 ] 653 } 654 655 if (defined(build_mode) && build_mode == "debug") { 656 args += [ "--enable-debug" ] 657 } 658 659 if (defined(test_hap) && test_hap) { 660 args += [ "--test-hap" ] 661 } 662 663 if (defined(test_module) && test_module != "") { 664 args += [ 665 "--test-module", 666 test_module, 667 ] 668 } 669 if (defined(module_libs_dir) && module_libs_dir != "") { 670 args += [ 671 "--module-libs-dir", 672 module_libs_dir, 673 ] 674 } 675 if (defined(build_level) && build_level != "") { 676 args += [ 677 "--build-level", 678 build_level, 679 ] 680 } 681 if (defined(assemble_type) && assemble_type != "") { 682 args += [ 683 "--assemble-type", 684 assemble_type, 685 ] 686 } 687 if (defined(system_lib_deps)) { 688 args += [ "--system-lib-module-info-list" ] 689 foreach(_lib_deps, system_lib_deps) { 690 _lib_out_name = get_label_info(_lib_deps, "name") 691 _lib_out_dir = get_label_info(_lib_deps, "target_out_dir") 692 args += 693 [ rebase_path("${_lib_out_dir}/${_lib_out_name}_module_info.json", 694 root_build_dir) ] 695 } 696 697 if (is_ohos) { 698 args += [ 699 "--ohos-app-abi", 700 ohos_app_abi, 701 ] 702 } 703 } 704 if (defined(sdk_type_name) && sdk_type_name != []) { 705 args += [ "--sdk-type-name" ] 706 args += sdk_type_name 707 } 708 if (defined(build_modules) && build_modules != []) { 709 args += [ "--build-modules" ] 710 args += build_modules 711 } 712 if (use_hvigor_cache) { 713 args += [ "--use-hvigor-cache" ] 714 } 715 if (hvigor_obfuscation) { 716 args += [ "--hvigor-obfuscation" ] 717 } 718 if (defined(install_module_info)) { 719 metadata = { 720 install_modules = [ install_module_info ] 721 } 722 } 723 if (defined(target_app_dir) && target_app_dir != "") { 724 args += [ 725 "--target-out-dir", 726 rebase_path(root_out_dir), 727 "--target-app-dir", 728 target_app_dir, 729 ] 730 } 731 if (ohos_app_enable_asan) { 732 args += [ "--ohos-app-enable-asan" ] 733 } else if (ohos_app_enable_tsan) { 734 args += [ "--ohos-app-enable-tsan" ] 735 } else if (ohos_app_enable_ubsan) { 736 args += [ "--ohos-app-enable-ubsan" ] 737 } 738 } 739} 740