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 "//arkcompiler/ets_frontend/es2panda:es2panda_build($host_toolchain)", 310 ] 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_ets2bundle:ets_loader_ark_hap", 368 "//developtools/ace_js2bundle:ace_loader_ark_hap", 369 "//third_party/parse5:parse5_ark_hap", 370 "//third_party/weex-loader:weex_loader_ark_hap", 371 ] 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( 436 "//arkcompiler/ets_frontend/es2panda:es2panda_build($host_toolchain)", 437 "target_out_dir") 438 } 439 if (ets2abc) { 440 args += [ "--ets2abc" ] 441 } else if (js2abc) { 442 args += [ "--js2abc" ] 443 } 444 args += [ 445 "--ark-es2abc-dir", 446 rebase_path(_es2abc_dir, root_build_dir), 447 ] 448 } 449 450 if (defined(hap_profile)) { 451 inputs += [ hap_profile ] 452 } 453 } 454} 455 456template("app_sign") { 457 forward_variables_from(invoker, [ "testonly" ]) 458 sign_variables = [ 459 "deps", 460 "private_key_path", 461 "signature_algorithm", 462 "certificate_profile", 463 "keystore_password", 464 "key_alias", 465 "certificate_file", 466 "keystore_path", 467 "unsigned_hap_path_list", 468 "hap_out_dir", 469 "hap_name", 470 "install_module_info", 471 "compatible_version", 472 ] 473 if (defined(invoker.hap_list)) { 474 sign_variables += [ "hap_list" ] 475 } 476 action(target_name) { 477 forward_variables_from(invoker, sign_variables) 478 _sign_hap_py_path = "//build/scripts/app_sign.py" 479 if (defined(sign_hap_py_path) && defined(compatible_version)) { 480 _sign_hap_py_path = sign_hap_py_path 481 } 482 script = _sign_hap_py_path 483 _private_key_path = default_hap_private_key_path 484 if (defined(private_key_path)) { 485 _private_key_path = private_key_path 486 } 487 _key_alias = default_key_alias 488 if (defined(key_alias)) { 489 _key_alias = key_alias 490 } 491 _signature_algorithm = default_signature_algorithm 492 if (defined(signature_algorithm)) { 493 _signature_algorithm = signature_algorithm 494 } 495 _keystore_path = default_keystore_path 496 if (defined(keystore_path)) { 497 _keystore_path = keystore_path 498 } 499 _certificate_file = default_hap_certificate_file 500 if (defined(certificate_file)) { 501 _certificate_file = certificate_file 502 } 503 _keystore_password = default_keystore_password 504 if (defined(keystore_password)) { 505 _keystore_password = keystore_password 506 } 507 if (defined(certificate_profile)) { 508 _certificate_profile = certificate_profile 509 } 510 511 inputs = [ 512 hapsigner, 513 certificate_profile, 514 _keystore_path, 515 _certificate_file, 516 ] 517 518 outputs = [ "${target_out_dir}/${target_name}.stamp" ] 519 520 args = [ 521 "--keyPwd", 522 _private_key_path, 523 "--sign-algo", 524 _signature_algorithm, 525 "--profileFile", 526 rebase_path(_certificate_profile, root_build_dir), 527 "--keyalias", 528 _key_alias, 529 "--keystoreFile", 530 rebase_path(_keystore_path, root_build_dir), 531 "--keystorePwd", 532 _keystore_password, 533 "--certificate-file", 534 rebase_path(_certificate_file, root_build_dir), 535 "--hapsigner", 536 rebase_path(hapsigner, root_build_dir), 537 "--unsigned-hap-path-list", 538 rebase_path(unsigned_hap_path_list, root_build_dir), 539 "--hap-out-dir", 540 rebase_path(hap_out_dir, root_build_dir), 541 "--hap-name", 542 hap_name, 543 ] 544 if (defined(invoker.hap_list)) { 545 args += [ 546 "--hap-list", 547 rebase_path(hap_list, root_build_dir), 548 ] 549 } 550 551 if (defined(sign_hap_py_path)) { 552 if (defined(compatible_version)) { 553 _sign_compatible_version = compatible_version 554 args += [ 555 "--compatible_version", 556 _sign_compatible_version, 557 ] 558 } else { 559 _target_label = get_label_info(target_name, "label_no_toolchain") 560 print( 561 "warning: Please set compatible_version in ${_target_label} for remote sign") 562 } 563 } 564 565 if (defined(install_module_info)) { 566 metadata = { 567 install_modules = [ install_module_info ] 568 } 569 } 570 } 571} 572 573template("compile_app") { 574 forward_variables_from(invoker, [ "testonly" ]) 575 nodejs_version = "v16.20.2" 576 if (host_os == "mac") { 577 _nodejs = "//prebuilts/build-tools/common/nodejs/node-${nodejs_version}-darwin-x64/bin/node" 578 } else if (host_os == "linux" && host_os == "arm64") { 579 _nodejs = "//prebuilts/build-tools/common/nodejs/node-${nodejs_version}-linux-aarch64/bin/node" 580 } else { 581 _nodejs = "//prebuilts/build-tools/common/nodejs/node-${nodejs_version}-${host_os}-x64/bin/node" 582 } 583 action(target_name) { 584 forward_variables_from(invoker, 585 [ 586 "deps", 587 "cwd", 588 "build_mode", 589 "build_profile", 590 "app_profile", 591 "hap_profile", 592 "build_level", 593 "assemble_type", 594 "sdk_home", 595 "unsigned_hap_path_list", 596 "system_lib_deps", 597 "hap_out_dir", 598 "hap_name", 599 "install_module_info", 600 "test_hap", 601 "test_module", 602 "module_libs_dir", 603 "sdk_type_name", 604 "build_modules", 605 "hvigor_home", 606 ]) 607 script = "//build/scripts/compile_app.py" 608 outputs = [ unsigned_hap_path_list ] 609 610 args = [ 611 "--nodejs", 612 rebase_path(_nodejs, root_build_dir), 613 "--cwd", 614 rebase_path(cwd, root_build_dir), 615 "--build-profile", 616 rebase_path(build_profile, root_build_dir), 617 "--sdk-home", 618 rebase_path(sdk_home), 619 "--output-file", 620 rebase_path(unsigned_hap_path_list, root_build_dir), 621 "--ohpm-registry", 622 ohpm_registry, 623 ] 624 625 if (defined(hvigor_home) && hvigor_home != "") { 626 args += [ 627 "--hvigor-home", 628 rebase_path(hvigor_home, root_build_dir), 629 ] 630 } 631 632 if (defined(build_mode) && build_mode == "debug") { 633 args += [ "--enable-debug" ] 634 } 635 636 if (defined(test_hap) && test_hap) { 637 args += [ "--test-hap" ] 638 } 639 640 if (defined(test_module) && test_module != "") { 641 args += [ 642 "--test-module", 643 test_module, 644 ] 645 } 646 if (defined(module_libs_dir) && module_libs_dir != "") { 647 args += [ 648 "--module-libs-dir", 649 module_libs_dir, 650 ] 651 } 652 if (defined(build_level) && build_level != "") { 653 args += [ 654 "--build-level", 655 build_level, 656 ] 657 } 658 if (defined(assemble_type) && assemble_type != "") { 659 args += [ 660 "--assemble-type", 661 assemble_type, 662 ] 663 } 664 if (defined(system_lib_deps)) { 665 args += [ "--system-lib-module-info-list" ] 666 foreach(_lib_deps, system_lib_deps) { 667 _lib_out_name = get_label_info(_lib_deps, "name") 668 _lib_out_dir = get_label_info(_lib_deps, "target_out_dir") 669 args += 670 [ rebase_path("${_lib_out_dir}/${_lib_out_name}_module_info.json", 671 root_build_dir) ] 672 } 673 674 if (is_ohos) { 675 args += [ 676 "--ohos-app-abi", 677 ohos_app_abi, 678 ] 679 } 680 } 681 if (defined(sdk_type_name) && sdk_type_name != []) { 682 args += [ "--sdk-type-name" ] 683 args += sdk_type_name 684 } 685 if (defined(build_modules) && build_modules != []) { 686 args += [ "--build-modules" ] 687 args += build_modules 688 } 689 if (use_hvigor_cache) { 690 args += [ "--use-hvigor-cache" ] 691 } 692 if (hvigor_obfuscation) { 693 args += [ "--hvigor-obfuscation" ] 694 } 695 if (defined(install_module_info)) { 696 metadata = { 697 install_modules = [ install_module_info ] 698 } 699 } 700 if (defined(target_app_dir) && target_app_dir != "") { 701 args += [ 702 "--target-out-dir", 703 rebase_path(root_out_dir), 704 "--target-app-dir", 705 target_app_dir, 706 ] 707 } 708 if (ohos_app_enable_asan) { 709 args += [ "--ohos-app-enable-asan" ] 710 } else if (ohos_app_enable_tsan) { 711 args += [ "--ohos-app-enable-tsan" ] 712 } else if (ohos_app_enable_ubsan) { 713 args += [ "--ohos-app-enable-ubsan" ] 714 } 715 } 716} 717