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