15f9996aaSopenharmony_ci# Copyright (c) 2023 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/ohos.gni") 155f9996aaSopenharmony_ci 165f9996aaSopenharmony_ciidl_root = "//foundation/ability/idl_tool" 175f9996aaSopenharmony_ciidl_build_deps = "" 185f9996aaSopenharmony_ciidl_out_root = "" 195f9996aaSopenharmony_ci 205f9996aaSopenharmony_cibuild_root = "//build" 215f9996aaSopenharmony_citoolchain_linux = "$build_root/toolchain/linux:clang_x64" 225f9996aaSopenharmony_ciif (host_cpu == "arm64") { 235f9996aaSopenharmony_ci toolchain_mac = "$build_root/toolchain/mac:clang_arm64" 245f9996aaSopenharmony_ci} else { 255f9996aaSopenharmony_ci toolchain_mac = "$build_root/toolchain/mac:clang_x64" 265f9996aaSopenharmony_ci} 275f9996aaSopenharmony_citoolchain_win = "$build_root/toolchain/mingw:mingw_x86_64" 285f9996aaSopenharmony_ci 295f9996aaSopenharmony_ciif (host_toolchain == toolchain_mac) { 305f9996aaSopenharmony_ci idl_out_root = get_label_info("$idl_root:idl($toolchain_mac)", "root_out_dir") 315f9996aaSopenharmony_ci idl_build_deps = [ "$idl_root:idl($toolchain_mac)" ] 325f9996aaSopenharmony_ci} else if (host_toolchain == toolchain_win) { 335f9996aaSopenharmony_ci idl_out_root = get_label_info("$idl_root:idl($toolchain_win)", "root_out_dir") 345f9996aaSopenharmony_ci idl_build_deps = [ "$idl_root:idl($toolchain_win)" ] 355f9996aaSopenharmony_ci} else { 365f9996aaSopenharmony_ci idl_out_root = 375f9996aaSopenharmony_ci get_label_info("$idl_root:idl($toolchain_linux)", "root_out_dir") 385f9996aaSopenharmony_ci idl_build_deps = [ "$idl_root:idl($toolchain_linux)" ] 395f9996aaSopenharmony_ci} 405f9996aaSopenharmony_ci 415f9996aaSopenharmony_ciidl_build_path = idl_out_root + "/ability/idl_tool" 425f9996aaSopenharmony_ci 435f9996aaSopenharmony_citemplate("idl_gen_interface") { 445f9996aaSopenharmony_ci # idl sources 455f9996aaSopenharmony_ci idl_list = [] 465f9996aaSopenharmony_ci src_idl_fullpath = [] 475f9996aaSopenharmony_ci if (defined(invoker.sources)) { 485f9996aaSopenharmony_ci idl_list += invoker.sources 495f9996aaSopenharmony_ci not_needed(invoker, 505f9996aaSopenharmony_ci [ 515f9996aaSopenharmony_ci "src_idl", 525f9996aaSopenharmony_ci "dst_file", 535f9996aaSopenharmony_ci ]) 545f9996aaSopenharmony_ci } else { 555f9996aaSopenharmony_ci assert(defined(invoker.src_idl), "src-idl is required!") 565f9996aaSopenharmony_ci not_needed(invoker, [ "dst_file" ]) 575f9996aaSopenharmony_ci idl_list += [ get_path_info(invoker.src_idl, "file") ] 585f9996aaSopenharmony_ci src_idl_fullpath += [ invoker.src_idl ] 595f9996aaSopenharmony_ci } 605f9996aaSopenharmony_ci 615f9996aaSopenharmony_ci # language, default cpp, support c/cpp/rust 625f9996aaSopenharmony_ci language = "cpp" 635f9996aaSopenharmony_ci if (defined(invoker.language)) { 645f9996aaSopenharmony_ci assert(invoker.language == "c" || invoker.language == "cpp" || 655f9996aaSopenharmony_ci invoker.language == "rust", 665f9996aaSopenharmony_ci "the language must be set to 'c' or 'cpp' or 'rust', default 'cpp'") 675f9996aaSopenharmony_ci language = invoker.language 685f9996aaSopenharmony_ci } 695f9996aaSopenharmony_ci 705f9996aaSopenharmony_ci # idl name transform 715f9996aaSopenharmony_ci str_upper = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" 725f9996aaSopenharmony_ci str_lower = "a b c d e f g h i j k l m n o p q r s t u v w x y z" 735f9996aaSopenharmony_ci str_upper_list = string_split(str_upper, " ") 745f9996aaSopenharmony_ci str_lower_list = string_split(str_lower, " ") 755f9996aaSopenharmony_ci store = [] 765f9996aaSopenharmony_ci dst_file_list = [] 775f9996aaSopenharmony_ci print("idl config idl_list: ", idl_list) 785f9996aaSopenharmony_ci foreach(idl_name, idl_list) { 795f9996aaSopenharmony_ci i = 0 805f9996aaSopenharmony_ci if (defined(invoker.sources)) { 815f9996aaSopenharmony_ci src_idl_fullpath += [ rebase_path(idl_name) ] 825f9996aaSopenharmony_ci } 835f9996aaSopenharmony_ci name = string_replace(idl_name, ".idl", "") 845f9996aaSopenharmony_ci foreach(s, str_upper_list) { 855f9996aaSopenharmony_ci name = string_replace(name, s, "_" + str_lower_list[i]) 865f9996aaSopenharmony_ci i = i + 1 875f9996aaSopenharmony_ci } 885f9996aaSopenharmony_ci 895f9996aaSopenharmony_ci # first letter 905f9996aaSopenharmony_ci name_split = [] 915f9996aaSopenharmony_ci name_split = string_split(name, "_i_") 925f9996aaSopenharmony_ci if (name_split[0] == "") { 935f9996aaSopenharmony_ci name = string_replace(name, "_i_", "", 1) 945f9996aaSopenharmony_ci } 955f9996aaSopenharmony_ci name_split = [] 965f9996aaSopenharmony_ci name_split = string_split(name, "_") 975f9996aaSopenharmony_ci if (name_split[0] == "") { 985f9996aaSopenharmony_ci name = string_replace(name, "_", "", 1) 995f9996aaSopenharmony_ci } 1005f9996aaSopenharmony_ci dst_file_list += [ name ] 1015f9996aaSopenharmony_ci store += [ 1025f9996aaSopenharmony_ci "${target_gen_dir}/" + name + "_proxy.cpp", 1035f9996aaSopenharmony_ci "${target_gen_dir}/" + name + "_stub.cpp", 1045f9996aaSopenharmony_ci ] 1055f9996aaSopenharmony_ci } 1065f9996aaSopenharmony_ci arg_src_idl = string_join(",", src_idl_fullpath) 1075f9996aaSopenharmony_ci arg_dst_file = string_join(",", dst_file_list) 1085f9996aaSopenharmony_ci print("idl config store: ", store, dst_file_list) 1095f9996aaSopenharmony_ci 1105f9996aaSopenharmony_ci action("$target_name") { 1115f9996aaSopenharmony_ci inputs = src_idl_fullpath 1125f9996aaSopenharmony_ci deps = idl_build_deps 1135f9996aaSopenharmony_ci script = "${idl_root}/scripts/idl.py" 1145f9996aaSopenharmony_ci args = [ 1155f9996aaSopenharmony_ci "--src-idl", 1165f9996aaSopenharmony_ci arg_src_idl, 1175f9996aaSopenharmony_ci "--dst-path", 1185f9996aaSopenharmony_ci rebase_path("${target_gen_dir}"), 1195f9996aaSopenharmony_ci "--idl-tool-path", 1205f9996aaSopenharmony_ci rebase_path("${idl_build_path}"), 1215f9996aaSopenharmony_ci "--dst-file", 1225f9996aaSopenharmony_ci arg_dst_file, 1235f9996aaSopenharmony_ci "--language", 1245f9996aaSopenharmony_ci language, 1255f9996aaSopenharmony_ci ] 1265f9996aaSopenharmony_ci if (defined(invoker.log_domainid)) { 1275f9996aaSopenharmony_ci args += [ 1285f9996aaSopenharmony_ci "--log-domainid", 1295f9996aaSopenharmony_ci invoker.log_domainid, 1305f9996aaSopenharmony_ci ] 1315f9996aaSopenharmony_ci } 1325f9996aaSopenharmony_ci if (defined(invoker.log_tag)) { 1335f9996aaSopenharmony_ci args += [ 1345f9996aaSopenharmony_ci "--log-tag", 1355f9996aaSopenharmony_ci invoker.log_tag, 1365f9996aaSopenharmony_ci ] 1375f9996aaSopenharmony_ci } 1385f9996aaSopenharmony_ci if (defined(invoker.hitrace)) { 1395f9996aaSopenharmony_ci args += [ 1405f9996aaSopenharmony_ci "--hitrace", 1415f9996aaSopenharmony_ci invoker.hitrace, 1425f9996aaSopenharmony_ci ] 1435f9996aaSopenharmony_ci } 1445f9996aaSopenharmony_ci outputs = store 1455f9996aaSopenharmony_ci } 1465f9996aaSopenharmony_ci 1475f9996aaSopenharmony_ci # multip cpp, build as so 1485f9996aaSopenharmony_ci if ((language == "c" || language == "cpp") && defined(invoker.sources)) { 1495f9996aaSopenharmony_ci idl_headers_config = target_name + "_idl_headers_config" 1505f9996aaSopenharmony_ci config("$idl_headers_config") { 1515f9996aaSopenharmony_ci include_dirs = [ "${target_gen_dir}" ] 1525f9996aaSopenharmony_ci if (defined(invoker.sub_include)) { 1535f9996aaSopenharmony_ci include_dirs += invoker.sub_include 1545f9996aaSopenharmony_ci } 1555f9996aaSopenharmony_ci } 1565f9996aaSopenharmony_ci lib_client = "lib" + target_name + "_proxy" 1575f9996aaSopenharmony_ci action_target_name = ":" + target_name 1585f9996aaSopenharmony_ci ohos_shared_library(lib_client) { 1595f9996aaSopenharmony_ci sources = [] 1605f9996aaSopenharmony_ci output_values = get_target_outputs(action_target_name) 1615f9996aaSopenharmony_ci sources += filter_include(output_values, [ "*_proxy.cpp" ]) 1625f9996aaSopenharmony_ci if (defined(invoker.sources_cpp)) { 1635f9996aaSopenharmony_ci sources += invoker.sources_cpp 1645f9996aaSopenharmony_ci } 1655f9996aaSopenharmony_ci if (defined(invoker.configs)) { 1665f9996aaSopenharmony_ci configs = invoker.configs 1675f9996aaSopenharmony_ci } 1685f9996aaSopenharmony_ci public_configs = [ ":$idl_headers_config" ] 1695f9996aaSopenharmony_ci deps = [ action_target_name ] 1705f9996aaSopenharmony_ci if (is_standard_system) { 1715f9996aaSopenharmony_ci public_deps = [] 1725f9996aaSopenharmony_ci if (defined(invoker.sequenceable_pub_deps)) { 1735f9996aaSopenharmony_ci public_deps += invoker.sequenceable_pub_deps 1745f9996aaSopenharmony_ci } 1755f9996aaSopenharmony_ci external_deps = [ "c_utils:utils" ] 1765f9996aaSopenharmony_ci if (defined(invoker.hitrace)) { 1775f9996aaSopenharmony_ci external_deps += [ "hitrace:hitrace_meter" ] 1785f9996aaSopenharmony_ci } 1795f9996aaSopenharmony_ci if (defined(invoker.log_domainid)) { 1805f9996aaSopenharmony_ci external_deps += [ "hilog:libhilog" ] 1815f9996aaSopenharmony_ci } 1825f9996aaSopenharmony_ci if (defined(invoker.sequenceable_ext_deps)) { 1835f9996aaSopenharmony_ci external_deps += invoker.sequenceable_ext_deps 1845f9996aaSopenharmony_ci } 1855f9996aaSopenharmony_ci if (language == "c") { 1865f9996aaSopenharmony_ci external_deps += [ "hdf_core:libhdf_ipc_adapter" ] 1875f9996aaSopenharmony_ci } else if (language == "cpp") { 1885f9996aaSopenharmony_ci external_deps += [ "ipc:ipc_single" ] 1895f9996aaSopenharmony_ci } 1905f9996aaSopenharmony_ci } else { 1915f9996aaSopenharmony_ci external_deps = [ "hilog:libhilog" ] 1925f9996aaSopenharmony_ci } 1935f9996aaSopenharmony_ci if (defined(invoker.subsystem_name)) { 1945f9996aaSopenharmony_ci subsystem_name = invoker.subsystem_name 1955f9996aaSopenharmony_ci } 1965f9996aaSopenharmony_ci if (defined(invoker.part_name)) { 1975f9996aaSopenharmony_ci part_name = invoker.part_name 1985f9996aaSopenharmony_ci } 1995f9996aaSopenharmony_ci if (defined(invoker.innerapi_tags)) { 2005f9996aaSopenharmony_ci innerapi_tags = invoker.innerapi_tags 2015f9996aaSopenharmony_ci } 2025f9996aaSopenharmony_ci if (defined(invoker.sanitize)) { 2035f9996aaSopenharmony_ci sanitize = invoker.sanitize 2045f9996aaSopenharmony_ci } else { 2055f9996aaSopenharmony_ci sanitize = { 2065f9996aaSopenharmony_ci cfi = true 2075f9996aaSopenharmony_ci cfi_cross_dso = true 2085f9996aaSopenharmony_ci debug = false 2095f9996aaSopenharmony_ci } 2105f9996aaSopenharmony_ci } 2115f9996aaSopenharmony_ci } 2125f9996aaSopenharmony_ci lib_server = "lib" + target_name + "_stub" 2135f9996aaSopenharmony_ci ohos_shared_library(lib_server) { 2145f9996aaSopenharmony_ci sources = [] 2155f9996aaSopenharmony_ci output_values = get_target_outputs(action_target_name) 2165f9996aaSopenharmony_ci sources += filter_include(output_values, [ "*_stub.cpp" ]) 2175f9996aaSopenharmony_ci if (defined(invoker.sources_cpp)) { 2185f9996aaSopenharmony_ci sources += invoker.sources_cpp 2195f9996aaSopenharmony_ci } 2205f9996aaSopenharmony_ci if (defined(invoker.configs)) { 2215f9996aaSopenharmony_ci configs = invoker.configs 2225f9996aaSopenharmony_ci } 2235f9996aaSopenharmony_ci public_configs = [ ":$idl_headers_config" ] 2245f9996aaSopenharmony_ci deps = [ action_target_name ] 2255f9996aaSopenharmony_ci if (is_standard_system) { 2265f9996aaSopenharmony_ci public_deps = [] 2275f9996aaSopenharmony_ci if (defined(invoker.sequenceable_pub_deps)) { 2285f9996aaSopenharmony_ci public_deps += invoker.sequenceable_pub_deps 2295f9996aaSopenharmony_ci } 2305f9996aaSopenharmony_ci external_deps = [ "c_utils:utils" ] 2315f9996aaSopenharmony_ci if (defined(invoker.hitrace)) { 2325f9996aaSopenharmony_ci external_deps += [ "hitrace:hitrace_meter" ] 2335f9996aaSopenharmony_ci } 2345f9996aaSopenharmony_ci if (defined(invoker.log_domainid)) { 2355f9996aaSopenharmony_ci external_deps += [ "hilog:libhilog" ] 2365f9996aaSopenharmony_ci } 2375f9996aaSopenharmony_ci if (defined(invoker.sequenceable_ext_deps)) { 2385f9996aaSopenharmony_ci external_deps += invoker.sequenceable_ext_deps 2395f9996aaSopenharmony_ci } 2405f9996aaSopenharmony_ci if (language == "c") { 2415f9996aaSopenharmony_ci external_deps += [ "hdf_core:libhdf_ipc_adapter" ] 2425f9996aaSopenharmony_ci } else if (language == "cpp") { 2435f9996aaSopenharmony_ci external_deps += [ "ipc:ipc_single" ] 2445f9996aaSopenharmony_ci } 2455f9996aaSopenharmony_ci } else { 2465f9996aaSopenharmony_ci external_deps = [ "hilog:libhilog" ] 2475f9996aaSopenharmony_ci } 2485f9996aaSopenharmony_ci if (defined(invoker.subsystem_name)) { 2495f9996aaSopenharmony_ci subsystem_name = invoker.subsystem_name 2505f9996aaSopenharmony_ci } 2515f9996aaSopenharmony_ci if (defined(invoker.part_name)) { 2525f9996aaSopenharmony_ci part_name = invoker.part_name 2535f9996aaSopenharmony_ci } 2545f9996aaSopenharmony_ci if (defined(invoker.sanitize)) { 2555f9996aaSopenharmony_ci sanitize = invoker.sanitize 2565f9996aaSopenharmony_ci } else { 2575f9996aaSopenharmony_ci sanitize = { 2585f9996aaSopenharmony_ci cfi = true 2595f9996aaSopenharmony_ci cfi_cross_dso = true 2605f9996aaSopenharmony_ci debug = false 2615f9996aaSopenharmony_ci } 2625f9996aaSopenharmony_ci } 2635f9996aaSopenharmony_ci } 2645f9996aaSopenharmony_ci 2655f9996aaSopenharmony_ci # generate code and shared library 2665f9996aaSopenharmony_ci group("$target_name" + "_idl_target") { 2675f9996aaSopenharmony_ci deps = [ 2685f9996aaSopenharmony_ci ":$lib_client", 2695f9996aaSopenharmony_ci ":$lib_server", 2705f9996aaSopenharmony_ci ] 2715f9996aaSopenharmony_ci } 2725f9996aaSopenharmony_ci } 2735f9996aaSopenharmony_ci} 274