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