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