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 ] 54 outputs = [ generated_profile ] 55 } 56} 57 58template("compile_resources") { 59 forward_variables_from(invoker, [ "testonly" ]) 60 assert(defined(invoker.hap_profile), 61 "hap_profile must be defined for compile_resources") 62 assert( 63 defined(invoker.packaged_resources) || 64 defined(invoker.generated_header_dir), 65 "hap_profile or generated_header_dir must be defined for compile_resources") 66 _generate_resource = defined(invoker.packaged_resources) 67 if (_generate_resource) { 68 _packaged_resources = invoker.packaged_resources 69 } 70 _generate_header = defined(invoker.generated_header_dir) 71 if (_generate_header) { 72 _generated_header_file = invoker.generated_header_dir + "/ResourceTable.h" 73 } 74 action_with_pydeps(target_name) { 75 forward_variables_from(invoker, 76 [ 77 "meta_data", 78 "hap_profile", 79 "deps", 80 ]) 81 script = "//build/scripts/compile_resources.py" 82 depfile = "$target_gen_dir/$target_name.d" 83 if (defined(deps)) { 84 deps += [ 85 "//developtools/global_resource_tool:restool($host_toolchain)", 86 "//developtools/global_resource_tool:restool_id_defined($host_toolchain)", 87 ] 88 } else { 89 deps = [ 90 "//developtools/global_resource_tool:restool($host_toolchain)", 91 "//developtools/global_resource_tool:restool_id_defined($host_toolchain)", 92 ] 93 } 94 restool_path = 95 get_label_info( 96 "//developtools/global_resource_tool:restool($host_toolchain)", 97 "root_out_dir") + "/developtools/global_resource_tool/restool" 98 _rebased_metadata = rebase_path(meta_data, root_build_dir) 99 inputs = [ 100 meta_data, 101 restool_path, 102 hap_profile, 103 ] 104 args = [ 105 "--resources-dir=@FileArg($_rebased_metadata:root:resources)", 106 "--depfile", 107 rebase_path(depfile, root_build_dir), 108 "--restool-path", 109 rebase_path(restool_path, root_build_dir), 110 "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)", 111 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 112 ] 113 outputs = [] 114 if (_generate_resource) { 115 outputs += [ _packaged_resources ] 116 args += [ 117 "--output-resources-zipfile", 118 rebase_path(_packaged_resources, root_build_dir), 119 ] 120 } 121 if (_generate_header) { 122 outputs += [ _generated_header_file ] 123 args += [ 124 "--output-header-file", 125 rebase_path(_generated_header_file, root_build_dir), 126 ] 127 } 128 } 129} 130 131template("package_app") { 132 forward_variables_from(invoker, [ "testonly" ]) 133 assert(defined(invoker.hap_profile), 134 "hap_profile must be defined for $target_name") 135 assert(defined(invoker.hap_path), "hap_path must be defined for $target_name") 136 action_with_pydeps(target_name) { 137 forward_variables_from(invoker, 138 [ 139 "deps", 140 "shared_libraries", 141 "hap_profile", 142 "hap_path", 143 "packaged_resources", 144 "packaged_js_assets", 145 "meta_data", 146 "private_key_path", 147 "signature_algorithm", 148 "certificate_profile", 149 "keystore_path", 150 "keystore_password", 151 "key_alias", 152 "certificate_file", 153 "install_module_info", 154 "enable_ark", 155 "build_mode", 156 "compatible_version", 157 ]) 158 script = "//build/scripts/hapbuilder.py" 159 depfile = "$target_gen_dir/$target_name.d" 160 _rebased_metadata = rebase_path(meta_data, root_build_dir) 161 outputs = [ hap_path ] 162 args = [ 163 "--depfile", 164 rebase_path(depfile, root_build_dir), 165 "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)", 166 "--hapsigner", 167 rebase_path(hapsigner, root_build_dir), 168 "--hap-packing-tool", 169 rebase_path(hap_packing_tool, root_build_dir), 170 "--hap-path", 171 rebase_path(hap_path, root_build_dir), 172 "--packaged-resources", 173 rebase_path(packaged_resources, root_build_dir), 174 "--packaged-js-assets", 175 rebase_path(packaged_js_assets, root_build_dir), 176 "--assets=@FileArg($_rebased_metadata:root:assets)", 177 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 178 "--build-mode", 179 build_mode, 180 ] 181 182 inputs = [ 183 hap_profile, 184 hapsigner, 185 hap_packing_tool, 186 packaged_js_assets, 187 packaged_resources, 188 meta_data, 189 ] 190 191 _private_key_path = default_hap_private_key_path 192 if (defined(private_key_path)) { 193 _private_key_path = private_key_path 194 } 195 _signature_algorithm = default_signature_algorithm 196 if (defined(signature_algorithm)) { 197 _signature_algorithm = signature_algorithm 198 } 199 _key_alias = default_key_alias 200 if (defined(key_alias)) { 201 _key_alias = key_alias 202 } 203 _keystore_path = default_keystore_path 204 if (defined(keystore_path)) { 205 _keystore_path = keystore_path 206 } 207 _keystore_password = default_keystore_password 208 if (defined(keystore_password)) { 209 _keystore_password = keystore_password 210 } 211 _certificate_file = default_hap_certificate_file 212 if (defined(certificate_file)) { 213 _certificate_file = certificate_file 214 } 215 216 inputs += [ 217 certificate_profile, 218 _keystore_path, 219 _certificate_file, 220 ] 221 _sign_hap_py_path = "//build/scripts/app_sign.py" 222 if (defined(sign_hap_py_path)) { 223 _sign_hap_py_path = sign_hap_py_path 224 } 225 args += [ 226 "--sign_hap_py_path", 227 rebase_path(_sign_hap_py_path), 228 ] 229 if (defined(compatible_version)) { 230 _sign_compatible_version = compatible_version 231 print("INFO: Set para compatible_version for remote sign app, ", 232 target_name, 233 " value is ", 234 _sign_compatible_version) 235 args += [ 236 "--sign_compatible_version", 237 _sign_compatible_version, 238 ] 239 } else if (defined(sign_hap_py_path)) { 240 print( 241 "warning: Please set compatible_version for remote sign app!!! target_name: ", 242 target_name) 243 } 244 args += [ 245 "--private-key-path", 246 _private_key_path, 247 "--sign-algo", 248 _signature_algorithm, 249 "--certificate-profile", 250 rebase_path(certificate_profile, root_build_dir), 251 "--keyalias", 252 _key_alias, 253 "--keystore-path", 254 rebase_path(_keystore_path, root_build_dir), 255 "--keystorepasswd", 256 _keystore_password, 257 "--certificate-file", 258 rebase_path(_certificate_file, root_build_dir), 259 ] 260 261 if (defined(shared_libraries)) { 262 foreach(lib, shared_libraries) { 263 _module_info = get_label_info(lib, "target_out_dir") + "/" + 264 get_label_info(lib, "name") + "_module_info.json" 265 _rebased_module_info = rebase_path(_module_info, root_build_dir) 266 args += [ "--dso=@FileArg($_rebased_module_info:source)" ] 267 } 268 if (is_ohos) { 269 args += [ 270 "--ohos-app-abi", 271 ohos_app_abi, 272 ] 273 } 274 } 275 276 if (defined(install_module_info)) { 277 metadata = { 278 install_modules = [ install_module_info ] 279 } 280 } 281 if (defined(enable_ark) && enable_ark) { 282 _ark_deps = [ 283 "//arkcompiler/ets_frontend/es2panda:es2abc_js_file($host_toolchain)", 284 "//arkcompiler/ets_frontend/es2panda:es2panda_build($host_toolchain)", 285 ] 286 if (defined(deps)) { 287 deps += _ark_deps 288 } else { 289 deps = _ark_deps 290 } 291 _js2abc_js = get_label_info( 292 "//arkcompiler/ets_frontend/es2panda:es2abc_js_file($host_toolchain)", 293 "target_out_dir") + "/ts2abc.js" 294 args += [ 295 "--nodejs-path", 296 rebase_path(nodejs, root_build_dir), 297 "--js2abc-js", 298 rebase_path(_js2abc_js, root_build_dir), 299 "--enable-ark", 300 ] 301 inputs += [ 302 nodejs, 303 _js2abc_js, 304 ] 305 } 306 } 307} 308 309template("compile_js_assets") { 310 forward_variables_from(invoker, [ "testonly" ]) 311 assert(defined(invoker.meta_data) && defined(invoker.packaged_js_assets), 312 "meta_data and packaged_js_assets must be for compile_js_assets") 313 314 _packaged_js_assets = invoker.packaged_js_assets 315 action_with_pydeps(target_name) { 316 forward_variables_from(invoker, 317 [ 318 "deps", 319 "meta_data", 320 "hap_profile", 321 "build_mode", 322 "js2abc", 323 "ets2abc", 324 "main_target_name", 325 ]) 326 script = "//build/scripts/build_js_assets.py" 327 depfile = "$target_gen_dir/$target_name.d" 328 outputs = [ _packaged_js_assets ] 329 330 _rebased_metadata = rebase_path(meta_data, root_build_dir) 331 332 if (!defined(deps)) { 333 deps = [] 334 } 335 deps += [ 336 "//arkcompiler/ets_frontend/es2panda:build_es2abc_for_hap($host_toolchain)", 337 "//developtools/ace_ets2bundle:ets_loader_ark_hap", 338 "//developtools/ace_js2bundle:ace_loader_ark_hap", 339 "//third_party/weex-loader:weex_loader_ark_hap", 340 ] 341 _ace_loader_home = 342 get_label_info("//developtools/ace_js2bundle:ace_loader_node_modules", 343 "target_out_dir") + "/ace_loader_ark" 344 _webpack_config_js = "${_ace_loader_home}/webpack.rich.config.js" 345 _ets_loader_home = 346 get_label_info("//developtools/ace_ets2bundle:ets_loader_node_modules", 347 "target_out_dir") + "/ets_loader_ark" 348 _webpack_config_ets = "${_ets_loader_home}/webpack.config.js" 349 _webpack_js = "${_ace_loader_home}/node_modules/webpack/bin/webpack.js" 350 _manifest_file_path = "${target_gen_dir}/manifest_file" 351 352 inputs = [ 353 meta_data, 354 nodejs, 355 ] 356 357 args = [ 358 "--js-assets-dir=@FileArg($_rebased_metadata:root:js_assets)", 359 "--ets-assets-dir=@FileArg($_rebased_metadata:root:ets_assets)", 360 "--js-forms-dir=@FileArg($_rebased_metadata:root:js_forms)", 361 "--testrunner-dir=@FileArg($_rebased_metadata:root:testrunner)", 362 "--output", 363 rebase_path(_packaged_js_assets, root_build_dir), 364 "--depfile", 365 rebase_path(depfile, root_build_dir), 366 "--nodejs-path", 367 rebase_path(nodejs, root_build_dir), 368 "--webpack-js", 369 rebase_path(_webpack_js, root_build_dir), 370 "--webpack-config-js", 371 rebase_path(_webpack_config_js, root_build_dir), 372 "--webpack-config-ets", 373 rebase_path(_webpack_config_ets, root_build_dir), 374 "--build-mode", 375 build_mode, 376 "--ace-loader-home", 377 rebase_path(_ace_loader_home, root_build_dir), 378 "--ets-loader-home", 379 rebase_path(_ets_loader_home, root_build_dir), 380 "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)", 381 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 382 "--manifest-file-path", 383 rebase_path(_manifest_file_path, root_build_dir), 384 ] 385 if (defined(testonly) && testonly == true) { 386 _js_sources_file = target_gen_dir + "/$main_target_name.sources" 387 args += [ 388 "--js-sources-file", 389 rebase_path(_js_sources_file, root_build_dir), 390 ] 391 outputs += [ _js_sources_file ] 392 } 393 394 if (js2abc || ets2abc) { 395 _es2abc_dir = get_label_info( 396 "//arkcompiler/ets_frontend/es2panda:es2panda_build($host_toolchain)", 397 "target_out_dir") 398 if (ets2abc) { 399 args += [ "--ets2abc" ] 400 } else if (js2abc) { 401 args += [ "--js2abc" ] 402 } 403 args += [ 404 "--ark-es2abc-dir", 405 rebase_path(_es2abc_dir, root_build_dir), 406 ] 407 } 408 409 if (defined(hap_profile)) { 410 inputs += [ hap_profile ] 411 } 412 } 413} 414 415template("app_sign") { 416 forward_variables_from(invoker, [ "testonly" ]) 417 action(target_name) { 418 forward_variables_from(invoker, 419 [ 420 "deps", 421 "private_key_path", 422 "signature_algorithm", 423 "certificate_profile", 424 "keystore_password", 425 "key_alias", 426 "certificate_file", 427 "keystore_path", 428 "unsigned_hap_path_list", 429 "hap_out_dir", 430 "hap_name", 431 "install_module_info", 432 ]) 433 script = "//build/scripts/app_sign.py" 434 _private_key_path = default_hap_private_key_path 435 if (defined(private_key_path)) { 436 _private_key_path = private_key_path 437 } 438 _key_alias = default_key_alias 439 if (defined(key_alias)) { 440 _key_alias = key_alias 441 } 442 _signature_algorithm = default_signature_algorithm 443 if (defined(signature_algorithm)) { 444 _signature_algorithm = signature_algorithm 445 } 446 _keystore_path = default_keystore_path 447 if (defined(keystore_path)) { 448 _keystore_path = keystore_path 449 } 450 _certificate_file = default_hap_certificate_file 451 if (defined(certificate_file)) { 452 _certificate_file = certificate_file 453 } 454 _keystore_password = default_keystore_password 455 if (defined(keystore_password)) { 456 _keystore_password = keystore_password 457 } 458 if (defined(certificate_profile)) { 459 _certificate_profile = certificate_profile 460 } 461 462 inputs = [ 463 hapsigner, 464 certificate_profile, 465 _keystore_path, 466 _certificate_file, 467 ] 468 469 outputs = [ "${target_out_dir}/${target_name}.stamp" ] 470 471 args = [ 472 "--keyPwd", 473 _private_key_path, 474 "--sign-algo", 475 _signature_algorithm, 476 "--profileFile", 477 rebase_path(_certificate_profile, root_build_dir), 478 "--keyalias", 479 _key_alias, 480 "--keystoreFile", 481 rebase_path(_keystore_path, root_build_dir), 482 "--keystorePwd", 483 _keystore_password, 484 "--certificate-file", 485 rebase_path(_certificate_file, root_build_dir), 486 "--hapsigner", 487 rebase_path(hapsigner, root_build_dir), 488 "--unsigned-hap-path-list", 489 rebase_path(unsigned_hap_path_list, root_build_dir), 490 "--hap-out-dir", 491 rebase_path(hap_out_dir, root_build_dir), 492 "--hap-name", 493 hap_name, 494 ] 495 if (defined(install_module_info)) { 496 metadata = { 497 install_modules = [ install_module_info ] 498 } 499 } 500 } 501} 502 503template("compile_app") { 504 forward_variables_from(invoker, [ "testonly" ]) 505 nodejs_version = "v14.21.1" 506 if (host_os == "mac") { 507 _nodejs = "//prebuilts/build-tools/common/nodejs/node-${nodejs_version}-darwin-x64/bin/node" 508 } else { 509 _nodejs = "//prebuilts/build-tools/common/nodejs/node-${nodejs_version}-${host_os}-x64/bin/node" 510 } 511 action(target_name) { 512 forward_variables_from(invoker, 513 [ 514 "deps", 515 "cwd", 516 "build_mode", 517 "build_profile", 518 "app_profile", 519 "hap_profile", 520 "build_level", 521 "assemble_type", 522 "sdk_home", 523 "unsigned_hap_path_list", 524 "system_lib_deps", 525 "hap_out_dir", 526 "hap_name", 527 "install_module_info", 528 "test_hap", 529 "test_module", 530 "module_libs_dir", 531 "sdk_type_name", 532 ]) 533 script = "//build/scripts/compile_app.py" 534 outputs = [ unsigned_hap_path_list ] 535 536 args = [ 537 "--nodejs", 538 rebase_path(_nodejs, root_build_dir), 539 "--cwd", 540 rebase_path(cwd, root_build_dir), 541 "--build-profile", 542 rebase_path(build_profile, root_build_dir), 543 "--sdk-home", 544 rebase_path(sdk_home), 545 "--output-file", 546 rebase_path(unsigned_hap_path_list, root_build_dir), 547 "--ohpm-registry", 548 ohpm_registry, 549 ] 550 551 if (defined(build_mode) && build_mode == "debug") { 552 args += [ "--enable-debug" ] 553 } 554 555 if (defined(test_hap) && test_hap) { 556 args += [ "--test-hap" ] 557 } 558 559 if (defined(test_module) && test_module != "") { 560 args += [ 561 "--test-module", 562 test_module, 563 ] 564 } 565 if (defined(module_libs_dir) && module_libs_dir != "") { 566 args += [ 567 "--module-libs-dir", 568 module_libs_dir, 569 ] 570 } 571 if (defined(build_level) && build_level != "") { 572 args += [ 573 "--build-level", 574 build_level, 575 ] 576 } 577 if (defined(assemble_type) && assemble_type != "") { 578 args += [ 579 "--assemble-type", 580 assemble_type, 581 ] 582 } 583 if (defined(system_lib_deps)) { 584 args += [ "--system-lib-module-info-list" ] 585 foreach(_lib_deps, system_lib_deps) { 586 _lib_out_name = get_label_info(_lib_deps, "name") 587 _lib_out_dir = get_label_info(_lib_deps, "target_out_dir") 588 args += 589 [ rebase_path("${_lib_out_dir}/${_lib_out_name}_module_info.json", 590 root_build_dir) ] 591 } 592 593 if (is_ohos) { 594 args += [ 595 "--ohos-app-abi", 596 ohos_app_abi, 597 ] 598 } 599 } 600 if (defined(sdk_type_name) && sdk_type_name != []) { 601 args += [ "--sdk-type-name" ] 602 args += sdk_type_name 603 } 604 if (defined(install_module_info)) { 605 metadata = { 606 install_modules = [ install_module_info ] 607 } 608 } 609 } 610} 611