15f9996aaSopenharmony_ci# Copyright (c) 2021 Huawei Device Co., Ltd.
25f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
35f9996aaSopenharmony_ci# you may not use this file except in compliance with the License.
45f9996aaSopenharmony_ci# You may obtain a copy of the License at
55f9996aaSopenharmony_ci#
65f9996aaSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
75f9996aaSopenharmony_ci#
85f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
95f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
105f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115f9996aaSopenharmony_ci# See the License for the specific language governing permissions and
125f9996aaSopenharmony_ci# limitations under the License.
135f9996aaSopenharmony_ci
145f9996aaSopenharmony_ciimport("//build/config/clang/clang.gni")
155f9996aaSopenharmony_ciimport("//build/config/ohos/config.gni")
165f9996aaSopenharmony_ciimport("//build/config/security/security_config.gni")
175f9996aaSopenharmony_ciimport("//build/ohos/notice/notice.gni")
185f9996aaSopenharmony_ciimport("//build/ohos_var.gni")
195f9996aaSopenharmony_ciimport("//build/templates/common/check_target.gni")
205f9996aaSopenharmony_ciimport("//build/templates/common/collect_target.gni")
215f9996aaSopenharmony_ciimport("//build/templates/metadata/module_info.gni")
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_cideclare_args() {
245f9996aaSopenharmony_ci  # Compile with no sanitize check, for local debug only
255f9996aaSopenharmony_ci  allow_sanitize_debug = false
265f9996aaSopenharmony_ci}
275f9996aaSopenharmony_ci
285f9996aaSopenharmony_cidefault_opt_configs = [
295f9996aaSopenharmony_ci  "//build/config/compiler:default_symbols",
305f9996aaSopenharmony_ci  "//build/config/compiler:default_optimization",
315f9996aaSopenharmony_ci]
325f9996aaSopenharmony_ci
335f9996aaSopenharmony_cidebug_level_configs = [
345f9996aaSopenharmony_ci  "//build/config/compiler:symbols",
355f9996aaSopenharmony_ci  "//build/config/compiler:no_optimize",
365f9996aaSopenharmony_ci]
375f9996aaSopenharmony_ci
385f9996aaSopenharmony_citemplate("ohos_executable") {
395f9996aaSopenharmony_ci  assert(!defined(invoker.output_dir),
405f9996aaSopenharmony_ci         "output_dir is not allowed to be defined.")
415f9996aaSopenharmony_ci
425f9996aaSopenharmony_ci  _test_target = defined(invoker.testonly) && invoker.testonly
435f9996aaSopenharmony_ci  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
445f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
455f9996aaSopenharmony_ci    part_name = invoker.part_name
465f9996aaSopenharmony_ci  } else if (defined(invoker.part_name)) {
475f9996aaSopenharmony_ci    part_name = invoker.part_name
485f9996aaSopenharmony_ci    _part_subsystem_info_file =
495f9996aaSopenharmony_ci        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
505f9996aaSopenharmony_ci    _arguments = [
515f9996aaSopenharmony_ci      "--part-name",
525f9996aaSopenharmony_ci      part_name,
535f9996aaSopenharmony_ci      "--part-subsystem-info-file",
545f9996aaSopenharmony_ci      rebase_path(_part_subsystem_info_file, root_build_dir),
555f9996aaSopenharmony_ci    ]
565f9996aaSopenharmony_ci    get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
575f9996aaSopenharmony_ci    subsystem_name =
585f9996aaSopenharmony_ci        exec_script(get_subsystem_script, _arguments, "trim string")
595f9996aaSopenharmony_ci    if (is_use_check_deps && !_test_target) {
605f9996aaSopenharmony_ci      skip_check_subsystem = true
615f9996aaSopenharmony_ci    }
625f9996aaSopenharmony_ci  } else if (defined(invoker.subsystem_name)) {
635f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
645f9996aaSopenharmony_ci    part_name = subsystem_name
655f9996aaSopenharmony_ci  } else {
665f9996aaSopenharmony_ci    subsystem_name = "build"
675f9996aaSopenharmony_ci    part_name = "build_framework"
685f9996aaSopenharmony_ci  }
695f9996aaSopenharmony_ci  assert(subsystem_name != "")
705f9996aaSopenharmony_ci  assert(part_name != "")
715f9996aaSopenharmony_ci
725f9996aaSopenharmony_ci  module_label = get_label_info(":${target_name}", "label_with_toolchain")
735f9996aaSopenharmony_ci  _collect_target = "${target_name}__collect"
745f9996aaSopenharmony_ci  collect_module_target(_collect_target) {
755f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "install_images" ])
765f9996aaSopenharmony_ci  }
775f9996aaSopenharmony_ci
785f9996aaSopenharmony_ci  if (is_use_check_deps && !_test_target) {
795f9996aaSopenharmony_ci    _check_target = "${target_name}__check"
805f9996aaSopenharmony_ci    target_path = get_label_info(":${target_name}", "label_no_toolchain")
815f9996aaSopenharmony_ci    check_target(_check_target) {
825f9996aaSopenharmony_ci      module_deps = []
835f9996aaSopenharmony_ci      if (defined(invoker.deps)) {
845f9996aaSopenharmony_ci        module_deps += invoker.deps
855f9996aaSopenharmony_ci      }
865f9996aaSopenharmony_ci      if (defined(invoker.public_deps)) {
875f9996aaSopenharmony_ci        module_deps += invoker.public_deps
885f9996aaSopenharmony_ci      }
895f9996aaSopenharmony_ci      if (defined(invoker.external_deps)) {
905f9996aaSopenharmony_ci        module_ex_deps = invoker.external_deps
915f9996aaSopenharmony_ci      }
925f9996aaSopenharmony_ci    }
935f9996aaSopenharmony_ci  }
945f9996aaSopenharmony_ci
955f9996aaSopenharmony_ci  if (check_deps) {
965f9996aaSopenharmony_ci    deps_data = {
975f9996aaSopenharmony_ci    }
985f9996aaSopenharmony_ci    module_label = get_label_info(":${target_name}", "label_with_toolchain")
995f9996aaSopenharmony_ci    module_deps = []
1005f9996aaSopenharmony_ci    if (defined(invoker.deps)) {
1015f9996aaSopenharmony_ci      foreach(dep, invoker.deps) {
1025f9996aaSopenharmony_ci        module_deps += [ get_label_info(dep, "label_no_toolchain") ]
1035f9996aaSopenharmony_ci      }
1045f9996aaSopenharmony_ci    }
1055f9996aaSopenharmony_ci    module_ex_deps = []
1065f9996aaSopenharmony_ci    if (defined(invoker.external_deps) && invoker.external_deps != []) {
1075f9996aaSopenharmony_ci      module_ex_deps = invoker.external_deps
1085f9996aaSopenharmony_ci    }
1095f9996aaSopenharmony_ci    deps_data = {
1105f9996aaSopenharmony_ci      part_name = part_name
1115f9996aaSopenharmony_ci      module_label = module_label
1125f9996aaSopenharmony_ci      deps = module_deps
1135f9996aaSopenharmony_ci      external_deps = module_ex_deps
1145f9996aaSopenharmony_ci    }
1155f9996aaSopenharmony_ci
1165f9996aaSopenharmony_ci    write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json",
1175f9996aaSopenharmony_ci               deps_data,
1185f9996aaSopenharmony_ci               "json")
1195f9996aaSopenharmony_ci  }
1205f9996aaSopenharmony_ci
1215f9996aaSopenharmony_ci  _ohos_test = false
1225f9996aaSopenharmony_ci  if (defined(invoker.ohos_test) && invoker.ohos_test) {
1235f9996aaSopenharmony_ci    output_dir = invoker.test_output_dir
1245f9996aaSopenharmony_ci    _ohos_test = true
1255f9996aaSopenharmony_ci  } else {
1265f9996aaSopenharmony_ci    if (is_standard_system) {
1275f9996aaSopenharmony_ci      output_dir = "${root_out_dir}/${subsystem_name}/${part_name}"
1285f9996aaSopenharmony_ci    } else {
1295f9996aaSopenharmony_ci      output_dir = "${root_out_dir}"
1305f9996aaSopenharmony_ci    }
1315f9996aaSopenharmony_ci  }
1325f9996aaSopenharmony_ci
1335f9996aaSopenharmony_ci  _security_config_target = "${target_name}__security_config"
1345f9996aaSopenharmony_ci  ohos_security_config(_security_config_target) {
1355f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "auto_var_init" ])
1365f9996aaSopenharmony_ci  }
1375f9996aaSopenharmony_ci
1385f9996aaSopenharmony_ci  if (!allow_sanitize_debug && !build_xts &&
1395f9996aaSopenharmony_ci      defined(ext_sanitizer_check_list_path)) {
1405f9996aaSopenharmony_ci    build_name = "${target_name}"
1415f9996aaSopenharmony_ci    ohos_sanitizer_check("${target_name}_sanitizer_check") {
1425f9996aaSopenharmony_ci      forward_variables_from(invoker, [ "sanitize" ])
1435f9996aaSopenharmony_ci    }
1445f9996aaSopenharmony_ci  }
1455f9996aaSopenharmony_ci
1465f9996aaSopenharmony_ci  _sanitize_config_target = "${target_name}__sanitizer_config"
1475f9996aaSopenharmony_ci  ohos_sanitizer_config(_sanitize_config_target) {
1485f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "sanitize" ])
1495f9996aaSopenharmony_ci  }
1505f9996aaSopenharmony_ci
1515f9996aaSopenharmony_ci  if (!_test_target) {
1525f9996aaSopenharmony_ci    _main_target_name = target_name
1535f9996aaSopenharmony_ci    _notice_target = "${_main_target_name}__notice"
1545f9996aaSopenharmony_ci    collect_notice(_notice_target) {
1555f9996aaSopenharmony_ci      forward_variables_from(invoker,
1565f9996aaSopenharmony_ci                             [
1575f9996aaSopenharmony_ci                               "testonly",
1585f9996aaSopenharmony_ci                               "license_as_sources",
1595f9996aaSopenharmony_ci                               "license_file",
1605f9996aaSopenharmony_ci                             ])
1615f9996aaSopenharmony_ci
1625f9996aaSopenharmony_ci      module_name = _main_target_name
1635f9996aaSopenharmony_ci      module_source_dir = get_label_info(":${_main_target_name}", "dir")
1645f9996aaSopenharmony_ci    }
1655f9996aaSopenharmony_ci  }
1665f9996aaSopenharmony_ci  target_label = get_label_info(":${target_name}", "label_with_toolchain")
1675f9996aaSopenharmony_ci  target_toolchain = get_label_info(target_label, "toolchain")
1685f9996aaSopenharmony_ci
1695f9996aaSopenharmony_ci  if (!_ohos_test) {
1705f9996aaSopenharmony_ci    ohos_module_name = target_name
1715f9996aaSopenharmony_ci    _module_info_target = "${target_name}_info"
1725f9996aaSopenharmony_ci    generate_module_info(_module_info_target) {
1735f9996aaSopenharmony_ci      forward_variables_from(invoker, [ "testonly" ])
1745f9996aaSopenharmony_ci      module_name = ohos_module_name
1755f9996aaSopenharmony_ci      module_type = "bin"
1765f9996aaSopenharmony_ci
1775f9996aaSopenharmony_ci      module_source_dir = "$root_out_dir"
1785f9996aaSopenharmony_ci      if (defined(output_dir)) {
1795f9996aaSopenharmony_ci        module_source_dir = output_dir
1805f9996aaSopenharmony_ci      }
1815f9996aaSopenharmony_ci
1825f9996aaSopenharmony_ci      module_install_name = ohos_module_name
1835f9996aaSopenharmony_ci      if (defined(invoker.output_name)) {
1845f9996aaSopenharmony_ci        module_install_name = invoker.output_name
1855f9996aaSopenharmony_ci      }
1865f9996aaSopenharmony_ci
1875f9996aaSopenharmony_ci      module_install_images = [ "system" ]
1885f9996aaSopenharmony_ci      if (defined(invoker.install_images)) {
1895f9996aaSopenharmony_ci        module_install_images = []
1905f9996aaSopenharmony_ci        module_install_images += invoker.install_images
1915f9996aaSopenharmony_ci      }
1925f9996aaSopenharmony_ci
1935f9996aaSopenharmony_ci      module_output_extension = executable_extension
1945f9996aaSopenharmony_ci      if (defined(invoker.output_extension)) {
1955f9996aaSopenharmony_ci        module_output_extension = "." + invoker.output_extension
1965f9996aaSopenharmony_ci      }
1975f9996aaSopenharmony_ci
1985f9996aaSopenharmony_ci      if (is_double_framework) {
1995f9996aaSopenharmony_ci        install_enable = false
2005f9996aaSopenharmony_ci      } else {
2015f9996aaSopenharmony_ci        install_enable = true
2025f9996aaSopenharmony_ci      }
2035f9996aaSopenharmony_ci      if (defined(invoker.install_enable)) {
2045f9996aaSopenharmony_ci        install_enable = invoker.install_enable
2055f9996aaSopenharmony_ci      }
2065f9996aaSopenharmony_ci
2075f9996aaSopenharmony_ci      if (defined(invoker.module_install_dir)) {
2085f9996aaSopenharmony_ci        module_install_dir = invoker.module_install_dir
2095f9996aaSopenharmony_ci      }
2105f9996aaSopenharmony_ci
2115f9996aaSopenharmony_ci      if (defined(invoker.relative_install_dir)) {
2125f9996aaSopenharmony_ci        relative_install_dir = invoker.relative_install_dir
2135f9996aaSopenharmony_ci      }
2145f9996aaSopenharmony_ci
2155f9996aaSopenharmony_ci      if (defined(invoker.symlink_target_name)) {
2165f9996aaSopenharmony_ci        symlink_target_name = invoker.symlink_target_name
2175f9996aaSopenharmony_ci      }
2185f9996aaSopenharmony_ci
2195f9996aaSopenharmony_ci      if (defined(invoker.version_script)) {
2205f9996aaSopenharmony_ci        version_script = rebase_path(invoker.version_script, root_build_dir)
2215f9996aaSopenharmony_ci      }
2225f9996aaSopenharmony_ci      notice = "$target_out_dir/$ohos_module_name.notice.txt"
2235f9996aaSopenharmony_ci    }
2245f9996aaSopenharmony_ci    if (defined(invoker.kernel_permission_path)) {
2255f9996aaSopenharmony_ci      kernel_permission_info = []
2265f9996aaSopenharmony_ci      _kernel_permission_path =
2275f9996aaSopenharmony_ci          rebase_path(invoker.kernel_permission_path, root_build_dir)
2285f9996aaSopenharmony_ci      _module_info_file =
2295f9996aaSopenharmony_ci          rebase_path(get_label_info(target_label, "target_out_dir"),
2305f9996aaSopenharmony_ci                      root_build_dir) + "/${target_name}_module_info.json"
2315f9996aaSopenharmony_ci      kernel_permission_info_file = "${root_build_dir}/build_configs/kernel_permission/${target_name}_info_file.json"
2325f9996aaSopenharmony_ci      _output_name = ""
2335f9996aaSopenharmony_ci      if (defined(invoker.output_name)) {
2345f9996aaSopenharmony_ci        _output_name = invoker.output_name
2355f9996aaSopenharmony_ci      }
2365f9996aaSopenharmony_ci      _output_extension = ""
2375f9996aaSopenharmony_ci      if (defined(invoker.output_extension)) {
2385f9996aaSopenharmony_ci        _output_extension = "." + invoker.output_extension
2395f9996aaSopenharmony_ci      }
2405f9996aaSopenharmony_ci      kernel_permission_info += [
2415f9996aaSopenharmony_ci        {
2425f9996aaSopenharmony_ci          module_info_file = _module_info_file
2435f9996aaSopenharmony_ci          kernel_permission_path = _kernel_permission_path
2445f9996aaSopenharmony_ci          target_name = target_name
2455f9996aaSopenharmony_ci          subsystem_name = subsystem_name
2465f9996aaSopenharmony_ci          target_label = target_label
2475f9996aaSopenharmony_ci          part_name = part_name
2485f9996aaSopenharmony_ci          type = "bin"
2495f9996aaSopenharmony_ci          gn_output_name = _output_name
2505f9996aaSopenharmony_ci          gn_output_extension = _output_extension
2515f9996aaSopenharmony_ci        },
2525f9996aaSopenharmony_ci      ]
2535f9996aaSopenharmony_ci      write_file("${kernel_permission_info_file}",
2545f9996aaSopenharmony_ci                 kernel_permission_info,
2555f9996aaSopenharmony_ci                 "json")
2565f9996aaSopenharmony_ci    }
2575f9996aaSopenharmony_ci  }
2585f9996aaSopenharmony_ci
2595f9996aaSopenharmony_ci  if (!defined(invoker.stable)) {
2605f9996aaSopenharmony_ci    stable = false
2615f9996aaSopenharmony_ci  }
2625f9996aaSopenharmony_ci
2635f9996aaSopenharmony_ci  executable("${target_name}") {
2645f9996aaSopenharmony_ci    forward_variables_from(invoker,
2655f9996aaSopenharmony_ci                           "*",
2665f9996aaSopenharmony_ci                           [
2675f9996aaSopenharmony_ci                             "configs",
2685f9996aaSopenharmony_ci                             "remove_configs",
2695f9996aaSopenharmony_ci                             "static_link",
2705f9996aaSopenharmony_ci                             "install_images",
2715f9996aaSopenharmony_ci                             "module_install_dir",
2725f9996aaSopenharmony_ci                             "relative_install_dir",
2735f9996aaSopenharmony_ci                             "symlink_target_name",
2745f9996aaSopenharmony_ci                             "output_dir",
2755f9996aaSopenharmony_ci                             "install_enable",
2765f9996aaSopenharmony_ci                             "version_script",
2775f9996aaSopenharmony_ci                             "license_file",
2785f9996aaSopenharmony_ci                             "license_as_sources",
2795f9996aaSopenharmony_ci                             "use_exceptions",
2805f9996aaSopenharmony_ci                             "use_rtti",
2815f9996aaSopenharmony_ci
2825f9996aaSopenharmony_ci                             # Sanitizer variables
2835f9996aaSopenharmony_ci                             "sanitize",
2845f9996aaSopenharmony_ci                             "crate_type",
2855f9996aaSopenharmony_ci                             "stack_protector_ret",
2865f9996aaSopenharmony_ci                             "branch_protector_ret",
2875f9996aaSopenharmony_ci                             "branch_protector_frt",
2885f9996aaSopenharmony_ci                           ])
2895f9996aaSopenharmony_ci    output_dir = output_dir
2905f9996aaSopenharmony_ci
2915f9996aaSopenharmony_ci    if (defined(invoker.configs)) {
2925f9996aaSopenharmony_ci      configs += invoker.configs
2935f9996aaSopenharmony_ci    }
2945f9996aaSopenharmony_ci    if (defined(invoker.remove_configs)) {
2955f9996aaSopenharmony_ci      configs -= invoker.remove_configs
2965f9996aaSopenharmony_ci    }
2975f9996aaSopenharmony_ci    configs += [ ":$_sanitize_config_target" ]
2985f9996aaSopenharmony_ci    configs += [ ":$_security_config_target" ]
2995f9996aaSopenharmony_ci
3005f9996aaSopenharmony_ci    if (defined(invoker.use_exceptions) && invoker.use_exceptions) {
3015f9996aaSopenharmony_ci      configs += [ "//build/config/compiler:exceptions" ]
3025f9996aaSopenharmony_ci      configs -= [ "//build/config/compiler:no_exceptions" ]
3035f9996aaSopenharmony_ci    }
3045f9996aaSopenharmony_ci
3055f9996aaSopenharmony_ci    if (defined(invoker.use_rtti) && invoker.use_rtti) {
3065f9996aaSopenharmony_ci      configs += [ "//build/config/compiler:rtti" ]
3075f9996aaSopenharmony_ci      configs -= [ "//build/config/compiler:no_rtti" ]
3085f9996aaSopenharmony_ci    }
3095f9996aaSopenharmony_ci
3105f9996aaSopenharmony_ci    if (!defined(cflags)) {
3115f9996aaSopenharmony_ci      cflags = []
3125f9996aaSopenharmony_ci    }
3135f9996aaSopenharmony_ci
3145f9996aaSopenharmony_ci    # Enable branch protection.
3155f9996aaSopenharmony_ci    pac_ret = false
3165f9996aaSopenharmony_ci    bti = false
3175f9996aaSopenharmony_ci    if (defined(invoker.branch_protector_ret)) {
3185f9996aaSopenharmony_ci      if (invoker.branch_protector_ret == "pac_ret" ||
3195f9996aaSopenharmony_ci          invoker.branch_protector_ret == "stack_protector_ret_all") {
3205f9996aaSopenharmony_ci        if (support_branch_protector_pac_ret) {
3215f9996aaSopenharmony_ci          pac_ret = true
3225f9996aaSopenharmony_ci        } else if (support_stack_protector_ret) {
3235f9996aaSopenharmony_ci          foreach(config, configs) {
3245f9996aaSopenharmony_ci            if (config ==
3255f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config") {
3265f9996aaSopenharmony_ci              configs -= [
3275f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config",
3285f9996aaSopenharmony_ci              ]
3295f9996aaSopenharmony_ci            }
3305f9996aaSopenharmony_ci          }
3315f9996aaSopenharmony_ci          configs +=
3325f9996aaSopenharmony_ci              [ "//build/config/security:stack_protector_ret_all_config" ]
3335f9996aaSopenharmony_ci        }
3345f9996aaSopenharmony_ci      }
3355f9996aaSopenharmony_ci
3365f9996aaSopenharmony_ci      # Nothing to do, supported by default.
3375f9996aaSopenharmony_ci      if (support_stack_protector_ret &&
3385f9996aaSopenharmony_ci          invoker.branch_protector_ret == "stack_protector_ret_strong") {
3395f9996aaSopenharmony_ci      }
3405f9996aaSopenharmony_ci    } else {
3415f9996aaSopenharmony_ci      if (defined(invoker.stack_protector_ret)) {
3425f9996aaSopenharmony_ci        if (invoker.stack_protector_ret) {
3435f9996aaSopenharmony_ci          if (support_branch_protector_pac_ret) {
3445f9996aaSopenharmony_ci            pac_ret = true
3455f9996aaSopenharmony_ci          } else if (support_stack_protector_ret) {
3465f9996aaSopenharmony_ci            foreach(config, configs) {
3475f9996aaSopenharmony_ci              if (config ==
3485f9996aaSopenharmony_ci                  "//build/config/security:stack_protector_ret_strong_config") {
3495f9996aaSopenharmony_ci                configs -= [
3505f9996aaSopenharmony_ci                  "//build/config/security:stack_protector_ret_strong_config",
3515f9996aaSopenharmony_ci                ]
3525f9996aaSopenharmony_ci              }
3535f9996aaSopenharmony_ci            }
3545f9996aaSopenharmony_ci            configs +=
3555f9996aaSopenharmony_ci                [ "//build/config/security:stack_protector_ret_all_config" ]
3565f9996aaSopenharmony_ci          }
3575f9996aaSopenharmony_ci        } else {
3585f9996aaSopenharmony_ci          foreach(config, configs) {
3595f9996aaSopenharmony_ci            if (config ==
3605f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config") {
3615f9996aaSopenharmony_ci              configs -= [
3625f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config",
3635f9996aaSopenharmony_ci              ]
3645f9996aaSopenharmony_ci            }
3655f9996aaSopenharmony_ci          }
3665f9996aaSopenharmony_ci          configs += [ "//build/config/security:stack_protector_config" ]
3675f9996aaSopenharmony_ci        }
3685f9996aaSopenharmony_ci      }
3695f9996aaSopenharmony_ci    }
3705f9996aaSopenharmony_ci
3715f9996aaSopenharmony_ci    if (defined(invoker.branch_protector_frt)) {
3725f9996aaSopenharmony_ci      if (invoker.branch_protector_frt == "bti" &&
3735f9996aaSopenharmony_ci          support_branch_protector_bti) {
3745f9996aaSopenharmony_ci        bti = true
3755f9996aaSopenharmony_ci      }
3765f9996aaSopenharmony_ci    }
3775f9996aaSopenharmony_ci
3785f9996aaSopenharmony_ci    if (bti && pac_ret) {
3795f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=pac-ret+b-key+bti" ]
3805f9996aaSopenharmony_ci    } else if (bti && !pac_ret) {
3815f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=bti" ]
3825f9996aaSopenharmony_ci    } else if (!bti && pac_ret) {
3835f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=pac-ret+b-key" ]
3845f9996aaSopenharmony_ci    }
3855f9996aaSopenharmony_ci
3865f9996aaSopenharmony_ci    if (!defined(deps)) {
3875f9996aaSopenharmony_ci      deps = []
3885f9996aaSopenharmony_ci    }
3895f9996aaSopenharmony_ci    if (is_use_check_deps && !_test_target) {
3905f9996aaSopenharmony_ci      deps += [ ":$_check_target" ]
3915f9996aaSopenharmony_ci    }
3925f9996aaSopenharmony_ci    if (!_ohos_test && !skip_gen_module_info) {
3935f9996aaSopenharmony_ci      deps += [ ":$_module_info_target" ]
3945f9996aaSopenharmony_ci    }
3955f9996aaSopenharmony_ci
3965f9996aaSopenharmony_ci    deps += [ ":${_collect_target}" ]
3975f9996aaSopenharmony_ci
3985f9996aaSopenharmony_ci    if (!defined(libs)) {
3995f9996aaSopenharmony_ci      libs = []
4005f9996aaSopenharmony_ci    }
4015f9996aaSopenharmony_ci    if (!defined(include_dirs)) {
4025f9996aaSopenharmony_ci      include_dirs = []
4035f9996aaSopenharmony_ci    }
4045f9996aaSopenharmony_ci    if (!defined(ldflags)) {
4055f9996aaSopenharmony_ci      ldflags = []
4065f9996aaSopenharmony_ci    }
4075f9996aaSopenharmony_ci
4085f9996aaSopenharmony_ci    if (defined(visibility) && visibility != []) {
4095f9996aaSopenharmony_ci      visibility += [ "//build/*" ]
4105f9996aaSopenharmony_ci      if (defined(build_ext_path)) {
4115f9996aaSopenharmony_ci        visibility += [ "${build_ext_path}/*" ]
4125f9996aaSopenharmony_ci      }
4135f9996aaSopenharmony_ci    }
4145f9996aaSopenharmony_ci
4155f9996aaSopenharmony_ci    if (defined(invoker.static_link) && invoker.static_link) {
4165f9996aaSopenharmony_ci      no_default_deps = true
4175f9996aaSopenharmony_ci      configs -= [ "//build/config:executable_config" ]
4185f9996aaSopenharmony_ci      ldflags += [ "-static" ]
4195f9996aaSopenharmony_ci      if (is_ohos && use_musl) {
4205f9996aaSopenharmony_ci        import("//build/config/ohos/musl.gni")
4215f9996aaSopenharmony_ci        if (defined(external_deps)) {
4225f9996aaSopenharmony_ci          external_deps += [ "musl:soft_libc_musl_static" ]
4235f9996aaSopenharmony_ci        } else {
4245f9996aaSopenharmony_ci          external_deps = [ "musl:soft_libc_musl_static" ]
4255f9996aaSopenharmony_ci        }
4265f9996aaSopenharmony_ci      }
4275f9996aaSopenharmony_ci    } else if (is_ohos) {
4285f9996aaSopenharmony_ci      if (current_cpu == "arm" || current_cpu == "arm64" ||
4295f9996aaSopenharmony_ci          current_cpu == "riscv64" || current_cpu == "loongarch64") {
4305f9996aaSopenharmony_ci        libs += [ "unwind" ]
4315f9996aaSopenharmony_ci      }
4325f9996aaSopenharmony_ci      libs += [
4335f9996aaSopenharmony_ci        rebase_path(libclang_rt_file),
4345f9996aaSopenharmony_ci        "c++",
4355f9996aaSopenharmony_ci      ]
4365f9996aaSopenharmony_ci    }
4375f9996aaSopenharmony_ci
4385f9996aaSopenharmony_ci    if (!defined(output_name)) {
4395f9996aaSopenharmony_ci      output_name = target_name
4405f9996aaSopenharmony_ci    }
4415f9996aaSopenharmony_ci
4425f9996aaSopenharmony_ci    if (defined(invoker.version_script)) {
4435f9996aaSopenharmony_ci      _version_script = rebase_path(invoker.version_script, root_build_dir)
4445f9996aaSopenharmony_ci      if (!defined(ldflags)) {
4455f9996aaSopenharmony_ci        ldflags = []
4465f9996aaSopenharmony_ci      }
4475f9996aaSopenharmony_ci      ldflags += [
4485f9996aaSopenharmony_ci        "-rdynamic",
4495f9996aaSopenharmony_ci        "-Wl,--version-script=${_version_script}",
4505f9996aaSopenharmony_ci      ]
4515f9996aaSopenharmony_ci    }
4525f9996aaSopenharmony_ci
4535f9996aaSopenharmony_ci    # We don't need to change config when "is_debug==true"
4545f9996aaSopenharmony_ci    # "enable_debug_components" isn't blank means some components using debug level compilation
4555f9996aaSopenharmony_ci    if (defined(is_debug) && !is_debug && enable_debug_components != "") {
4565f9996aaSopenharmony_ci      foreach(component_name, debug_components) {
4575f9996aaSopenharmony_ci        if (part_name == component_name) {
4585f9996aaSopenharmony_ci          configs -= default_opt_configs
4595f9996aaSopenharmony_ci          configs += debug_level_configs
4605f9996aaSopenharmony_ci        }
4615f9996aaSopenharmony_ci      }
4625f9996aaSopenharmony_ci    }
4635f9996aaSopenharmony_ci    if (target_toolchain == "${current_toolchain}") {
4645f9996aaSopenharmony_ci      install_module_info = {
4655f9996aaSopenharmony_ci        module_def = target_label
4665f9996aaSopenharmony_ci        part_name = part_name
4675f9996aaSopenharmony_ci        module_info_file =
4685f9996aaSopenharmony_ci            rebase_path(get_label_info(module_def, "target_out_dir"),
4695f9996aaSopenharmony_ci                        root_build_dir) + "/${target_name}_module_info.json"
4705f9996aaSopenharmony_ci        subsystem_name = subsystem_name
4715f9996aaSopenharmony_ci        part_name = part_name
4725f9996aaSopenharmony_ci        toolchain = current_toolchain
4735f9996aaSopenharmony_ci        toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
4745f9996aaSopenharmony_ci      }
4755f9996aaSopenharmony_ci      metadata = {
4765f9996aaSopenharmony_ci        install_modules = [ install_module_info ]
4775f9996aaSopenharmony_ci      }
4785f9996aaSopenharmony_ci    }
4795f9996aaSopenharmony_ci    if (!_test_target) {
4805f9996aaSopenharmony_ci      deps += [ ":$_notice_target" ]
4815f9996aaSopenharmony_ci    }
4825f9996aaSopenharmony_ci
4835f9996aaSopenharmony_ci    module_label = get_label_info(":${target_name}", "label_with_toolchain")
4845f9996aaSopenharmony_ci
4855f9996aaSopenharmony_ci    deps_info = []
4865f9996aaSopenharmony_ci    foreach(dep, deps) {
4875f9996aaSopenharmony_ci      info = {
4885f9996aaSopenharmony_ci      }
4895f9996aaSopenharmony_ci      info = {
4905f9996aaSopenharmony_ci        target_out_dir =
4915f9996aaSopenharmony_ci            rebase_path(get_label_info(dep, "target_out_dir"), root_build_dir)
4925f9996aaSopenharmony_ci        target_name = get_label_info(dep, "name")
4935f9996aaSopenharmony_ci      }
4945f9996aaSopenharmony_ci      deps_info += [ info ]
4955f9996aaSopenharmony_ci    }
4965f9996aaSopenharmony_ci    target_deps_data = {
4975f9996aaSopenharmony_ci      label = module_label
4985f9996aaSopenharmony_ci      module_deps_info = deps_info
4995f9996aaSopenharmony_ci      module_libs = libs
5005f9996aaSopenharmony_ci      type = "executable"
5015f9996aaSopenharmony_ci      prebuilt = false
5025f9996aaSopenharmony_ci      stable = stable
5035f9996aaSopenharmony_ci      toolchain = get_label_info(":${target_name}", "toolchain")
5045f9996aaSopenharmony_ci    }
5055f9996aaSopenharmony_ci    write_file("${target_out_dir}/${target_name}_deps_data.json",
5065f9996aaSopenharmony_ci               target_deps_data,
5075f9996aaSopenharmony_ci               "json")
5085f9996aaSopenharmony_ci  }
5095f9996aaSopenharmony_ci}
5105f9996aaSopenharmony_ci
5115f9996aaSopenharmony_ci# Defines a shared_library
5125f9996aaSopenharmony_ci#
5135f9996aaSopenharmony_ci# The shared_library template is used to generated so file.
5145f9996aaSopenharmony_ci#
5155f9996aaSopenharmony_ci# Parameters
5165f9996aaSopenharmony_ci#
5175f9996aaSopenharmony_ci#   subsystem_name (required)
5185f9996aaSopenharmony_ci#   [string]
5195f9996aaSopenharmony_ci#   configs (optional)
5205f9996aaSopenharmony_ci#   [list]
5215f9996aaSopenharmony_ci#   remove_cnofigs (optional)
5225f9996aaSopenharmony_ci#   [list]
5235f9996aaSopenharmony_ci#   version_script (optional)
5245f9996aaSopenharmony_ci#   [string]
5255f9996aaSopenharmony_citemplate("ohos_shared_library") {
5265f9996aaSopenharmony_ci  assert(!defined(invoker.output_dir),
5275f9996aaSopenharmony_ci         "output_dir is not allowed to be defined.")
5285f9996aaSopenharmony_ci
5295f9996aaSopenharmony_ci  _test_target = defined(invoker.testonly) && invoker.testonly
5305f9996aaSopenharmony_ci  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
5315f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
5325f9996aaSopenharmony_ci    part_name = invoker.part_name
5335f9996aaSopenharmony_ci  } else if (defined(invoker.part_name)) {
5345f9996aaSopenharmony_ci    part_name = invoker.part_name
5355f9996aaSopenharmony_ci    _part_subsystem_info_file =
5365f9996aaSopenharmony_ci        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
5375f9996aaSopenharmony_ci    _arguments = [
5385f9996aaSopenharmony_ci      "--part-name",
5395f9996aaSopenharmony_ci      part_name,
5405f9996aaSopenharmony_ci      "--part-subsystem-info-file",
5415f9996aaSopenharmony_ci      rebase_path(_part_subsystem_info_file, root_build_dir),
5425f9996aaSopenharmony_ci    ]
5435f9996aaSopenharmony_ci    get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
5445f9996aaSopenharmony_ci    subsystem_name =
5455f9996aaSopenharmony_ci        exec_script(get_subsystem_script, _arguments, "trim string")
5465f9996aaSopenharmony_ci    if (is_use_check_deps && !_test_target) {
5475f9996aaSopenharmony_ci      skip_check_subsystem = true
5485f9996aaSopenharmony_ci    }
5495f9996aaSopenharmony_ci  } else if (defined(invoker.subsystem_name)) {
5505f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
5515f9996aaSopenharmony_ci    part_name = subsystem_name
5525f9996aaSopenharmony_ci  } else {
5535f9996aaSopenharmony_ci    subsystem_name = "build"
5545f9996aaSopenharmony_ci    part_name = "build_framework"
5555f9996aaSopenharmony_ci  }
5565f9996aaSopenharmony_ci  assert(subsystem_name != "")
5575f9996aaSopenharmony_ci  assert(part_name != "")
5585f9996aaSopenharmony_ci
5595f9996aaSopenharmony_ci  module_label = get_label_info(":${target_name}", "label_with_toolchain")
5605f9996aaSopenharmony_ci  _collect_target = "${target_name}__collect"
5615f9996aaSopenharmony_ci  collect_module_target(_collect_target) {
5625f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "install_images" ])
5635f9996aaSopenharmony_ci  }
5645f9996aaSopenharmony_ci
5655f9996aaSopenharmony_ci  if (is_use_check_deps && !_test_target) {
5665f9996aaSopenharmony_ci    _check_target = "${target_name}__check"
5675f9996aaSopenharmony_ci    target_path = get_label_info(":${target_name}", "label_no_toolchain")
5685f9996aaSopenharmony_ci    check_target(_check_target) {
5695f9996aaSopenharmony_ci      module_deps = []
5705f9996aaSopenharmony_ci      if (defined(invoker.deps)) {
5715f9996aaSopenharmony_ci        module_deps += invoker.deps
5725f9996aaSopenharmony_ci      }
5735f9996aaSopenharmony_ci      if (defined(invoker.public_deps)) {
5745f9996aaSopenharmony_ci        module_deps += invoker.public_deps
5755f9996aaSopenharmony_ci      }
5765f9996aaSopenharmony_ci      if (defined(invoker.external_deps)) {
5775f9996aaSopenharmony_ci        module_ex_deps = invoker.external_deps
5785f9996aaSopenharmony_ci      }
5795f9996aaSopenharmony_ci    }
5805f9996aaSopenharmony_ci  }
5815f9996aaSopenharmony_ci
5825f9996aaSopenharmony_ci  # auto set auto_relative_install_dir by innerapi_tags
5835f9996aaSopenharmony_ci  if (defined(invoker.innerapi_tags)) {
5845f9996aaSopenharmony_ci    is_chipsetsdk = false
5855f9996aaSopenharmony_ci    is_platformsdk = false
5865f9996aaSopenharmony_ci    is_passthrough = false
5875f9996aaSopenharmony_ci    foreach(tag, filter_include(invoker.innerapi_tags, [ "chipsetsdk*" ])) {
5885f9996aaSopenharmony_ci      is_chipsetsdk = true
5895f9996aaSopenharmony_ci    }
5905f9996aaSopenharmony_ci    foreach(tag, filter_include(invoker.innerapi_tags, [ "platformsdk*" ])) {
5915f9996aaSopenharmony_ci      is_platformsdk = true
5925f9996aaSopenharmony_ci    }
5935f9996aaSopenharmony_ci    foreach(tag, filter_include(invoker.innerapi_tags, [ "passthrough*" ])) {
5945f9996aaSopenharmony_ci      is_passthrough = true
5955f9996aaSopenharmony_ci    }
5965f9996aaSopenharmony_ci
5975f9996aaSopenharmony_ci    if (is_chipsetsdk && is_platformsdk) {
5985f9996aaSopenharmony_ci      auto_relative_install_dir = "chipset-pub-sdk"
5995f9996aaSopenharmony_ci    } else if (is_chipsetsdk) {
6005f9996aaSopenharmony_ci      auto_relative_install_dir = "chipset-sdk"
6015f9996aaSopenharmony_ci    } else if (is_platformsdk) {
6025f9996aaSopenharmony_ci      auto_relative_install_dir = "platformsdk"
6035f9996aaSopenharmony_ci    }
6045f9996aaSopenharmony_ci    if (is_passthrough) {
6055f9996aaSopenharmony_ci      auto_relative_install_dir = chipset_passthrough_dir
6065f9996aaSopenharmony_ci    }
6075f9996aaSopenharmony_ci
6085f9996aaSopenharmony_ci    is_ndk = false
6095f9996aaSopenharmony_ci    foreach(tag, filter_include(invoker.innerapi_tags, [ "ndk" ])) {
6105f9996aaSopenharmony_ci      is_ndk = true
6115f9996aaSopenharmony_ci    }
6125f9996aaSopenharmony_ci    if (is_ndk) {
6135f9996aaSopenharmony_ci      auto_relative_install_dir = "ndk"
6145f9996aaSopenharmony_ci    }
6155f9996aaSopenharmony_ci  }
6165f9996aaSopenharmony_ci
6175f9996aaSopenharmony_ci  if (check_deps) {
6185f9996aaSopenharmony_ci    deps_data = {
6195f9996aaSopenharmony_ci    }
6205f9996aaSopenharmony_ci    module_label = get_label_info(":${target_name}", "label_with_toolchain")
6215f9996aaSopenharmony_ci    module_deps = []
6225f9996aaSopenharmony_ci    if (defined(invoker.deps)) {
6235f9996aaSopenharmony_ci      foreach(dep, invoker.deps) {
6245f9996aaSopenharmony_ci        module_deps += [ get_label_info(dep, "label_no_toolchain") ]
6255f9996aaSopenharmony_ci      }
6265f9996aaSopenharmony_ci    }
6275f9996aaSopenharmony_ci    module_ex_deps = []
6285f9996aaSopenharmony_ci    if (defined(invoker.external_deps) && invoker.external_deps != []) {
6295f9996aaSopenharmony_ci      module_ex_deps = invoker.external_deps
6305f9996aaSopenharmony_ci    }
6315f9996aaSopenharmony_ci    deps_data = {
6325f9996aaSopenharmony_ci      part_name = part_name
6335f9996aaSopenharmony_ci      module_label = module_label
6345f9996aaSopenharmony_ci      deps = module_deps
6355f9996aaSopenharmony_ci      external_deps = module_ex_deps
6365f9996aaSopenharmony_ci    }
6375f9996aaSopenharmony_ci    write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json",
6385f9996aaSopenharmony_ci               deps_data,
6395f9996aaSopenharmony_ci               "json")
6405f9996aaSopenharmony_ci  }
6415f9996aaSopenharmony_ci
6425f9996aaSopenharmony_ci  if (is_standard_system) {
6435f9996aaSopenharmony_ci    output_dir = "${root_out_dir}/${subsystem_name}/${part_name}"
6445f9996aaSopenharmony_ci  } else {
6455f9996aaSopenharmony_ci    output_dir = "${root_out_dir}"
6465f9996aaSopenharmony_ci  }
6475f9996aaSopenharmony_ci
6485f9996aaSopenharmony_ci  _security_config_target = "${target_name}__security_config"
6495f9996aaSopenharmony_ci  ohos_security_config(_security_config_target) {
6505f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "auto_var_init" ])
6515f9996aaSopenharmony_ci  }
6525f9996aaSopenharmony_ci
6535f9996aaSopenharmony_ci  if (!allow_sanitize_debug && !build_xts &&
6545f9996aaSopenharmony_ci      defined(ext_sanitizer_check_list_path)) {
6555f9996aaSopenharmony_ci    build_name = "${target_name}"
6565f9996aaSopenharmony_ci    ohos_sanitizer_check("${target_name}_sanitizer_check") {
6575f9996aaSopenharmony_ci      forward_variables_from(invoker, [ "sanitize" ])
6585f9996aaSopenharmony_ci    }
6595f9996aaSopenharmony_ci  }
6605f9996aaSopenharmony_ci
6615f9996aaSopenharmony_ci  _sanitize_config_target = "${target_name}__sanitizer_config"
6625f9996aaSopenharmony_ci  ohos_sanitizer_config(_sanitize_config_target) {
6635f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "sanitize" ])
6645f9996aaSopenharmony_ci  }
6655f9996aaSopenharmony_ci
6665f9996aaSopenharmony_ci  if (!_test_target) {
6675f9996aaSopenharmony_ci    _notice_target = "${target_name}__notice"
6685f9996aaSopenharmony_ci    _main_target_name = target_name
6695f9996aaSopenharmony_ci    collect_notice(_notice_target) {
6705f9996aaSopenharmony_ci      forward_variables_from(invoker,
6715f9996aaSopenharmony_ci                             [
6725f9996aaSopenharmony_ci                               "testonly",
6735f9996aaSopenharmony_ci                               "license_as_sources",
6745f9996aaSopenharmony_ci                               "license_file",
6755f9996aaSopenharmony_ci                             ])
6765f9996aaSopenharmony_ci
6775f9996aaSopenharmony_ci      module_name = _main_target_name
6785f9996aaSopenharmony_ci      module_source_dir = get_label_info(":${_main_target_name}", "dir")
6795f9996aaSopenharmony_ci    }
6805f9996aaSopenharmony_ci  }
6815f9996aaSopenharmony_ci
6825f9996aaSopenharmony_ci  target_label = get_label_info(":${target_name}", "label_with_toolchain")
6835f9996aaSopenharmony_ci  target_toolchain = get_label_info(target_label, "toolchain")
6845f9996aaSopenharmony_ci
6855f9996aaSopenharmony_ci  if (target_toolchain == "${current_toolchain}") {
6865f9996aaSopenharmony_ci    ohos_module_name = target_name
6875f9996aaSopenharmony_ci    _module_info_target = "${target_name}_info"
6885f9996aaSopenharmony_ci    generate_module_info(_module_info_target) {
6895f9996aaSopenharmony_ci      forward_variables_from(invoker, [ "testonly" ])
6905f9996aaSopenharmony_ci      module_name = ohos_module_name
6915f9996aaSopenharmony_ci      module_type = "lib"
6925f9996aaSopenharmony_ci      module_source_dir = "$root_out_dir"
6935f9996aaSopenharmony_ci      if (defined(output_dir)) {
6945f9996aaSopenharmony_ci        module_source_dir = output_dir
6955f9996aaSopenharmony_ci      }
6965f9996aaSopenharmony_ci
6975f9996aaSopenharmony_ci      module_install_name = ohos_module_name
6985f9996aaSopenharmony_ci      if (defined(invoker.output_name)) {
6995f9996aaSopenharmony_ci        module_install_name = invoker.output_name
7005f9996aaSopenharmony_ci      }
7015f9996aaSopenharmony_ci
7025f9996aaSopenharmony_ci      module_install_images = [ "system" ]
7035f9996aaSopenharmony_ci      if (defined(invoker.install_images)) {
7045f9996aaSopenharmony_ci        module_install_images = []
7055f9996aaSopenharmony_ci        module_install_images += invoker.install_images
7065f9996aaSopenharmony_ci      }
7075f9996aaSopenharmony_ci
7085f9996aaSopenharmony_ci      module_output_extension = shlib_extension
7095f9996aaSopenharmony_ci      if (defined(invoker.output_extension)) {
7105f9996aaSopenharmony_ci        module_output_extension = "." + invoker.output_extension
7115f9996aaSopenharmony_ci      }
7125f9996aaSopenharmony_ci
7135f9996aaSopenharmony_ci      install_enable = true
7145f9996aaSopenharmony_ci      if (defined(invoker.install_enable)) {
7155f9996aaSopenharmony_ci        install_enable = invoker.install_enable
7165f9996aaSopenharmony_ci      }
7175f9996aaSopenharmony_ci
7185f9996aaSopenharmony_ci      if (defined(invoker.module_install_dir)) {
7195f9996aaSopenharmony_ci        module_install_dir = invoker.module_install_dir
7205f9996aaSopenharmony_ci      }
7215f9996aaSopenharmony_ci
7225f9996aaSopenharmony_ci      if (defined(invoker.symlink_target_name)) {
7235f9996aaSopenharmony_ci        symlink_target_name = invoker.symlink_target_name
7245f9996aaSopenharmony_ci      }
7255f9996aaSopenharmony_ci
7265f9996aaSopenharmony_ci      if (defined(invoker.output_prefix_override)) {
7275f9996aaSopenharmony_ci        output_prefix_override = invoker.output_prefix_override
7285f9996aaSopenharmony_ci      }
7295f9996aaSopenharmony_ci      notice = "$target_out_dir/$ohos_module_name.notice.txt"
7305f9996aaSopenharmony_ci
7315f9996aaSopenharmony_ci      # update relative_install_dir if auto_relative_install_dir defined
7325f9996aaSopenharmony_ci      if (defined(auto_relative_install_dir)) {
7335f9996aaSopenharmony_ci        relative_install_dir = auto_relative_install_dir
7345f9996aaSopenharmony_ci      }
7355f9996aaSopenharmony_ci
7365f9996aaSopenharmony_ci      # update relative_install_dir if relative_install_dir defined in BUILD.gn
7375f9996aaSopenharmony_ci      if (defined(invoker.relative_install_dir)) {
7385f9996aaSopenharmony_ci        relative_install_dir = invoker.relative_install_dir
7395f9996aaSopenharmony_ci      }
7405f9996aaSopenharmony_ci
7415f9996aaSopenharmony_ci      # Passing shlib_type and innerapi_tags to generate_module_info
7425f9996aaSopenharmony_ci      if (defined(invoker.shlib_type)) {
7435f9996aaSopenharmony_ci        invalid = true
7445f9996aaSopenharmony_ci        valid_types = [
7455f9996aaSopenharmony_ci          "sa",
7465f9996aaSopenharmony_ci          "sa_stub",
7475f9996aaSopenharmony_ci          "sa_proxy",
7485f9996aaSopenharmony_ci          "hdi",
7495f9996aaSopenharmony_ci          "hdi_stub",
7505f9996aaSopenharmony_ci          "hdi_proxy",
7515f9996aaSopenharmony_ci          "innerapi",
7525f9996aaSopenharmony_ci          "napi",
7535f9996aaSopenharmony_ci        ]
7545f9996aaSopenharmony_ci        foreach(t, filter_include(valid_types, [ invoker.shlib_type ])) {
7555f9996aaSopenharmony_ci          if (t == invoker.shlib_type) {
7565f9996aaSopenharmony_ci            invalid = false
7575f9996aaSopenharmony_ci          }
7585f9996aaSopenharmony_ci        }
7595f9996aaSopenharmony_ci        shlib_type = invoker.shlib_type
7605f9996aaSopenharmony_ci        assert(
7615f9996aaSopenharmony_ci            invalid != true,
7625f9996aaSopenharmony_ci            "$target_label has invalid shlib_type value: $shlib_type, allowed values: $valid_types")
7635f9996aaSopenharmony_ci      }
7645f9996aaSopenharmony_ci      if (defined(invoker.innerapi_tags)) {
7655f9996aaSopenharmony_ci        invalid = false
7665f9996aaSopenharmony_ci        valid_tags = [
7675f9996aaSopenharmony_ci          "ndk",
7685f9996aaSopenharmony_ci          "chipsetsdk",
7695f9996aaSopenharmony_ci          "chipsetsdk_indirect",
7705f9996aaSopenharmony_ci          "platformsdk",
7715f9996aaSopenharmony_ci          "platformsdk_indirect",
7725f9996aaSopenharmony_ci          "passthrough",
7735f9996aaSopenharmony_ci          "passthrough_indirect",
7745f9996aaSopenharmony_ci          "sasdk",
7755f9996aaSopenharmony_ci        ]
7765f9996aaSopenharmony_ci        foreach(tag, filter_exclude(invoker.innerapi_tags, valid_tags)) {
7775f9996aaSopenharmony_ci          if (tag != "") {
7785f9996aaSopenharmony_ci            invalid = true
7795f9996aaSopenharmony_ci          }
7805f9996aaSopenharmony_ci        }
7815f9996aaSopenharmony_ci        innerapi_tags = invoker.innerapi_tags
7825f9996aaSopenharmony_ci        assert(
7835f9996aaSopenharmony_ci            invalid != true,
7845f9996aaSopenharmony_ci            "$target_label has invalid innerapi_tags $innerapi_tags, allowed values: $valid_tags")
7855f9996aaSopenharmony_ci      }
7865f9996aaSopenharmony_ci
7875f9996aaSopenharmony_ci      if (defined(invoker.version_script)) {
7885f9996aaSopenharmony_ci        version_script = rebase_path(invoker.version_script, root_build_dir)
7895f9996aaSopenharmony_ci      }
7905f9996aaSopenharmony_ci    }
7915f9996aaSopenharmony_ci  }
7925f9996aaSopenharmony_ci
7935f9996aaSopenharmony_ci  if (!defined(invoker.stable)) {
7945f9996aaSopenharmony_ci    stable = false
7955f9996aaSopenharmony_ci  }
7965f9996aaSopenharmony_ci
7975f9996aaSopenharmony_ci  if (defined(invoker.kernel_permission_path)) {
7985f9996aaSopenharmony_ci    kernel_permission_info = []
7995f9996aaSopenharmony_ci    _kernel_permission_path =
8005f9996aaSopenharmony_ci        rebase_path(invoker.kernel_permission_path, root_build_dir)
8015f9996aaSopenharmony_ci    _module_info_file =
8025f9996aaSopenharmony_ci        rebase_path(get_label_info(target_label, "target_out_dir"),
8035f9996aaSopenharmony_ci                    root_build_dir) + "/${target_name}_module_info.json"
8045f9996aaSopenharmony_ci    kernel_permission_info_file = "${root_build_dir}/build_configs/kernel_permission/${target_name}_info_file.json"
8055f9996aaSopenharmony_ci    _output_name = ""
8065f9996aaSopenharmony_ci    if (defined(invoker.output_name)) {
8075f9996aaSopenharmony_ci      _output_name = invoker.output_name
8085f9996aaSopenharmony_ci    }
8095f9996aaSopenharmony_ci    _output_extension = ""
8105f9996aaSopenharmony_ci    if (defined(invoker.output_extension)) {
8115f9996aaSopenharmony_ci      _output_extension = "." + invoker.output_extension
8125f9996aaSopenharmony_ci    }
8135f9996aaSopenharmony_ci    kernel_permission_info += [
8145f9996aaSopenharmony_ci      {
8155f9996aaSopenharmony_ci        module_info_file = _module_info_file
8165f9996aaSopenharmony_ci        kernel_permission_path = _kernel_permission_path
8175f9996aaSopenharmony_ci        target_name = target_name
8185f9996aaSopenharmony_ci        subsystem_name = subsystem_name
8195f9996aaSopenharmony_ci        target_label = target_label
8205f9996aaSopenharmony_ci        part_name = part_name
8215f9996aaSopenharmony_ci        type = "lib"
8225f9996aaSopenharmony_ci        gn_output_name = _output_name
8235f9996aaSopenharmony_ci        gn_output_extension = _output_extension
8245f9996aaSopenharmony_ci      },
8255f9996aaSopenharmony_ci    ]
8265f9996aaSopenharmony_ci    write_file("${kernel_permission_info_file}", kernel_permission_info, "json")
8275f9996aaSopenharmony_ci  }
8285f9996aaSopenharmony_ci
8295f9996aaSopenharmony_ci  shared_library("${target_name}") {
8305f9996aaSopenharmony_ci    forward_variables_from(invoker,
8315f9996aaSopenharmony_ci                           "*",
8325f9996aaSopenharmony_ci                           [
8335f9996aaSopenharmony_ci                             "configs",
8345f9996aaSopenharmony_ci                             "remove_configs",
8355f9996aaSopenharmony_ci                             "no_default_deps",
8365f9996aaSopenharmony_ci                             "install_images",
8375f9996aaSopenharmony_ci                             "module_install_dir",
8385f9996aaSopenharmony_ci                             "relative_install_dir",
8395f9996aaSopenharmony_ci                             "symlink_target_name",
8405f9996aaSopenharmony_ci                             "output_dir",
8415f9996aaSopenharmony_ci                             "install_enable",
8425f9996aaSopenharmony_ci                             "version_script",
8435f9996aaSopenharmony_ci                             "exported_symbols_list",
8445f9996aaSopenharmony_ci                             "license_file",
8455f9996aaSopenharmony_ci                             "license_as_sources",
8465f9996aaSopenharmony_ci                             "use_exceptions",
8475f9996aaSopenharmony_ci                             "use_rtti",
8485f9996aaSopenharmony_ci                             "stl",
8495f9996aaSopenharmony_ci
8505f9996aaSopenharmony_ci                             # Sanitizer variables
8515f9996aaSopenharmony_ci                             "sanitize",
8525f9996aaSopenharmony_ci                             "stack_protector_ret",
8535f9996aaSopenharmony_ci                             "branch_protector_ret",
8545f9996aaSopenharmony_ci                             "branch_protector_frt",
8555f9996aaSopenharmony_ci                           ])
8565f9996aaSopenharmony_ci    output_dir = output_dir
8575f9996aaSopenharmony_ci
8585f9996aaSopenharmony_ci    if (!defined(inputs)) {
8595f9996aaSopenharmony_ci      inputs = []
8605f9996aaSopenharmony_ci    }
8615f9996aaSopenharmony_ci
8625f9996aaSopenharmony_ci    if (!defined(ldflags)) {
8635f9996aaSopenharmony_ci      ldflags = []
8645f9996aaSopenharmony_ci    }
8655f9996aaSopenharmony_ci
8665f9996aaSopenharmony_ci    if (defined(invoker.configs)) {
8675f9996aaSopenharmony_ci      configs += invoker.configs
8685f9996aaSopenharmony_ci    }
8695f9996aaSopenharmony_ci    if (defined(invoker.remove_configs)) {
8705f9996aaSopenharmony_ci      configs -= invoker.remove_configs
8715f9996aaSopenharmony_ci    }
8725f9996aaSopenharmony_ci
8735f9996aaSopenharmony_ci    configs += [ ":$_sanitize_config_target" ]
8745f9996aaSopenharmony_ci    configs += [ ":$_security_config_target" ]
8755f9996aaSopenharmony_ci
8765f9996aaSopenharmony_ci    if (defined(invoker.use_exceptions) && invoker.use_exceptions) {
8775f9996aaSopenharmony_ci      configs += [ "//build/config/compiler:exceptions" ]
8785f9996aaSopenharmony_ci      configs -= [ "//build/config/compiler:no_exceptions" ]
8795f9996aaSopenharmony_ci    }
8805f9996aaSopenharmony_ci
8815f9996aaSopenharmony_ci    if (defined(invoker.use_rtti) && invoker.use_rtti) {
8825f9996aaSopenharmony_ci      configs += [ "//build/config/compiler:rtti" ]
8835f9996aaSopenharmony_ci      configs -= [ "//build/config/compiler:no_rtti" ]
8845f9996aaSopenharmony_ci    }
8855f9996aaSopenharmony_ci
8865f9996aaSopenharmony_ci    if (!defined(cflags)) {
8875f9996aaSopenharmony_ci      cflags = []
8885f9996aaSopenharmony_ci    }
8895f9996aaSopenharmony_ci
8905f9996aaSopenharmony_ci    if (defined(visibility) && visibility != []) {
8915f9996aaSopenharmony_ci      visibility += [ "//build/*" ]
8925f9996aaSopenharmony_ci      if (defined(build_ext_path)) {
8935f9996aaSopenharmony_ci        visibility += [ "${build_ext_path}/*" ]
8945f9996aaSopenharmony_ci      }
8955f9996aaSopenharmony_ci    }
8965f9996aaSopenharmony_ci
8975f9996aaSopenharmony_ci    # Enable branch protection.
8985f9996aaSopenharmony_ci    pac_ret = false
8995f9996aaSopenharmony_ci    bti = false
9005f9996aaSopenharmony_ci    if (defined(invoker.branch_protector_ret)) {
9015f9996aaSopenharmony_ci      if (invoker.branch_protector_ret == "pac_ret" ||
9025f9996aaSopenharmony_ci          invoker.branch_protector_ret == "stack_protector_ret_all") {
9035f9996aaSopenharmony_ci        if (support_branch_protector_pac_ret) {
9045f9996aaSopenharmony_ci          pac_ret = true
9055f9996aaSopenharmony_ci        } else if (support_stack_protector_ret) {
9065f9996aaSopenharmony_ci          foreach(config, configs) {
9075f9996aaSopenharmony_ci            if (config ==
9085f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config") {
9095f9996aaSopenharmony_ci              configs -= [
9105f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config",
9115f9996aaSopenharmony_ci              ]
9125f9996aaSopenharmony_ci            }
9135f9996aaSopenharmony_ci          }
9145f9996aaSopenharmony_ci          configs +=
9155f9996aaSopenharmony_ci              [ "//build/config/security:stack_protector_ret_all_config" ]
9165f9996aaSopenharmony_ci        }
9175f9996aaSopenharmony_ci      }
9185f9996aaSopenharmony_ci
9195f9996aaSopenharmony_ci      # Nothing to do, supported by default.
9205f9996aaSopenharmony_ci      if (support_stack_protector_ret &&
9215f9996aaSopenharmony_ci          invoker.branch_protector_ret == "stack_protector_ret_strong") {
9225f9996aaSopenharmony_ci      }
9235f9996aaSopenharmony_ci    } else {
9245f9996aaSopenharmony_ci      if (defined(invoker.stack_protector_ret)) {
9255f9996aaSopenharmony_ci        if (invoker.stack_protector_ret) {
9265f9996aaSopenharmony_ci          if (support_branch_protector_pac_ret) {
9275f9996aaSopenharmony_ci            pac_ret = true
9285f9996aaSopenharmony_ci          } else if (support_stack_protector_ret) {
9295f9996aaSopenharmony_ci            foreach(config, configs) {
9305f9996aaSopenharmony_ci              if (config ==
9315f9996aaSopenharmony_ci                  "//build/config/security:stack_protector_ret_strong_config") {
9325f9996aaSopenharmony_ci                configs -= [
9335f9996aaSopenharmony_ci                  "//build/config/security:stack_protector_ret_strong_config",
9345f9996aaSopenharmony_ci                ]
9355f9996aaSopenharmony_ci              }
9365f9996aaSopenharmony_ci            }
9375f9996aaSopenharmony_ci            configs +=
9385f9996aaSopenharmony_ci                [ "//build/config/security:stack_protector_ret_all_config" ]
9395f9996aaSopenharmony_ci          }
9405f9996aaSopenharmony_ci        } else {
9415f9996aaSopenharmony_ci          foreach(config, configs) {
9425f9996aaSopenharmony_ci            if (config ==
9435f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config") {
9445f9996aaSopenharmony_ci              configs -= [
9455f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config",
9465f9996aaSopenharmony_ci              ]
9475f9996aaSopenharmony_ci            }
9485f9996aaSopenharmony_ci          }
9495f9996aaSopenharmony_ci          configs += [ "//build/config/security:stack_protector_config" ]
9505f9996aaSopenharmony_ci        }
9515f9996aaSopenharmony_ci      }
9525f9996aaSopenharmony_ci    }
9535f9996aaSopenharmony_ci
9545f9996aaSopenharmony_ci    if (defined(invoker.branch_protector_frt)) {
9555f9996aaSopenharmony_ci      if (invoker.branch_protector_frt == "bti" &&
9565f9996aaSopenharmony_ci          support_branch_protector_bti) {
9575f9996aaSopenharmony_ci        bti = true
9585f9996aaSopenharmony_ci      }
9595f9996aaSopenharmony_ci    }
9605f9996aaSopenharmony_ci
9615f9996aaSopenharmony_ci    if (bti && pac_ret) {
9625f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=pac-ret+b-key+bti" ]
9635f9996aaSopenharmony_ci    } else if (bti && !pac_ret) {
9645f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=bti" ]
9655f9996aaSopenharmony_ci    } else if (!bti && pac_ret) {
9665f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=pac-ret+b-key" ]
9675f9996aaSopenharmony_ci    }
9685f9996aaSopenharmony_ci
9695f9996aaSopenharmony_ci    # check whether to add adlt configs
9705f9996aaSopenharmony_ci    install_enable = true
9715f9996aaSopenharmony_ci    if (defined(invoker.install_enable)) {
9725f9996aaSopenharmony_ci      install_enable = invoker.install_enable
9735f9996aaSopenharmony_ci    }
9745f9996aaSopenharmony_ci    if (install_enable && enable_adlt && is_standard_system &&
9755f9996aaSopenharmony_ci        target_toolchain == "${current_toolchain}" && is_ohos) {
9765f9996aaSopenharmony_ci      inputs_args = []
9775f9996aaSopenharmony_ci      if (target_cpu == "arm64" || target_cpu == "x86_64") {
9785f9996aaSopenharmony_ci        module_type = "lib64"
9795f9996aaSopenharmony_ci      } else if (target_cpu == "arm" || target_cpu == "x86") {
9805f9996aaSopenharmony_ci        module_type = "lib"
9815f9996aaSopenharmony_ci      } else {
9825f9996aaSopenharmony_ci        assert(false, "Unsupported target_cpu: $target_cpu")
9835f9996aaSopenharmony_ci      }
9845f9996aaSopenharmony_ci      inputs_args += [
9855f9996aaSopenharmony_ci        "--type",
9865f9996aaSopenharmony_ci        module_type,
9875f9996aaSopenharmony_ci        "--system-base-dir",
9885f9996aaSopenharmony_ci        system_base_dir,
9895f9996aaSopenharmony_ci      ]
9905f9996aaSopenharmony_ci
9915f9996aaSopenharmony_ci      module_install_name = target_name
9925f9996aaSopenharmony_ci      if (defined(invoker.output_name)) {
9935f9996aaSopenharmony_ci        module_install_name = invoker.output_name
9945f9996aaSopenharmony_ci      }
9955f9996aaSopenharmony_ci      inputs_args += [
9965f9996aaSopenharmony_ci        "--install-name",
9975f9996aaSopenharmony_ci        module_install_name,
9985f9996aaSopenharmony_ci      ]
9995f9996aaSopenharmony_ci
10005f9996aaSopenharmony_ci      module_install_images = [ "system" ]
10015f9996aaSopenharmony_ci      if (defined(invoker.install_images)) {
10025f9996aaSopenharmony_ci        module_install_images = []
10035f9996aaSopenharmony_ci        module_install_images += invoker.install_images
10045f9996aaSopenharmony_ci      }
10055f9996aaSopenharmony_ci      inputs_args += [ "--install-images" ]
10065f9996aaSopenharmony_ci      inputs_args += module_install_images
10075f9996aaSopenharmony_ci
10085f9996aaSopenharmony_ci      if (defined(invoker.module_install_dir) &&
10095f9996aaSopenharmony_ci          invoker.module_install_dir != "") {
10105f9996aaSopenharmony_ci        inputs_args += [
10115f9996aaSopenharmony_ci          "--module-install-dir",
10125f9996aaSopenharmony_ci          invoker.module_install_dir,
10135f9996aaSopenharmony_ci        ]
10145f9996aaSopenharmony_ci      }
10155f9996aaSopenharmony_ci      if (defined(invoker.relative_install_dir)) {
10165f9996aaSopenharmony_ci        relative_install_dir = invoker.relative_install_dir
10175f9996aaSopenharmony_ci      }
10185f9996aaSopenharmony_ci      if (defined(auto_relative_install_dir)) {
10195f9996aaSopenharmony_ci        relative_install_dir = auto_relative_install_dir
10205f9996aaSopenharmony_ci      }
10215f9996aaSopenharmony_ci      if (defined(relative_install_dir) && relative_install_dir != "") {
10225f9996aaSopenharmony_ci        inputs_args += [
10235f9996aaSopenharmony_ci          "--relative-install-dir",
10245f9996aaSopenharmony_ci          relative_install_dir,
10255f9996aaSopenharmony_ci        ]
10265f9996aaSopenharmony_ci      }
10275f9996aaSopenharmony_ci
10285f9996aaSopenharmony_ci      module_output_extension = shlib_extension
10295f9996aaSopenharmony_ci      if (defined(invoker.output_extension)) {
10305f9996aaSopenharmony_ci        module_output_extension = "." + invoker.output_extension
10315f9996aaSopenharmony_ci      }
10325f9996aaSopenharmony_ci      if (module_output_extension != "") {
10335f9996aaSopenharmony_ci        inputs_args += [
10345f9996aaSopenharmony_ci          "--suffix",
10355f9996aaSopenharmony_ci          module_output_extension,
10365f9996aaSopenharmony_ci        ]
10375f9996aaSopenharmony_ci      }
10385f9996aaSopenharmony_ci
10395f9996aaSopenharmony_ci      if (defined(invoker.output_prefix_override) &&
10405f9996aaSopenharmony_ci          invoker.output_prefix_override) {
10415f9996aaSopenharmony_ci        inputs_args += [ "--prefix-override" ]
10425f9996aaSopenharmony_ci      }
10435f9996aaSopenharmony_ci      inputs_args += [
10445f9996aaSopenharmony_ci        "--allowed-lib-list",
10455f9996aaSopenharmony_ci        rebase_path(allowed_lib_list),
10465f9996aaSopenharmony_ci      ]
10475f9996aaSopenharmony_ci      result = exec_script("//build/ohos/images/get_module_install_dest.py",
10485f9996aaSopenharmony_ci                           inputs_args,
10495f9996aaSopenharmony_ci                           "string")
10505f9996aaSopenharmony_ci      if (result == "") {
10515f9996aaSopenharmony_ci        configs += [ "//build/config/ohos:adlt_config" ]
10525f9996aaSopenharmony_ci      }
10535f9996aaSopenharmony_ci    }
10545f9996aaSopenharmony_ci
10555f9996aaSopenharmony_ci    if (!defined(output_name)) {
10565f9996aaSopenharmony_ci      output_name = target_name
10575f9996aaSopenharmony_ci    }
10585f9996aaSopenharmony_ci
10595f9996aaSopenharmony_ci    if (defined(invoker.no_default_deps)) {
10605f9996aaSopenharmony_ci      no_default_deps = invoker.no_default_deps
10615f9996aaSopenharmony_ci    }
10625f9996aaSopenharmony_ci
10635f9996aaSopenharmony_ci    if (defined(invoker.version_script)) {
10645f9996aaSopenharmony_ci      _version_script = rebase_path(invoker.version_script, root_build_dir)
10655f9996aaSopenharmony_ci      inputs += [ invoker.version_script ]
10665f9996aaSopenharmony_ci      ldflags += [ "-Wl,--version-script=${_version_script}" ]
10675f9996aaSopenharmony_ci    }
10685f9996aaSopenharmony_ci
10695f9996aaSopenharmony_ci    if (target_os == "ios" && defined(invoker.exported_symbols_list)) {
10705f9996aaSopenharmony_ci      _exported_symbols_list =
10715f9996aaSopenharmony_ci          rebase_path(invoker.exported_symbols_list, root_build_dir)
10725f9996aaSopenharmony_ci      inputs += [ invoker.exported_symbols_list ]
10735f9996aaSopenharmony_ci      ldflags += [
10745f9996aaSopenharmony_ci        "-exported_symbols_list",
10755f9996aaSopenharmony_ci        "${_exported_symbols_list}",
10765f9996aaSopenharmony_ci      ]
10775f9996aaSopenharmony_ci    }
10785f9996aaSopenharmony_ci
10795f9996aaSopenharmony_ci    if (!defined(ldflags)) {
10805f9996aaSopenharmony_ci      ldflags = []
10815f9996aaSopenharmony_ci    }
10825f9996aaSopenharmony_ci    if (!defined(libs)) {
10835f9996aaSopenharmony_ci      libs = []
10845f9996aaSopenharmony_ci    }
10855f9996aaSopenharmony_ci    if (!defined(cflags_cc)) {
10865f9996aaSopenharmony_ci      cflags_cc = []
10875f9996aaSopenharmony_ci    }
10885f9996aaSopenharmony_ci    if (!defined(deps)) {
10895f9996aaSopenharmony_ci      deps = []
10905f9996aaSopenharmony_ci    }
10915f9996aaSopenharmony_ci    if (is_use_check_deps && !_test_target) {
10925f9996aaSopenharmony_ci      deps += [ ":$_check_target" ]
10935f9996aaSopenharmony_ci    }
10945f9996aaSopenharmony_ci    if (target_toolchain == "${current_toolchain}" && !skip_gen_module_info) {
10955f9996aaSopenharmony_ci      deps += [ ":$_module_info_target" ]
10965f9996aaSopenharmony_ci    }
10975f9996aaSopenharmony_ci
10985f9996aaSopenharmony_ci    deps += [ ":${_collect_target}" ]
10995f9996aaSopenharmony_ci    if (is_ohos) {
11005f9996aaSopenharmony_ci      if (defined(invoker.stl)) {
11015f9996aaSopenharmony_ci        cflags_cc += [
11025f9996aaSopenharmony_ci          "-nostdinc++",
11035f9996aaSopenharmony_ci          "-I" + rebase_path(
11045f9996aaSopenharmony_ci                  "${toolchains_dir}/${host_platform_dir}/llvm_ndk/include/libcxx-ohos/include/c++/v1",
11055f9996aaSopenharmony_ci                  root_build_dir),
11065f9996aaSopenharmony_ci        ]
11075f9996aaSopenharmony_ci        ldflags += [
11085f9996aaSopenharmony_ci          "-nostdlib++",
11095f9996aaSopenharmony_ci          "-L" + rebase_path("${clang_stl_path}/${abi_target}", root_build_dir),
11105f9996aaSopenharmony_ci        ]
11115f9996aaSopenharmony_ci
11125f9996aaSopenharmony_ci        libs += [ invoker.stl ]
11135f9996aaSopenharmony_ci      } else {
11145f9996aaSopenharmony_ci        if (current_cpu == "arm" || current_cpu == "arm64" ||
11155f9996aaSopenharmony_ci            current_cpu == "riscv64" || current_cpu == "loongarch64") {
11165f9996aaSopenharmony_ci          libs += [ "unwind" ]
11175f9996aaSopenharmony_ci        }
11185f9996aaSopenharmony_ci
11195f9996aaSopenharmony_ci        if (target_name != "libpcre2" && target_name != "libselinux" &&
11205f9996aaSopenharmony_ci            target_name != "libsec_shared" && target_name != "libsepol") {
11215f9996aaSopenharmony_ci          libs += [ "c++" ]
11225f9996aaSopenharmony_ci        }
11235f9996aaSopenharmony_ci      }
11245f9996aaSopenharmony_ci    }
11255f9996aaSopenharmony_ci
11265f9996aaSopenharmony_ci    if (!_test_target) {
11275f9996aaSopenharmony_ci      deps += [ ":$_notice_target" ]
11285f9996aaSopenharmony_ci    }
11295f9996aaSopenharmony_ci    if (!defined(include_dirs)) {
11305f9996aaSopenharmony_ci      include_dirs = []
11315f9996aaSopenharmony_ci    }
11325f9996aaSopenharmony_ci
11335f9996aaSopenharmony_ci    install_module_info = {
11345f9996aaSopenharmony_ci      module_def = target_label
11355f9996aaSopenharmony_ci      module_info_file =
11365f9996aaSopenharmony_ci          rebase_path(get_label_info(module_def, "target_out_dir"),
11375f9996aaSopenharmony_ci                      root_build_dir) + "/${target_name}_module_info.json"
11385f9996aaSopenharmony_ci      subsystem_name = subsystem_name
11395f9996aaSopenharmony_ci      part_name = part_name
11405f9996aaSopenharmony_ci      toolchain = current_toolchain
11415f9996aaSopenharmony_ci      toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
11425f9996aaSopenharmony_ci    }
11435f9996aaSopenharmony_ci    metadata = {
11445f9996aaSopenharmony_ci      install_modules = [ install_module_info ]
11455f9996aaSopenharmony_ci    }
11465f9996aaSopenharmony_ci    if (defined(is_debug) && !is_debug && enable_debug_components != "") {
11475f9996aaSopenharmony_ci      foreach(component_name, debug_components) {
11485f9996aaSopenharmony_ci        if (part_name == component_name) {
11495f9996aaSopenharmony_ci          configs -= default_opt_configs
11505f9996aaSopenharmony_ci          configs += debug_level_configs
11515f9996aaSopenharmony_ci        }
11525f9996aaSopenharmony_ci      }
11535f9996aaSopenharmony_ci    }
11545f9996aaSopenharmony_ci
11555f9996aaSopenharmony_ci    # Hide symbols for all sa libraries if not specified by version_script
11565f9996aaSopenharmony_ci    if (defined(invoker.shlib_type) && invoker.shlib_type == "sa") {
11575f9996aaSopenharmony_ci      if (!defined(invoker.version_script)) {
11585f9996aaSopenharmony_ci        _version_script =
11595f9996aaSopenharmony_ci            rebase_path("//build/templates/cxx/singleton.versionscript")
11605f9996aaSopenharmony_ci        inputs += [ _version_script ]
11615f9996aaSopenharmony_ci        ldflags += [ "-Wl,--version-script=${_version_script}" ]
11625f9996aaSopenharmony_ci      }
11635f9996aaSopenharmony_ci    }
11645f9996aaSopenharmony_ci
11655f9996aaSopenharmony_ci    # Set version_script for hdi service libraries
11665f9996aaSopenharmony_ci    if (defined(invoker.shlib_type) && invoker.shlib_type == "hdi") {
11675f9996aaSopenharmony_ci      if (!defined(invoker.version_script)) {
11685f9996aaSopenharmony_ci        _version_script = rebase_path("//build/templates/cxx/hdi.versionscript")
11695f9996aaSopenharmony_ci        inputs += [ _version_script ]
11705f9996aaSopenharmony_ci        ldflags += [ "-Wl,--version-script=${_version_script}" ]
11715f9996aaSopenharmony_ci      }
11725f9996aaSopenharmony_ci    }
11735f9996aaSopenharmony_ci
11745f9996aaSopenharmony_ci    module_type_napi = false
11755f9996aaSopenharmony_ci    if (defined(invoker.relative_install_dir) &&
11765f9996aaSopenharmony_ci        (build_ohos_sdk != true && build_ohos_ndk != true)) {
11775f9996aaSopenharmony_ci      relative_paths = string_split(invoker.relative_install_dir, "/")
11785f9996aaSopenharmony_ci      foreach(p, relative_paths) {
11795f9996aaSopenharmony_ci        if (p == "module") {
11805f9996aaSopenharmony_ci          module_type_napi = true
11815f9996aaSopenharmony_ci        }
11825f9996aaSopenharmony_ci      }
11835f9996aaSopenharmony_ci      if (module_type_napi) {
11845f9996aaSopenharmony_ci        foreach(m, filter_include(napi_white_list, [ target_name ])) {
11855f9996aaSopenharmony_ci          if (m == target_name) {
11865f9996aaSopenharmony_ci            module_type_napi = false
11875f9996aaSopenharmony_ci          }
11885f9996aaSopenharmony_ci        }
11895f9996aaSopenharmony_ci      }
11905f9996aaSopenharmony_ci    }
11915f9996aaSopenharmony_ci    if (module_type_napi) {
11925f9996aaSopenharmony_ci      if (!defined(invoker.version_script)) {
11935f9996aaSopenharmony_ci        _version_script =
11945f9996aaSopenharmony_ci            rebase_path("//build/templates/cxx/napi.versionscript")
11955f9996aaSopenharmony_ci        inputs += [ _version_script ]
11965f9996aaSopenharmony_ci        ldflags += [ "-Wl,--version-script=${_version_script}" ]
11975f9996aaSopenharmony_ci      }
11985f9996aaSopenharmony_ci    }
11995f9996aaSopenharmony_ci
12005f9996aaSopenharmony_ci    deps_info = []
12015f9996aaSopenharmony_ci    foreach(dep, deps) {
12025f9996aaSopenharmony_ci      info = {
12035f9996aaSopenharmony_ci      }
12045f9996aaSopenharmony_ci      info = {
12055f9996aaSopenharmony_ci        target_out_dir =
12065f9996aaSopenharmony_ci            rebase_path(get_label_info(dep, "target_out_dir"), root_build_dir)
12075f9996aaSopenharmony_ci        target_name = get_label_info(dep, "name")
12085f9996aaSopenharmony_ci      }
12095f9996aaSopenharmony_ci      deps_info += [ info ]
12105f9996aaSopenharmony_ci    }
12115f9996aaSopenharmony_ci    module_label = get_label_info(":${target_name}", "label_with_toolchain")
12125f9996aaSopenharmony_ci    target_deps_data = {
12135f9996aaSopenharmony_ci      label = module_label
12145f9996aaSopenharmony_ci      module_deps_info = deps_info
12155f9996aaSopenharmony_ci      module_libs = libs
12165f9996aaSopenharmony_ci      type = "shared_library"
12175f9996aaSopenharmony_ci      prebuilt = false
12185f9996aaSopenharmony_ci      stable = stable
12195f9996aaSopenharmony_ci      toolchain = get_label_info(":${target_name}", "toolchain")
12205f9996aaSopenharmony_ci    }
12215f9996aaSopenharmony_ci    write_file("${target_out_dir}/${target_name}_deps_data.json",
12225f9996aaSopenharmony_ci               target_deps_data,
12235f9996aaSopenharmony_ci               "json")
12245f9996aaSopenharmony_ci  }
12255f9996aaSopenharmony_ci}
12265f9996aaSopenharmony_ci
12275f9996aaSopenharmony_citemplate("ohos_static_library") {
12285f9996aaSopenharmony_ci  _test_target = defined(invoker.testonly) && invoker.testonly
12295f9996aaSopenharmony_ci  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
12305f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
12315f9996aaSopenharmony_ci    part_name = invoker.part_name
12325f9996aaSopenharmony_ci  } else if (defined(invoker.part_name)) {
12335f9996aaSopenharmony_ci    part_name = invoker.part_name
12345f9996aaSopenharmony_ci    _part_subsystem_info_file =
12355f9996aaSopenharmony_ci        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
12365f9996aaSopenharmony_ci    _arguments = [
12375f9996aaSopenharmony_ci      "--part-name",
12385f9996aaSopenharmony_ci      part_name,
12395f9996aaSopenharmony_ci      "--part-subsystem-info-file",
12405f9996aaSopenharmony_ci      rebase_path(_part_subsystem_info_file, root_build_dir),
12415f9996aaSopenharmony_ci    ]
12425f9996aaSopenharmony_ci    get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
12435f9996aaSopenharmony_ci    subsystem_name =
12445f9996aaSopenharmony_ci        exec_script(get_subsystem_script, _arguments, "trim string")
12455f9996aaSopenharmony_ci    if (is_use_check_deps && !_test_target) {
12465f9996aaSopenharmony_ci      skip_check_subsystem = true
12475f9996aaSopenharmony_ci    }
12485f9996aaSopenharmony_ci  } else if (defined(invoker.subsystem_name)) {
12495f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
12505f9996aaSopenharmony_ci    part_name = subsystem_name
12515f9996aaSopenharmony_ci  } else {
12525f9996aaSopenharmony_ci    subsystem_name = "build"
12535f9996aaSopenharmony_ci    part_name = "build_framework"
12545f9996aaSopenharmony_ci  }
12555f9996aaSopenharmony_ci  assert(subsystem_name != "")
12565f9996aaSopenharmony_ci  assert(part_name != "")
12575f9996aaSopenharmony_ci
12585f9996aaSopenharmony_ci  if (is_use_check_deps && !_test_target) {
12595f9996aaSopenharmony_ci    _check_target = "${target_name}__check"
12605f9996aaSopenharmony_ci    target_path = get_label_info(":${target_name}", "label_no_toolchain")
12615f9996aaSopenharmony_ci    check_target(_check_target) {
12625f9996aaSopenharmony_ci      module_deps = []
12635f9996aaSopenharmony_ci      if (defined(invoker.deps)) {
12645f9996aaSopenharmony_ci        module_deps += invoker.deps
12655f9996aaSopenharmony_ci      }
12665f9996aaSopenharmony_ci      if (defined(invoker.public_deps)) {
12675f9996aaSopenharmony_ci        module_deps += invoker.public_deps
12685f9996aaSopenharmony_ci      }
12695f9996aaSopenharmony_ci      if (defined(invoker.external_deps)) {
12705f9996aaSopenharmony_ci        module_ex_deps = invoker.external_deps
12715f9996aaSopenharmony_ci      }
12725f9996aaSopenharmony_ci    }
12735f9996aaSopenharmony_ci  }
12745f9996aaSopenharmony_ci  if (check_deps) {
12755f9996aaSopenharmony_ci    deps_data = {
12765f9996aaSopenharmony_ci    }
12775f9996aaSopenharmony_ci    module_label = get_label_info(":${target_name}", "label_with_toolchain")
12785f9996aaSopenharmony_ci    module_deps = []
12795f9996aaSopenharmony_ci    if (defined(invoker.deps)) {
12805f9996aaSopenharmony_ci      foreach(dep, invoker.deps) {
12815f9996aaSopenharmony_ci        module_deps += [ get_label_info(dep, "label_no_toolchain") ]
12825f9996aaSopenharmony_ci      }
12835f9996aaSopenharmony_ci    }
12845f9996aaSopenharmony_ci    module_ex_deps = []
12855f9996aaSopenharmony_ci    if (defined(invoker.external_deps) && invoker.external_deps != []) {
12865f9996aaSopenharmony_ci      module_ex_deps = invoker.external_deps
12875f9996aaSopenharmony_ci    }
12885f9996aaSopenharmony_ci    deps_data = {
12895f9996aaSopenharmony_ci      part_name = part_name
12905f9996aaSopenharmony_ci      module_label = module_label
12915f9996aaSopenharmony_ci      deps = module_deps
12925f9996aaSopenharmony_ci      external_deps = module_ex_deps
12935f9996aaSopenharmony_ci    }
12945f9996aaSopenharmony_ci
12955f9996aaSopenharmony_ci    write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json",
12965f9996aaSopenharmony_ci               deps_data,
12975f9996aaSopenharmony_ci               "json")
12985f9996aaSopenharmony_ci  }
12995f9996aaSopenharmony_ci
13005f9996aaSopenharmony_ci  _security_config_target = "${target_name}__security_config"
13015f9996aaSopenharmony_ci  ohos_security_config(_security_config_target) {
13025f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "auto_var_init" ])
13035f9996aaSopenharmony_ci  }
13045f9996aaSopenharmony_ci
13055f9996aaSopenharmony_ci  if (!allow_sanitize_debug && !build_xts &&
13065f9996aaSopenharmony_ci      defined(ext_sanitizer_check_list_path)) {
13075f9996aaSopenharmony_ci    build_name = "${target_name}"
13085f9996aaSopenharmony_ci    ohos_sanitizer_check("${target_name}_sanitizer_check") {
13095f9996aaSopenharmony_ci      forward_variables_from(invoker, [ "sanitize" ])
13105f9996aaSopenharmony_ci    }
13115f9996aaSopenharmony_ci  }
13125f9996aaSopenharmony_ci
13135f9996aaSopenharmony_ci  _sanitize_config_target = "${target_name}__sanitizer_config"
13145f9996aaSopenharmony_ci  ohos_sanitizer_config(_sanitize_config_target) {
13155f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "sanitize" ])
13165f9996aaSopenharmony_ci  }
13175f9996aaSopenharmony_ci
13185f9996aaSopenharmony_ci  if (!_test_target) {
13195f9996aaSopenharmony_ci    _notice_target = "${target_name}__notice"
13205f9996aaSopenharmony_ci    _main_target_name = target_name
13215f9996aaSopenharmony_ci    collect_notice(_notice_target) {
13225f9996aaSopenharmony_ci      forward_variables_from(invoker,
13235f9996aaSopenharmony_ci                             [
13245f9996aaSopenharmony_ci                               "testonly",
13255f9996aaSopenharmony_ci                               "license_as_sources",
13265f9996aaSopenharmony_ci                               "license_file",
13275f9996aaSopenharmony_ci                             ])
13285f9996aaSopenharmony_ci      module_type = "static_library"
13295f9996aaSopenharmony_ci      module_name = _main_target_name
13305f9996aaSopenharmony_ci      module_source_dir = get_label_info(":${_main_target_name}", "dir")
13315f9996aaSopenharmony_ci    }
13325f9996aaSopenharmony_ci  }
13335f9996aaSopenharmony_ci
13345f9996aaSopenharmony_ci  static_library(target_name) {
13355f9996aaSopenharmony_ci    forward_variables_from(invoker,
13365f9996aaSopenharmony_ci                           "*",
13375f9996aaSopenharmony_ci                           [
13385f9996aaSopenharmony_ci                             "configs",
13395f9996aaSopenharmony_ci                             "remove_configs",
13405f9996aaSopenharmony_ci                             "no_default_deps",
13415f9996aaSopenharmony_ci                             "license_file",
13425f9996aaSopenharmony_ci                             "license_as_sources",
13435f9996aaSopenharmony_ci                             "use_exceptions",
13445f9996aaSopenharmony_ci                             "use_rtti",
13455f9996aaSopenharmony_ci                             "subsystem_name",
13465f9996aaSopenharmony_ci
13475f9996aaSopenharmony_ci                             # Sanitizer variables
13485f9996aaSopenharmony_ci                             "sanitize",
13495f9996aaSopenharmony_ci                             "stack_protector_ret",
13505f9996aaSopenharmony_ci                             "branch_protector_ret",
13515f9996aaSopenharmony_ci                             "branch_protector_frt",
13525f9996aaSopenharmony_ci                           ])
13535f9996aaSopenharmony_ci    if (defined(invoker.configs)) {
13545f9996aaSopenharmony_ci      configs += invoker.configs
13555f9996aaSopenharmony_ci    }
13565f9996aaSopenharmony_ci    if (defined(invoker.remove_configs)) {
13575f9996aaSopenharmony_ci      configs -= invoker.remove_configs
13585f9996aaSopenharmony_ci    }
13595f9996aaSopenharmony_ci    if (is_standard_system) {
13605f9996aaSopenharmony_ci      configs -= [ "//build/config/compiler:thin_archive" ]
13615f9996aaSopenharmony_ci    }
13625f9996aaSopenharmony_ci    configs += [ ":$_sanitize_config_target" ]
13635f9996aaSopenharmony_ci    configs += [ ":$_security_config_target" ]
13645f9996aaSopenharmony_ci
13655f9996aaSopenharmony_ci    if (defined(invoker.use_exceptions) && invoker.use_exceptions) {
13665f9996aaSopenharmony_ci      configs += [ "//build/config/compiler:exceptions" ]
13675f9996aaSopenharmony_ci      configs -= [ "//build/config/compiler:no_exceptions" ]
13685f9996aaSopenharmony_ci    }
13695f9996aaSopenharmony_ci
13705f9996aaSopenharmony_ci    if (defined(invoker.use_rtti) && invoker.use_rtti) {
13715f9996aaSopenharmony_ci      configs += [ "//build/config/compiler:rtti" ]
13725f9996aaSopenharmony_ci      configs -= [ "//build/config/compiler:no_rtti" ]
13735f9996aaSopenharmony_ci    }
13745f9996aaSopenharmony_ci
13755f9996aaSopenharmony_ci    if (!defined(cflags)) {
13765f9996aaSopenharmony_ci      cflags = []
13775f9996aaSopenharmony_ci    }
13785f9996aaSopenharmony_ci
13795f9996aaSopenharmony_ci    # Enable branch protection.
13805f9996aaSopenharmony_ci    pac_ret = false
13815f9996aaSopenharmony_ci    bti = false
13825f9996aaSopenharmony_ci    if (defined(invoker.branch_protector_ret)) {
13835f9996aaSopenharmony_ci      if (invoker.branch_protector_ret == "pac_ret" ||
13845f9996aaSopenharmony_ci          invoker.branch_protector_ret == "stack_protector_ret_all") {
13855f9996aaSopenharmony_ci        if (support_branch_protector_pac_ret) {
13865f9996aaSopenharmony_ci          pac_ret = true
13875f9996aaSopenharmony_ci        } else if (support_stack_protector_ret) {
13885f9996aaSopenharmony_ci          foreach(config, configs) {
13895f9996aaSopenharmony_ci            if (config ==
13905f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config") {
13915f9996aaSopenharmony_ci              configs -= [
13925f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config",
13935f9996aaSopenharmony_ci              ]
13945f9996aaSopenharmony_ci            }
13955f9996aaSopenharmony_ci          }
13965f9996aaSopenharmony_ci          configs +=
13975f9996aaSopenharmony_ci              [ "//build/config/security:stack_protector_ret_all_config" ]
13985f9996aaSopenharmony_ci        }
13995f9996aaSopenharmony_ci      }
14005f9996aaSopenharmony_ci
14015f9996aaSopenharmony_ci      # Nothing to do, supported by default.
14025f9996aaSopenharmony_ci      if (support_stack_protector_ret &&
14035f9996aaSopenharmony_ci          invoker.branch_protector_ret == "stack_protector_ret_strong") {
14045f9996aaSopenharmony_ci      }
14055f9996aaSopenharmony_ci    } else {
14065f9996aaSopenharmony_ci      if (defined(invoker.stack_protector_ret)) {
14075f9996aaSopenharmony_ci        if (invoker.stack_protector_ret) {
14085f9996aaSopenharmony_ci          if (support_branch_protector_pac_ret) {
14095f9996aaSopenharmony_ci            pac_ret = true
14105f9996aaSopenharmony_ci          } else if (support_stack_protector_ret) {
14115f9996aaSopenharmony_ci            foreach(config, configs) {
14125f9996aaSopenharmony_ci              if (config ==
14135f9996aaSopenharmony_ci                  "//build/config/security:stack_protector_ret_strong_config") {
14145f9996aaSopenharmony_ci                configs -= [
14155f9996aaSopenharmony_ci                  "//build/config/security:stack_protector_ret_strong_config",
14165f9996aaSopenharmony_ci                ]
14175f9996aaSopenharmony_ci              }
14185f9996aaSopenharmony_ci            }
14195f9996aaSopenharmony_ci            configs +=
14205f9996aaSopenharmony_ci                [ "//build/config/security:stack_protector_ret_all_config" ]
14215f9996aaSopenharmony_ci          }
14225f9996aaSopenharmony_ci        } else {
14235f9996aaSopenharmony_ci          foreach(config, configs) {
14245f9996aaSopenharmony_ci            if (config ==
14255f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config") {
14265f9996aaSopenharmony_ci              configs -= [
14275f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config",
14285f9996aaSopenharmony_ci              ]
14295f9996aaSopenharmony_ci            }
14305f9996aaSopenharmony_ci          }
14315f9996aaSopenharmony_ci          configs += [ "//build/config/security:stack_protector_config" ]
14325f9996aaSopenharmony_ci        }
14335f9996aaSopenharmony_ci      }
14345f9996aaSopenharmony_ci    }
14355f9996aaSopenharmony_ci
14365f9996aaSopenharmony_ci    if (defined(invoker.branch_protector_frt)) {
14375f9996aaSopenharmony_ci      if (invoker.branch_protector_frt == "bti" &&
14385f9996aaSopenharmony_ci          support_branch_protector_bti) {
14395f9996aaSopenharmony_ci        bti = true
14405f9996aaSopenharmony_ci      }
14415f9996aaSopenharmony_ci    }
14425f9996aaSopenharmony_ci
14435f9996aaSopenharmony_ci    if (bti && pac_ret) {
14445f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=pac-ret+b-key+bti" ]
14455f9996aaSopenharmony_ci    } else if (bti && !pac_ret) {
14465f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=bti" ]
14475f9996aaSopenharmony_ci    } else if (!bti && pac_ret) {
14485f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=pac-ret+b-key" ]
14495f9996aaSopenharmony_ci    }
14505f9996aaSopenharmony_ci
14515f9996aaSopenharmony_ci    if (defined(invoker.no_default_deps)) {
14525f9996aaSopenharmony_ci      no_default_deps = invoker.no_default_deps
14535f9996aaSopenharmony_ci    }
14545f9996aaSopenharmony_ci
14555f9996aaSopenharmony_ci    if (!defined(deps)) {
14565f9996aaSopenharmony_ci      deps = []
14575f9996aaSopenharmony_ci    }
14585f9996aaSopenharmony_ci    if (is_use_check_deps && !_test_target) {
14595f9996aaSopenharmony_ci      deps += [ ":$_check_target" ]
14605f9996aaSopenharmony_ci    }
14615f9996aaSopenharmony_ci    if (!_test_target) {
14625f9996aaSopenharmony_ci      deps += [ ":$_notice_target" ]
14635f9996aaSopenharmony_ci    }
14645f9996aaSopenharmony_ci    if (!defined(libs)) {
14655f9996aaSopenharmony_ci      libs = []
14665f9996aaSopenharmony_ci    }
14675f9996aaSopenharmony_ci    if (!defined(include_dirs)) {
14685f9996aaSopenharmony_ci      include_dirs = []
14695f9996aaSopenharmony_ci    }
14705f9996aaSopenharmony_ci
14715f9996aaSopenharmony_ci    if (defined(is_debug) && !is_debug && enable_debug_components != "") {
14725f9996aaSopenharmony_ci      foreach(component_name, debug_components) {
14735f9996aaSopenharmony_ci        if (part_name == component_name) {
14745f9996aaSopenharmony_ci          configs -= default_opt_configs
14755f9996aaSopenharmony_ci          configs += debug_level_configs
14765f9996aaSopenharmony_ci        }
14775f9996aaSopenharmony_ci      }
14785f9996aaSopenharmony_ci    }
14795f9996aaSopenharmony_ci
14805f9996aaSopenharmony_ci    deps_info = []
14815f9996aaSopenharmony_ci    foreach(dep, deps) {
14825f9996aaSopenharmony_ci      info = {
14835f9996aaSopenharmony_ci      }
14845f9996aaSopenharmony_ci      info = {
14855f9996aaSopenharmony_ci        target_out_dir =
14865f9996aaSopenharmony_ci            rebase_path(get_label_info(dep, "target_out_dir"), root_build_dir)
14875f9996aaSopenharmony_ci        target_name = get_label_info(dep, "name")
14885f9996aaSopenharmony_ci      }
14895f9996aaSopenharmony_ci      deps_info += [ info ]
14905f9996aaSopenharmony_ci    }
14915f9996aaSopenharmony_ci    module_label = get_label_info(":${target_name}", "label_with_toolchain")
14925f9996aaSopenharmony_ci    target_deps_data = {
14935f9996aaSopenharmony_ci      label = module_label
14945f9996aaSopenharmony_ci      module_deps_info = deps_info
14955f9996aaSopenharmony_ci      module_libs = libs
14965f9996aaSopenharmony_ci      type = "static_library"
14975f9996aaSopenharmony_ci      prebuilt = false
14985f9996aaSopenharmony_ci      toolchain = get_label_info(":${target_name}", "toolchain")
14995f9996aaSopenharmony_ci    }
15005f9996aaSopenharmony_ci    write_file("${target_out_dir}/${target_name}_deps_data.json",
15015f9996aaSopenharmony_ci               target_deps_data,
15025f9996aaSopenharmony_ci               "json")
15035f9996aaSopenharmony_ci  }
15045f9996aaSopenharmony_ci}
15055f9996aaSopenharmony_ci
15065f9996aaSopenharmony_citemplate("ohos_source_set") {
15075f9996aaSopenharmony_ci  _test_target = defined(invoker.testonly) && invoker.testonly
15085f9996aaSopenharmony_ci  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
15095f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
15105f9996aaSopenharmony_ci    part_name = invoker.part_name
15115f9996aaSopenharmony_ci  } else if (defined(invoker.part_name)) {
15125f9996aaSopenharmony_ci    part_name = invoker.part_name
15135f9996aaSopenharmony_ci    _part_subsystem_info_file =
15145f9996aaSopenharmony_ci        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
15155f9996aaSopenharmony_ci    _arguments = [
15165f9996aaSopenharmony_ci      "--part-name",
15175f9996aaSopenharmony_ci      part_name,
15185f9996aaSopenharmony_ci      "--part-subsystem-info-file",
15195f9996aaSopenharmony_ci      rebase_path(_part_subsystem_info_file, root_build_dir),
15205f9996aaSopenharmony_ci    ]
15215f9996aaSopenharmony_ci    get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
15225f9996aaSopenharmony_ci    subsystem_name =
15235f9996aaSopenharmony_ci        exec_script(get_subsystem_script, _arguments, "trim string")
15245f9996aaSopenharmony_ci    if (is_use_check_deps && !_test_target) {
15255f9996aaSopenharmony_ci      skip_check_subsystem = true
15265f9996aaSopenharmony_ci    }
15275f9996aaSopenharmony_ci  } else if (defined(invoker.subsystem_name)) {
15285f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
15295f9996aaSopenharmony_ci    part_name = subsystem_name
15305f9996aaSopenharmony_ci  } else {
15315f9996aaSopenharmony_ci    subsystem_name = "build"
15325f9996aaSopenharmony_ci    part_name = "build_framework"
15335f9996aaSopenharmony_ci  }
15345f9996aaSopenharmony_ci  assert(subsystem_name != "")
15355f9996aaSopenharmony_ci  assert(part_name != "")
15365f9996aaSopenharmony_ci
15375f9996aaSopenharmony_ci  if (is_use_check_deps && !_test_target) {
15385f9996aaSopenharmony_ci    _check_target = "${target_name}__check"
15395f9996aaSopenharmony_ci    target_path = get_label_info(":${target_name}", "label_no_toolchain")
15405f9996aaSopenharmony_ci    check_target(_check_target) {
15415f9996aaSopenharmony_ci      module_deps = []
15425f9996aaSopenharmony_ci      if (defined(invoker.deps)) {
15435f9996aaSopenharmony_ci        module_deps += invoker.deps
15445f9996aaSopenharmony_ci      }
15455f9996aaSopenharmony_ci      if (defined(invoker.public_deps)) {
15465f9996aaSopenharmony_ci        module_deps += invoker.public_deps
15475f9996aaSopenharmony_ci      }
15485f9996aaSopenharmony_ci      if (defined(invoker.external_deps)) {
15495f9996aaSopenharmony_ci        module_ex_deps = invoker.external_deps
15505f9996aaSopenharmony_ci      }
15515f9996aaSopenharmony_ci    }
15525f9996aaSopenharmony_ci  }
15535f9996aaSopenharmony_ci
15545f9996aaSopenharmony_ci  if (check_deps) {
15555f9996aaSopenharmony_ci    deps_data = {
15565f9996aaSopenharmony_ci    }
15575f9996aaSopenharmony_ci    module_label = get_label_info(":${target_name}", "label_with_toolchain")
15585f9996aaSopenharmony_ci    module_deps = []
15595f9996aaSopenharmony_ci    if (defined(invoker.deps)) {
15605f9996aaSopenharmony_ci      foreach(dep, invoker.deps) {
15615f9996aaSopenharmony_ci        module_deps += [ get_label_info(dep, "label_no_toolchain") ]
15625f9996aaSopenharmony_ci      }
15635f9996aaSopenharmony_ci    }
15645f9996aaSopenharmony_ci    module_ex_deps = []
15655f9996aaSopenharmony_ci    if (defined(invoker.external_deps) && invoker.external_deps != []) {
15665f9996aaSopenharmony_ci      module_ex_deps = invoker.external_deps
15675f9996aaSopenharmony_ci    }
15685f9996aaSopenharmony_ci    deps_data = {
15695f9996aaSopenharmony_ci      part_name = part_name
15705f9996aaSopenharmony_ci      module_label = module_label
15715f9996aaSopenharmony_ci      deps = module_deps
15725f9996aaSopenharmony_ci      external_deps = module_ex_deps
15735f9996aaSopenharmony_ci    }
15745f9996aaSopenharmony_ci    write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json",
15755f9996aaSopenharmony_ci               deps_data,
15765f9996aaSopenharmony_ci               "json")
15775f9996aaSopenharmony_ci  }
15785f9996aaSopenharmony_ci
15795f9996aaSopenharmony_ci  _security_config_target = "${target_name}__security_config"
15805f9996aaSopenharmony_ci  ohos_security_config(_security_config_target) {
15815f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "auto_var_init" ])
15825f9996aaSopenharmony_ci  }
15835f9996aaSopenharmony_ci
15845f9996aaSopenharmony_ci  if (!allow_sanitize_debug && !build_xts &&
15855f9996aaSopenharmony_ci      defined(ext_sanitizer_check_list_path)) {
15865f9996aaSopenharmony_ci    build_name = "${target_name}"
15875f9996aaSopenharmony_ci    ohos_sanitizer_check("${target_name}_sanitizer_check") {
15885f9996aaSopenharmony_ci      forward_variables_from(invoker, [ "sanitize" ])
15895f9996aaSopenharmony_ci    }
15905f9996aaSopenharmony_ci  }
15915f9996aaSopenharmony_ci
15925f9996aaSopenharmony_ci  _sanitize_config_target = "${target_name}__sanitizer_config"
15935f9996aaSopenharmony_ci  ohos_sanitizer_config(_sanitize_config_target) {
15945f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "sanitize" ])
15955f9996aaSopenharmony_ci  }
15965f9996aaSopenharmony_ci
15975f9996aaSopenharmony_ci  if (!_test_target) {
15985f9996aaSopenharmony_ci    _main_target_name = target_name
15995f9996aaSopenharmony_ci    _notice_target = "${_main_target_name}__notice"
16005f9996aaSopenharmony_ci    collect_notice(_notice_target) {
16015f9996aaSopenharmony_ci      forward_variables_from(invoker,
16025f9996aaSopenharmony_ci                             [
16035f9996aaSopenharmony_ci                               "testonly",
16045f9996aaSopenharmony_ci                               "license_as_sources",
16055f9996aaSopenharmony_ci                               "license_file",
16065f9996aaSopenharmony_ci                             ])
16075f9996aaSopenharmony_ci
16085f9996aaSopenharmony_ci      module_type = "source_set"
16095f9996aaSopenharmony_ci      module_name = _main_target_name
16105f9996aaSopenharmony_ci      module_source_dir = get_label_info(":${_main_target_name}", "dir")
16115f9996aaSopenharmony_ci    }
16125f9996aaSopenharmony_ci  }
16135f9996aaSopenharmony_ci
16145f9996aaSopenharmony_ci  source_set(target_name) {
16155f9996aaSopenharmony_ci    forward_variables_from(invoker,
16165f9996aaSopenharmony_ci                           "*",
16175f9996aaSopenharmony_ci                           [
16185f9996aaSopenharmony_ci                             "configs",
16195f9996aaSopenharmony_ci                             "remove_configs",
16205f9996aaSopenharmony_ci                             "no_default_deps",
16215f9996aaSopenharmony_ci                             "license_file",
16225f9996aaSopenharmony_ci                             "license_as_sources",
16235f9996aaSopenharmony_ci                             "use_exceptions",
16245f9996aaSopenharmony_ci                             "use_rtti",
16255f9996aaSopenharmony_ci                             "subsystem_name",
16265f9996aaSopenharmony_ci
16275f9996aaSopenharmony_ci                             # Sanitizer variables
16285f9996aaSopenharmony_ci                             "sanitize",
16295f9996aaSopenharmony_ci                             "stack_protector_ret",
16305f9996aaSopenharmony_ci                             "branch_protector_ret",
16315f9996aaSopenharmony_ci                             "branch_protector_frt",
16325f9996aaSopenharmony_ci                           ])
16335f9996aaSopenharmony_ci    if (defined(invoker.configs)) {
16345f9996aaSopenharmony_ci      configs += invoker.configs
16355f9996aaSopenharmony_ci    }
16365f9996aaSopenharmony_ci    if (defined(invoker.remove_configs)) {
16375f9996aaSopenharmony_ci      configs -= invoker.remove_configs
16385f9996aaSopenharmony_ci    }
16395f9996aaSopenharmony_ci
16405f9996aaSopenharmony_ci    configs += [ ":$_sanitize_config_target" ]
16415f9996aaSopenharmony_ci    configs += [ ":$_security_config_target" ]
16425f9996aaSopenharmony_ci
16435f9996aaSopenharmony_ci    if (defined(invoker.use_exceptions) && invoker.use_exceptions) {
16445f9996aaSopenharmony_ci      configs += [ "//build/config/compiler:exceptions" ]
16455f9996aaSopenharmony_ci      configs -= [ "//build/config/compiler:no_exceptions" ]
16465f9996aaSopenharmony_ci    }
16475f9996aaSopenharmony_ci
16485f9996aaSopenharmony_ci    if (defined(invoker.use_rtti) && invoker.use_rtti) {
16495f9996aaSopenharmony_ci      configs += [ "//build/config/compiler:rtti" ]
16505f9996aaSopenharmony_ci      configs -= [ "//build/config/compiler:no_rtti" ]
16515f9996aaSopenharmony_ci    }
16525f9996aaSopenharmony_ci
16535f9996aaSopenharmony_ci    if (!defined(cflags)) {
16545f9996aaSopenharmony_ci      cflags = []
16555f9996aaSopenharmony_ci    }
16565f9996aaSopenharmony_ci
16575f9996aaSopenharmony_ci    # Enable branch protection.
16585f9996aaSopenharmony_ci    pac_ret = false
16595f9996aaSopenharmony_ci    bti = false
16605f9996aaSopenharmony_ci    if (defined(invoker.branch_protector_ret)) {
16615f9996aaSopenharmony_ci      if (invoker.branch_protector_ret == "pac_ret" ||
16625f9996aaSopenharmony_ci          invoker.branch_protector_ret == "stack_protector_ret_all") {
16635f9996aaSopenharmony_ci        if (support_branch_protector_pac_ret) {
16645f9996aaSopenharmony_ci          pac_ret = true
16655f9996aaSopenharmony_ci        } else if (support_stack_protector_ret) {
16665f9996aaSopenharmony_ci          foreach(config, configs) {
16675f9996aaSopenharmony_ci            if (config ==
16685f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config") {
16695f9996aaSopenharmony_ci              configs -= [
16705f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config",
16715f9996aaSopenharmony_ci              ]
16725f9996aaSopenharmony_ci            }
16735f9996aaSopenharmony_ci          }
16745f9996aaSopenharmony_ci          configs +=
16755f9996aaSopenharmony_ci              [ "//build/config/security:stack_protector_ret_all_config" ]
16765f9996aaSopenharmony_ci        }
16775f9996aaSopenharmony_ci      }
16785f9996aaSopenharmony_ci
16795f9996aaSopenharmony_ci      # Nothing to do, supported by default.
16805f9996aaSopenharmony_ci      if (support_stack_protector_ret &&
16815f9996aaSopenharmony_ci          invoker.branch_protector_ret == "stack_protector_ret_strong") {
16825f9996aaSopenharmony_ci      }
16835f9996aaSopenharmony_ci    } else {
16845f9996aaSopenharmony_ci      if (defined(invoker.stack_protector_ret)) {
16855f9996aaSopenharmony_ci        if (invoker.stack_protector_ret) {
16865f9996aaSopenharmony_ci          if (support_branch_protector_pac_ret) {
16875f9996aaSopenharmony_ci            pac_ret = true
16885f9996aaSopenharmony_ci          } else if (support_stack_protector_ret) {
16895f9996aaSopenharmony_ci            foreach(config, configs) {
16905f9996aaSopenharmony_ci              if (config ==
16915f9996aaSopenharmony_ci                  "//build/config/security:stack_protector_ret_strong_config") {
16925f9996aaSopenharmony_ci                configs -= [
16935f9996aaSopenharmony_ci                  "//build/config/security:stack_protector_ret_strong_config",
16945f9996aaSopenharmony_ci                ]
16955f9996aaSopenharmony_ci              }
16965f9996aaSopenharmony_ci            }
16975f9996aaSopenharmony_ci            configs +=
16985f9996aaSopenharmony_ci                [ "//build/config/security:stack_protector_ret_all_config" ]
16995f9996aaSopenharmony_ci          }
17005f9996aaSopenharmony_ci        } else {
17015f9996aaSopenharmony_ci          foreach(config, configs) {
17025f9996aaSopenharmony_ci            if (config ==
17035f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config") {
17045f9996aaSopenharmony_ci              configs -= [
17055f9996aaSopenharmony_ci                "//build/config/security:stack_protector_ret_strong_config",
17065f9996aaSopenharmony_ci              ]
17075f9996aaSopenharmony_ci            }
17085f9996aaSopenharmony_ci          }
17095f9996aaSopenharmony_ci          configs += [ "//build/config/security:stack_protector_config" ]
17105f9996aaSopenharmony_ci        }
17115f9996aaSopenharmony_ci      }
17125f9996aaSopenharmony_ci    }
17135f9996aaSopenharmony_ci
17145f9996aaSopenharmony_ci    if (defined(invoker.branch_protector_frt)) {
17155f9996aaSopenharmony_ci      if (invoker.branch_protector_frt == "bti" &&
17165f9996aaSopenharmony_ci          support_branch_protector_bti) {
17175f9996aaSopenharmony_ci        bti = true
17185f9996aaSopenharmony_ci      }
17195f9996aaSopenharmony_ci    }
17205f9996aaSopenharmony_ci
17215f9996aaSopenharmony_ci    if (bti && pac_ret) {
17225f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=pac-ret+b-key+bti" ]
17235f9996aaSopenharmony_ci    } else if (bti && !pac_ret) {
17245f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=bti" ]
17255f9996aaSopenharmony_ci    } else if (!bti && pac_ret) {
17265f9996aaSopenharmony_ci      cflags += [ "-mbranch-protection=pac-ret+b-key" ]
17275f9996aaSopenharmony_ci    }
17285f9996aaSopenharmony_ci
17295f9996aaSopenharmony_ci    if (defined(invoker.no_default_deps)) {
17305f9996aaSopenharmony_ci      no_default_deps = invoker.no_default_deps
17315f9996aaSopenharmony_ci    }
17325f9996aaSopenharmony_ci
17335f9996aaSopenharmony_ci    if (!defined(deps)) {
17345f9996aaSopenharmony_ci      deps = []
17355f9996aaSopenharmony_ci    }
17365f9996aaSopenharmony_ci    if (is_use_check_deps && !_test_target) {
17375f9996aaSopenharmony_ci      deps += [ ":$_check_target" ]
17385f9996aaSopenharmony_ci    }
17395f9996aaSopenharmony_ci    if (!_test_target) {
17405f9996aaSopenharmony_ci      deps += [ ":$_notice_target" ]
17415f9996aaSopenharmony_ci    }
17425f9996aaSopenharmony_ci
17435f9996aaSopenharmony_ci    if (!defined(libs)) {
17445f9996aaSopenharmony_ci      libs = []
17455f9996aaSopenharmony_ci    }
17465f9996aaSopenharmony_ci    if (!defined(include_dirs)) {
17475f9996aaSopenharmony_ci      include_dirs = []
17485f9996aaSopenharmony_ci    }
17495f9996aaSopenharmony_ci
17505f9996aaSopenharmony_ci    if (defined(is_debug) && !is_debug && enable_debug_components != "") {
17515f9996aaSopenharmony_ci      foreach(component_name, debug_components) {
17525f9996aaSopenharmony_ci        if (part_name == component_name) {
17535f9996aaSopenharmony_ci          configs -= default_opt_configs
17545f9996aaSopenharmony_ci          configs += debug_level_configs
17555f9996aaSopenharmony_ci        }
17565f9996aaSopenharmony_ci      }
17575f9996aaSopenharmony_ci    }
17585f9996aaSopenharmony_ci
17595f9996aaSopenharmony_ci    deps_info = []
17605f9996aaSopenharmony_ci    foreach(dep, deps) {
17615f9996aaSopenharmony_ci      info = {
17625f9996aaSopenharmony_ci      }
17635f9996aaSopenharmony_ci      info = {
17645f9996aaSopenharmony_ci        target_out_dir =
17655f9996aaSopenharmony_ci            rebase_path(get_label_info(dep, "target_out_dir"), root_build_dir)
17665f9996aaSopenharmony_ci        target_name = get_label_info(dep, "name")
17675f9996aaSopenharmony_ci      }
17685f9996aaSopenharmony_ci      deps_info += [ info ]
17695f9996aaSopenharmony_ci    }
17705f9996aaSopenharmony_ci    module_label = get_label_info(":${target_name}", "label_with_toolchain")
17715f9996aaSopenharmony_ci    target_deps_data = {
17725f9996aaSopenharmony_ci      label = module_label
17735f9996aaSopenharmony_ci      module_deps_info = deps_info
17745f9996aaSopenharmony_ci      module_libs = libs
17755f9996aaSopenharmony_ci      type = "source_set"
17765f9996aaSopenharmony_ci      toolchain = get_label_info(":${target_name}", "toolchain")
17775f9996aaSopenharmony_ci    }
17785f9996aaSopenharmony_ci    write_file("${target_out_dir}/${target_name}_deps_data.json",
17795f9996aaSopenharmony_ci               target_deps_data,
17805f9996aaSopenharmony_ci               "json")
17815f9996aaSopenharmony_ci  }
17825f9996aaSopenharmony_ci}
1783