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/clang/clang.gni") 15import("//build/config/ohos/config.gni") 16import("//build/config/security/security_config.gni") 17import("//build/ohos/notice/notice.gni") 18import("//build/ohos_var.gni") 19import("//build/templates/metadata/module_info.gni") 20 21default_opt_configs = [ 22 "//build/config/compiler:default_symbols", 23 "//build/config/compiler:default_optimization", 24] 25 26debug_level_configs = [ 27 "//build/config/compiler:symbols", 28 "//build/config/compiler:no_optimize", 29] 30 31template("ohos_executable") { 32 assert(!defined(invoker.output_dir), 33 "output_dir is not allowed to be defined.") 34 35 if (defined(invoker.subsystem_name) && defined(invoker.part_name)) { 36 subsystem_name = invoker.subsystem_name 37 part_name = invoker.part_name 38 } else if (defined(invoker.part_name)) { 39 part_name = invoker.part_name 40 _part_subsystem_info_file = 41 "$root_build_dir/build_configs/parts_info/part_subsystem.json" 42 _arguments = [ 43 "--part-name", 44 part_name, 45 "--part-subsystem-info-file", 46 rebase_path(_part_subsystem_info_file, root_build_dir), 47 ] 48 get_subsystem_script = "//build/templates/common/get_subsystem_name.py" 49 subsystem_name = 50 exec_script(get_subsystem_script, _arguments, "trim string") 51 } else if (defined(invoker.subsystem_name)) { 52 subsystem_name = invoker.subsystem_name 53 part_name = subsystem_name 54 } else { 55 subsystem_name = "common" 56 part_name = subsystem_name 57 } 58 assert(subsystem_name != "") 59 assert(part_name != "") 60 61 if (check_deps) { 62 deps_data = { 63 } 64 module_label = get_label_info(":${target_name}", "label_with_toolchain") 65 module_deps = [] 66 if (defined(invoker.deps)) { 67 foreach(dep, invoker.deps) { 68 module_deps += [ get_label_info(dep, "label_no_toolchain") ] 69 } 70 } 71 module_ex_deps = [] 72 if (defined(invoker.external_deps) && invoker.external_deps != []) { 73 module_ex_deps = invoker.external_deps 74 } 75 deps_data = { 76 part_name = part_name 77 module_label = module_label 78 deps = module_deps 79 external_deps = module_ex_deps 80 } 81 82 write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json", 83 deps_data, 84 "json") 85 } 86 87 _ohos_test = false 88 if (defined(invoker.ohos_test) && invoker.ohos_test) { 89 output_dir = invoker.test_output_dir 90 _ohos_test = true 91 } else { 92 if (is_standard_system) { 93 output_dir = "${root_out_dir}/${subsystem_name}/${part_name}" 94 } else { 95 output_dir = "${root_out_dir}" 96 } 97 } 98 99 _security_config_target = "${target_name}__security_config" 100 ohos_security_config(_security_config_target) { 101 forward_variables_from(invoker, 102 [ 103 "auto_var_init", 104 "stack_protector_ret", 105 ]) 106 } 107 108 _sanitize_config_target = "${target_name}__sanitizer_config" 109 ohos_sanitizer_config(_sanitize_config_target) { 110 forward_variables_from(invoker, [ "sanitize" ]) 111 } 112 113 _test_target = defined(invoker.testonly) && invoker.testonly 114 if (!_test_target) { 115 _main_target_name = target_name 116 _notice_target = "${_main_target_name}__notice" 117 collect_notice(_notice_target) { 118 forward_variables_from(invoker, 119 [ 120 "testonly", 121 "license_as_sources", 122 "license_file", 123 ]) 124 125 module_name = _main_target_name 126 module_source_dir = get_label_info(":${_main_target_name}", "dir") 127 } 128 } 129 target_label = get_label_info(":${target_name}", "label_with_toolchain") 130 target_toolchain = get_label_info(target_label, "toolchain") 131 executable("${target_name}") { 132 forward_variables_from(invoker, 133 "*", 134 [ 135 "configs", 136 "remove_configs", 137 "static_link", 138 "external_deps", 139 "install_images", 140 "module_install_dir", 141 "relative_install_dir", 142 "symlink_target_name", 143 "output_dir", 144 "install_enable", 145 "version_script", 146 "license_file", 147 "license_as_sources", 148 "use_exceptions", 149 "use_rtti", 150 151 # Sanitizer variables 152 "sanitize", 153 ]) 154 output_dir = output_dir 155 156 if (defined(invoker.configs)) { 157 configs += invoker.configs 158 } 159 if (defined(invoker.remove_configs)) { 160 configs -= invoker.remove_configs 161 } 162 configs += [ ":$_sanitize_config_target" ] 163 configs += [ ":$_security_config_target" ] 164 165 if (defined(invoker.use_exceptions) && invoker.use_exceptions) { 166 configs += [ "//build/config/compiler:exceptions" ] 167 configs -= [ "//build/config/compiler:no_exceptions" ] 168 } 169 170 if (defined(invoker.use_rtti) && invoker.use_rtti) { 171 configs += [ "//build/config/compiler:rtti" ] 172 configs -= [ "//build/config/compiler:no_rtti" ] 173 } 174 175 if (!defined(deps)) { 176 deps = [] 177 } 178 if (!defined(libs)) { 179 libs = [] 180 } 181 if (!defined(include_dirs)) { 182 include_dirs = [] 183 } 184 if (!defined(ldflags)) { 185 ldflags = [] 186 } 187 188 if (defined(invoker.static_link) && invoker.static_link) { 189 no_default_deps = true 190 configs -= [ "//build/config:executable_config" ] 191 ldflags += [ "-static" ] 192 if (is_ohos && use_musl) { 193 import("//build/config/ohos/musl.gni") 194 deps += [ "//third_party/musl:soft_static_libs" ] 195 } 196 } else if (is_ohos) { 197 if (current_cpu == "arm") { 198 libs += [ "unwind" ] 199 } 200 libs += [ "c++" ] 201 } 202 203 if (!defined(output_name)) { 204 output_name = target_name 205 } 206 207 if (defined(invoker.version_script)) { 208 _version_script = rebase_path(invoker.version_script, root_build_dir) 209 if (!defined(ldflags)) { 210 ldflags = [] 211 } 212 ldflags += [ 213 "-rdynamic", 214 "-Wl,--version-script=${_version_script}", 215 ] 216 } 217 218 if (defined(invoker.external_deps)) { 219 external_deps_script = 220 rebase_path("//build/templates/common/external_deps_handler.py") 221 external_deps_temp_file = 222 "$target_gen_dir/${part_name}__${target_name}_external_deps_temp.json" 223 arguments = [ "--external-deps" ] 224 arguments += invoker.external_deps 225 arguments += [ 226 "--parts-src-flag-file", 227 rebase_path(parts_src_flag_file, root_build_dir), 228 "--external-deps-temp-file", 229 rebase_path(external_deps_temp_file, root_build_dir), 230 "--sdk-base-dir", 231 rebase_path("${innersdk_base_dir}", root_build_dir), 232 "--sdk-dir-name", 233 "${innersdk_dir_name}", 234 "--current-toolchain", 235 current_toolchain, 236 "--innerkits-adapter-info-file", 237 rebase_path("//build/ohos/inner_kits_adapter.json", root_build_dir), 238 ] 239 if (is_use_sdk) { 240 arguments += [ "--use-sdk" ] 241 } 242 exec_script(external_deps_script, arguments) 243 244 external_deps_info = read_file(external_deps_temp_file, "json") 245 if (defined(external_deps_info.deps)) { 246 deps += external_deps_info.deps 247 } 248 if (defined(external_deps_info.libs)) { 249 libs += external_deps_info.libs 250 } 251 if (defined(external_deps_info.include_dirs)) { 252 include_dirs += external_deps_info.include_dirs 253 } 254 } 255 256 # We don't need to change config when "is_debug==true" 257 # "enable_debug_components" isn't blank means some components using debug level compilation 258 if (defined(is_debug) && !is_debug && enable_debug_components != "") { 259 foreach(component_name, debug_components) { 260 if (part_name == component_name) { 261 configs -= default_opt_configs 262 configs += debug_level_configs 263 } 264 } 265 } 266 if (target_toolchain == "${current_toolchain}") { 267 install_module_info = { 268 module_def = target_label 269 part_name = part_name 270 module_info_file = 271 rebase_path(get_label_info(module_def, "target_out_dir"), 272 root_build_dir) + "/${target_name}_module_info.json" 273 subsystem_name = subsystem_name 274 part_name = part_name 275 toolchain = current_toolchain 276 toolchain_out_dir = rebase_path(root_out_dir, root_build_dir) 277 } 278 metadata = { 279 install_modules = [ install_module_info ] 280 } 281 } 282 if (!_test_target) { 283 deps += [ ":$_notice_target" ] 284 } 285 } 286 287 if (skip_gen_module_info) { 288 not_needed(invoker, "*") 289 not_needed([ "_ohos_test" ]) 290 } else if (!_ohos_test) { 291 ohos_module_name = target_name 292 generate_module_info("${ohos_module_name}_info") { 293 module_name = ohos_module_name 294 module_type = "bin" 295 296 module_source_dir = "$root_out_dir" 297 if (defined(output_dir)) { 298 module_source_dir = output_dir 299 } 300 301 module_install_name = ohos_module_name 302 if (defined(invoker.output_name)) { 303 module_install_name = invoker.output_name 304 } 305 306 module_install_images = [ "system" ] 307 if (defined(invoker.install_images)) { 308 module_install_images = [] 309 module_install_images += invoker.install_images 310 } 311 312 module_output_extension = executable_extension 313 if (defined(invoker.output_extension)) { 314 module_output_extension = "." + invoker.output_extension 315 } 316 317 if (is_double_framework) { 318 install_enable = false 319 } else { 320 install_enable = true 321 } 322 if (defined(invoker.install_enable)) { 323 install_enable = invoker.install_enable 324 } 325 326 if (defined(invoker.module_install_dir)) { 327 module_install_dir = invoker.module_install_dir 328 } 329 330 if (defined(invoker.relative_install_dir)) { 331 relative_install_dir = invoker.relative_install_dir 332 } 333 334 if (defined(invoker.symlink_target_name)) { 335 symlink_target_name = invoker.symlink_target_name 336 } 337 notice = "$target_out_dir/$ohos_module_name.notice.txt" 338 } 339 } 340} 341 342# Defines a shared_library 343# 344# The shared_library template is used to generated so file. 345# 346# Parameters 347# 348# subsystem_name (required) 349# [string] 350# configs (optional) 351# [list] 352# remove_cnofigs (optional) 353# [list] 354# version_script (optional) 355# [string] 356template("ohos_shared_library") { 357 assert(!defined(invoker.output_dir), 358 "output_dir is not allowed to be defined.") 359 360 if (defined(invoker.subsystem_name) && defined(invoker.part_name)) { 361 subsystem_name = invoker.subsystem_name 362 part_name = invoker.part_name 363 } else if (defined(invoker.part_name)) { 364 part_name = invoker.part_name 365 _part_subsystem_info_file = 366 "$root_build_dir/build_configs/parts_info/part_subsystem.json" 367 _arguments = [ 368 "--part-name", 369 part_name, 370 "--part-subsystem-info-file", 371 rebase_path(_part_subsystem_info_file, root_build_dir), 372 ] 373 get_subsystem_script = "//build/templates/common/get_subsystem_name.py" 374 subsystem_name = 375 exec_script(get_subsystem_script, _arguments, "trim string") 376 } else if (defined(invoker.subsystem_name)) { 377 subsystem_name = invoker.subsystem_name 378 part_name = subsystem_name 379 } else { 380 subsystem_name = "common" 381 part_name = subsystem_name 382 } 383 assert(subsystem_name != "") 384 assert(part_name != "") 385 386 if (check_deps) { 387 deps_data = { 388 } 389 module_label = get_label_info(":${target_name}", "label_with_toolchain") 390 module_deps = [] 391 if (defined(invoker.deps)) { 392 foreach(dep, invoker.deps) { 393 module_deps += [ get_label_info(dep, "label_no_toolchain") ] 394 } 395 } 396 module_ex_deps = [] 397 if (defined(invoker.external_deps) && invoker.external_deps != []) { 398 module_ex_deps = invoker.external_deps 399 } 400 deps_data = { 401 part_name = part_name 402 module_label = module_label 403 deps = module_deps 404 external_deps = module_ex_deps 405 } 406 write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json", 407 deps_data, 408 "json") 409 } 410 411 if (is_standard_system) { 412 output_dir = "${root_out_dir}/${subsystem_name}/${part_name}" 413 } else { 414 output_dir = "${root_out_dir}" 415 } 416 417 _security_config_target = "${target_name}__security_config" 418 ohos_security_config(_security_config_target) { 419 forward_variables_from(invoker, 420 [ 421 "auto_var_init", 422 "stack_protector_ret", 423 ]) 424 } 425 426 _sanitize_config_target = "${target_name}__sanitizer_config" 427 ohos_sanitizer_config(_sanitize_config_target) { 428 forward_variables_from(invoker, [ "sanitize" ]) 429 } 430 431 _test_target = defined(invoker.testonly) && invoker.testonly 432 if (!_test_target) { 433 _notice_target = "${target_name}__notice" 434 _main_target_name = target_name 435 collect_notice(_notice_target) { 436 forward_variables_from(invoker, 437 [ 438 "testonly", 439 "license_as_sources", 440 "license_file", 441 ]) 442 443 module_name = _main_target_name 444 module_source_dir = get_label_info(":${_main_target_name}", "dir") 445 } 446 } 447 448 target_label = get_label_info(":${target_name}", "label_with_toolchain") 449 target_toolchain = get_label_info(target_label, "toolchain") 450 shared_library("${target_name}") { 451 forward_variables_from(invoker, 452 "*", 453 [ 454 "configs", 455 "remove_configs", 456 "no_default_deps", 457 "external_deps", 458 "install_images", 459 "module_install_dir", 460 "relative_install_dir", 461 "symlink_target_name", 462 "output_dir", 463 "install_enable", 464 "version_script", 465 "license_file", 466 "license_as_sources", 467 "use_exceptions", 468 "use_rtti", 469 "stl", 470 471 # Sanitizer variables 472 "sanitize", 473 ]) 474 output_dir = output_dir 475 476 if (!defined(inputs)) { 477 inputs = [] 478 } 479 480 if (!defined(ldflags)) { 481 ldflags = [] 482 } 483 484 if (defined(invoker.configs)) { 485 configs += invoker.configs 486 } 487 if (defined(invoker.remove_configs)) { 488 configs -= invoker.remove_configs 489 } 490 491 configs += [ ":$_sanitize_config_target" ] 492 configs += [ ":$_security_config_target" ] 493 494 if (defined(invoker.use_exceptions) && invoker.use_exceptions) { 495 configs += [ "//build/config/compiler:exceptions" ] 496 configs -= [ "//build/config/compiler:no_exceptions" ] 497 } 498 499 if (defined(invoker.use_rtti) && invoker.use_rtti) { 500 configs += [ "//build/config/compiler:rtti" ] 501 configs -= [ "//build/config/compiler:no_rtti" ] 502 } 503 504 if (!defined(output_name)) { 505 output_name = target_name 506 } 507 508 if (defined(invoker.no_default_deps)) { 509 no_default_deps = invoker.no_default_deps 510 } 511 512 if (defined(invoker.version_script)) { 513 _version_script = rebase_path(invoker.version_script, root_build_dir) 514 inputs += [ invoker.version_script ] 515 ldflags += [ "-Wl,--version-script=${_version_script}" ] 516 } 517 518 if (!defined(ldflags)) { 519 ldflags = [] 520 } 521 if (!defined(libs)) { 522 libs = [] 523 } 524 if (!defined(cflags_cc)) { 525 cflags_cc = [] 526 } 527 if (!defined(deps)) { 528 deps = [] 529 } 530 if (is_ohos) { 531 if (defined(invoker.stl)) { 532 cflags_cc += [ 533 "-nostdinc++", 534 "-I" + rebase_path( 535 "//prebuilts/clang/ohos/${host_platform_dir}/llvm_ndk/include/c++/v1", 536 root_build_dir), 537 ] 538 ldflags += [ 539 "-nostdlib++", 540 "-L" + rebase_path("${clang_stl_path}/${abi_target}/c++", 541 root_build_dir), 542 ] 543 544 libs += [ invoker.stl ] 545 } else { 546 if (current_cpu == "arm") { 547 libs += [ "unwind" ] 548 } 549 550 libs += [ "c++" ] 551 } 552 } 553 554 if (!_test_target) { 555 deps += [ ":$_notice_target" ] 556 } 557 if (!defined(include_dirs)) { 558 include_dirs = [] 559 } 560 if (defined(invoker.external_deps)) { 561 external_deps_script = 562 rebase_path("//build/templates/common/external_deps_handler.py") 563 external_deps_temp_file = 564 "$target_gen_dir/${part_name}__${target_name}_external_deps_temp.json" 565 arguments = [ "--external-deps" ] 566 arguments += invoker.external_deps 567 arguments += [ 568 "--parts-src-flag-file", 569 rebase_path(parts_src_flag_file, root_build_dir), 570 "--external-deps-temp-file", 571 rebase_path(external_deps_temp_file, root_build_dir), 572 "--sdk-base-dir", 573 rebase_path("${innersdk_base_dir}", root_build_dir), 574 "--sdk-dir-name", 575 "${innersdk_dir_name}", 576 "--current-toolchain", 577 current_toolchain, 578 "--innerkits-adapter-info-file", 579 rebase_path("//build/ohos/inner_kits_adapter.json", root_build_dir), 580 ] 581 if (is_use_sdk) { 582 arguments += [ "--use-sdk" ] 583 } 584 585 exec_script(external_deps_script, arguments, "string") 586 587 external_deps_info = read_file(external_deps_temp_file, "json") 588 if (defined(external_deps_info.deps)) { 589 deps += external_deps_info.deps 590 } 591 if (defined(external_deps_info.libs)) { 592 libs += external_deps_info.libs 593 } 594 if (defined(external_deps_info.include_dirs)) { 595 include_dirs += external_deps_info.include_dirs 596 } 597 } 598 599 install_module_info = { 600 module_def = target_label 601 module_info_file = 602 rebase_path(get_label_info(module_def, "target_out_dir"), 603 root_build_dir) + "/${target_name}_module_info.json" 604 subsystem_name = subsystem_name 605 part_name = part_name 606 toolchain = current_toolchain 607 toolchain_out_dir = rebase_path(root_out_dir, root_build_dir) 608 } 609 metadata = { 610 install_modules = [ install_module_info ] 611 } 612 if (defined(is_debug) && !is_debug && enable_debug_components != "") { 613 foreach(component_name, debug_components) { 614 if (part_name == component_name) { 615 configs -= default_opt_configs 616 configs += debug_level_configs 617 } 618 } 619 } 620 621 module_type_napi = false 622 if (defined(invoker.relative_install_dir) && product_name != "ohos-sdk") { 623 relative_paths = string_split(invoker.relative_install_dir, "/") 624 foreach(p, relative_paths) { 625 if (p == "module") { 626 module_type_napi = true 627 } 628 } 629 if (module_type_napi) { 630 napi_white_list = [ 631 "fileio", 632 "downloadsingle", 633 "tel_call_manager_api", 634 "rpc", 635 "color_picker", 636 "accessibility", 637 "stationary", 638 "remote_file_share_native", 639 "window_animation", 640 "cryptoframework_napi", 641 "rdb", 642 "distributeddataobject_impl", 643 "medialibrary", 644 "image", 645 "featureability", 646 "medical", 647 "devicestatus", 648 "hiappevent", 649 "hiappevent_v9", 650 "quickfixmanager_napi", 651 ] 652 foreach(m, napi_white_list) { 653 if (m == target_name) { 654 module_type_napi = false 655 } 656 } 657 } 658 } 659 if (module_type_napi) { 660 if (!defined(invoker.version_script)) { 661 _version_script = 662 rebase_path("//build/templates/cxx/napi.versionscript") 663 inputs += [ _version_script ] 664 ldflags += [ "-Wl,--version-script=${_version_script}" ] 665 } 666 } 667 } 668 if (target_toolchain == "${current_toolchain}") { 669 ohos_module_name = target_name 670 generate_module_info("${ohos_module_name}_info") { 671 module_name = ohos_module_name 672 module_type = "lib" 673 module_source_dir = "$root_out_dir" 674 if (defined(output_dir)) { 675 module_source_dir = output_dir 676 } 677 678 module_install_name = ohos_module_name 679 if (defined(invoker.output_name)) { 680 module_install_name = invoker.output_name 681 } 682 683 module_install_images = [ "system" ] 684 if (defined(invoker.install_images)) { 685 module_install_images = [] 686 module_install_images += invoker.install_images 687 } 688 689 module_output_extension = shlib_extension 690 if (defined(invoker.output_extension)) { 691 module_output_extension = "." + invoker.output_extension 692 } 693 694 install_enable = true 695 if (defined(invoker.install_enable)) { 696 install_enable = invoker.install_enable 697 } 698 699 if (defined(invoker.module_install_dir)) { 700 module_install_dir = invoker.module_install_dir 701 } 702 703 if (defined(invoker.relative_install_dir)) { 704 relative_install_dir = invoker.relative_install_dir 705 } 706 707 if (defined(invoker.symlink_target_name)) { 708 symlink_target_name = invoker.symlink_target_name 709 } 710 711 if (defined(invoker.output_prefix_override)) { 712 output_prefix_override = invoker.output_prefix_override 713 } 714 notice = "$target_out_dir/$ohos_module_name.notice.txt" 715 } 716 } 717} 718 719template("ohos_static_library") { 720 if (defined(invoker.subsystem_name) && defined(invoker.part_name)) { 721 part_name = invoker.part_name 722 } else if (defined(invoker.part_name)) { 723 part_name = invoker.part_name 724 } else if (defined(invoker.subsystem_name)) { 725 part_name = invoker.subsystem_name 726 } else { 727 part_name = "common" 728 } 729 assert(part_name != "") 730 731 if (check_deps) { 732 deps_data = { 733 } 734 module_label = get_label_info(":${target_name}", "label_with_toolchain") 735 module_deps = [] 736 if (defined(invoker.deps)) { 737 foreach(dep, invoker.deps) { 738 module_deps += [ get_label_info(dep, "label_no_toolchain") ] 739 } 740 } 741 module_ex_deps = [] 742 if (defined(invoker.external_deps) && invoker.external_deps != []) { 743 module_ex_deps = invoker.external_deps 744 } 745 deps_data = { 746 part_name = part_name 747 module_label = module_label 748 deps = module_deps 749 external_deps = module_ex_deps 750 } 751 752 write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json", 753 deps_data, 754 "json") 755 } 756 757 _security_config_target = "${target_name}__security_config" 758 ohos_security_config(_security_config_target) { 759 forward_variables_from(invoker, 760 [ 761 "auto_var_init", 762 "stack_protector_ret", 763 ]) 764 } 765 766 _sanitize_config_target = "${target_name}__sanitizer_config" 767 ohos_sanitizer_config(_sanitize_config_target) { 768 forward_variables_from(invoker, [ "sanitize" ]) 769 } 770 771 _test_target = defined(invoker.testonly) && invoker.testonly 772 if (!_test_target) { 773 _notice_target = "${target_name}__notice" 774 _main_target_name = target_name 775 collect_notice(_notice_target) { 776 forward_variables_from(invoker, 777 [ 778 "testonly", 779 "license_as_sources", 780 "license_file", 781 ]) 782 module_type = "static_library" 783 module_name = _main_target_name 784 module_source_dir = get_label_info(":${_main_target_name}", "dir") 785 } 786 } 787 788 static_library(target_name) { 789 forward_variables_from(invoker, 790 "*", 791 [ 792 "configs", 793 "remove_configs", 794 "no_default_deps", 795 "external_deps", 796 "license_file", 797 "license_as_sources", 798 "use_exceptions", 799 "use_rtti", 800 "subsystem_name", 801 802 # Sanitizer variables 803 "sanitize", 804 ]) 805 if (defined(invoker.configs)) { 806 configs += invoker.configs 807 } 808 if (defined(invoker.remove_configs)) { 809 configs -= invoker.remove_configs 810 } 811 if (is_standard_system) { 812 configs -= [ "//build/config/compiler:thin_archive" ] 813 } 814 configs += [ ":$_sanitize_config_target" ] 815 configs += [ ":$_security_config_target" ] 816 817 if (defined(invoker.use_exceptions) && invoker.use_exceptions) { 818 configs += [ "//build/config/compiler:exceptions" ] 819 configs -= [ "//build/config/compiler:no_exceptions" ] 820 } 821 822 if (defined(invoker.use_rtti) && invoker.use_rtti) { 823 configs += [ "//build/config/compiler:rtti" ] 824 configs -= [ "//build/config/compiler:no_rtti" ] 825 } 826 827 if (defined(invoker.no_default_deps)) { 828 no_default_deps = invoker.no_default_deps 829 } 830 831 if (!defined(deps)) { 832 deps = [] 833 } 834 if (!_test_target) { 835 deps += [ ":$_notice_target" ] 836 } 837 if (!defined(libs)) { 838 libs = [] 839 } 840 if (!defined(include_dirs)) { 841 include_dirs = [] 842 } 843 if (defined(invoker.external_deps)) { 844 external_deps_script = 845 rebase_path("//build/templates/common/external_deps_handler.py") 846 external_deps_temp_file = 847 "$target_gen_dir/${part_name}__${target_name}_external_deps_temp.json" 848 arguments = [ "--external-deps" ] 849 arguments += invoker.external_deps 850 arguments += [ 851 "--parts-src-flag-file", 852 rebase_path(parts_src_flag_file, root_build_dir), 853 "--external-deps-temp-file", 854 rebase_path(external_deps_temp_file, root_build_dir), 855 "--sdk-base-dir", 856 rebase_path("${innersdk_base_dir}", root_build_dir), 857 "--sdk-dir-name", 858 "${innersdk_dir_name}", 859 "--current-toolchain", 860 current_toolchain, 861 "--innerkits-adapter-info-file", 862 rebase_path("//build/ohos/inner_kits_adapter.json", root_build_dir), 863 ] 864 if (is_use_sdk) { 865 arguments += [ "--use-sdk" ] 866 } 867 868 exec_script(external_deps_script, arguments) 869 870 external_deps_info = read_file(external_deps_temp_file, "json") 871 if (defined(external_deps_info.deps)) { 872 deps += external_deps_info.deps 873 } 874 if (defined(external_deps_info.libs)) { 875 libs += external_deps_info.libs 876 } 877 if (defined(external_deps_info.include_dirs)) { 878 include_dirs += external_deps_info.include_dirs 879 } 880 } 881 if (defined(is_debug) && !is_debug && enable_debug_components != "") { 882 foreach(component_name, debug_components) { 883 if (part_name == component_name) { 884 configs -= default_opt_configs 885 configs += debug_level_configs 886 } 887 } 888 } 889 } 890} 891 892template("ohos_source_set") { 893 if (defined(invoker.subsystem_name) && defined(invoker.part_name)) { 894 part_name = invoker.part_name 895 } else if (defined(invoker.part_name)) { 896 part_name = invoker.part_name 897 } else if (defined(invoker.subsystem_name)) { 898 part_name = invoker.subsystem_name 899 } else { 900 part_name = "common" 901 } 902 assert(part_name != "") 903 904 if (check_deps) { 905 deps_data = { 906 } 907 module_label = get_label_info(":${target_name}", "label_with_toolchain") 908 module_deps = [] 909 if (defined(invoker.deps)) { 910 foreach(dep, invoker.deps) { 911 module_deps += [ get_label_info(dep, "label_no_toolchain") ] 912 } 913 } 914 module_ex_deps = [] 915 if (defined(invoker.external_deps) && invoker.external_deps != []) { 916 module_ex_deps = invoker.external_deps 917 } 918 deps_data = { 919 part_name = part_name 920 module_label = module_label 921 deps = module_deps 922 external_deps = module_ex_deps 923 } 924 write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json", 925 deps_data, 926 "json") 927 } 928 929 _security_config_target = "${target_name}__security_config" 930 ohos_security_config(_security_config_target) { 931 forward_variables_from(invoker, 932 [ 933 "auto_var_init", 934 "stack_protector_ret", 935 ]) 936 } 937 938 _sanitize_config_target = "${target_name}__sanitizer_config" 939 ohos_sanitizer_config(_sanitize_config_target) { 940 forward_variables_from(invoker, [ "sanitize" ]) 941 } 942 943 _test_target = defined(invoker.testonly) && invoker.testonly 944 if (!_test_target) { 945 _main_target_name = target_name 946 _notice_target = "${_main_target_name}__notice" 947 collect_notice(_notice_target) { 948 forward_variables_from(invoker, 949 [ 950 "testonly", 951 "license_as_sources", 952 "license_file", 953 ]) 954 955 module_type = "source_set" 956 module_name = _main_target_name 957 module_source_dir = get_label_info(":${_main_target_name}", "dir") 958 } 959 } 960 961 source_set(target_name) { 962 forward_variables_from(invoker, 963 "*", 964 [ 965 "configs", 966 "remove_configs", 967 "no_default_deps", 968 "external_deps", 969 "license_file", 970 "license_as_sources", 971 "use_exceptions", 972 "use_rtti", 973 "subsystem_name", 974 975 # Sanitizer variables 976 "sanitize", 977 ]) 978 if (defined(invoker.configs)) { 979 configs += invoker.configs 980 } 981 if (defined(invoker.remove_configs)) { 982 configs -= invoker.remove_configs 983 } 984 985 configs += [ ":$_sanitize_config_target" ] 986 configs += [ ":$_security_config_target" ] 987 988 if (defined(invoker.use_exceptions) && invoker.use_exceptions) { 989 configs += [ "//build/config/compiler:exceptions" ] 990 configs -= [ "//build/config/compiler:no_exceptions" ] 991 } 992 993 if (defined(invoker.use_rtti) && invoker.use_rtti) { 994 configs += [ "//build/config/compiler:rtti" ] 995 configs -= [ "//build/config/compiler:no_rtti" ] 996 } 997 998 if (defined(invoker.no_default_deps)) { 999 no_default_deps = invoker.no_default_deps 1000 } 1001 1002 if (!defined(deps)) { 1003 deps = [] 1004 } 1005 1006 if (!_test_target) { 1007 deps += [ ":$_notice_target" ] 1008 } 1009 1010 if (!defined(libs)) { 1011 libs = [] 1012 } 1013 if (!defined(include_dirs)) { 1014 include_dirs = [] 1015 } 1016 if (defined(invoker.external_deps)) { 1017 external_deps_script = 1018 rebase_path("//build/templates/common/external_deps_handler.py") 1019 external_deps_temp_file = 1020 "$target_gen_dir/${part_name}__${target_name}_external_deps_temp.json" 1021 arguments = [ "--external-deps" ] 1022 arguments += invoker.external_deps 1023 arguments += [ 1024 "--parts-src-flag-file", 1025 rebase_path(parts_src_flag_file, root_build_dir), 1026 "--external-deps-temp-file", 1027 rebase_path(external_deps_temp_file, root_build_dir), 1028 "--sdk-base-dir", 1029 rebase_path("${innersdk_base_dir}", root_build_dir), 1030 "--sdk-dir-name", 1031 "${innersdk_dir_name}", 1032 "--current-toolchain", 1033 current_toolchain, 1034 "--innerkits-adapter-info-file", 1035 rebase_path("//build/ohos/inner_kits_adapter.json", root_build_dir), 1036 ] 1037 if (is_use_sdk) { 1038 arguments += [ "--use-sdk" ] 1039 } 1040 1041 exec_script(external_deps_script, arguments) 1042 1043 external_deps_info = read_file(external_deps_temp_file, "json") 1044 if (defined(external_deps_info.deps)) { 1045 deps += external_deps_info.deps 1046 } 1047 if (defined(external_deps_info.libs)) { 1048 libs += external_deps_info.libs 1049 } 1050 if (defined(external_deps_info.include_dirs)) { 1051 include_dirs += external_deps_info.include_dirs 1052 } 1053 } 1054 if (defined(is_debug) && !is_debug && enable_debug_components != "") { 1055 foreach(component_name, debug_components) { 1056 if (part_name == component_name) { 1057 configs -= default_opt_configs 1058 configs += debug_level_configs 1059 } 1060 } 1061 } 1062 } 1063} 1064