1c1d0c72aSopenharmony_ci# Copyright (c) 2023 Huawei Device Co., Ltd.
2c1d0c72aSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
3c1d0c72aSopenharmony_ci# you may not use this file except in compliance with the License.
4c1d0c72aSopenharmony_ci# You may obtain a copy of the License at
5c1d0c72aSopenharmony_ci#
6c1d0c72aSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
7c1d0c72aSopenharmony_ci#
8c1d0c72aSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
9c1d0c72aSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
10c1d0c72aSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11c1d0c72aSopenharmony_ci# See the License for the specific language governing permissions and
12c1d0c72aSopenharmony_ci# limitations under the License..
13c1d0c72aSopenharmony_ci
14c1d0c72aSopenharmony_ciimport("//build/ohos.gni")
15c1d0c72aSopenharmony_ciimport("//drivers/hdf_core/adapter/uhdf/uhdf.gni")
16c1d0c72aSopenharmony_ci
17c1d0c72aSopenharmony_citemplate("hdi_small") {
18c1d0c72aSopenharmony_ci  assert(defined(invoker.sources), "sources must be set")
19c1d0c72aSopenharmony_ci  assert(defined(invoker.language), "language must be set")
20c1d0c72aSopenharmony_ci
21c1d0c72aSopenharmony_ci  #system type, the default value is lite
22c1d0c72aSopenharmony_ci  system = "lite"
23c1d0c72aSopenharmony_ci
24c1d0c72aSopenharmony_ci  # generate mode, the default value is low
25c1d0c72aSopenharmony_ci  mode = "passthrough"
26c1d0c72aSopenharmony_ci
27c1d0c72aSopenharmony_ci  # generate language, the default value is c
28c1d0c72aSopenharmony_ci  language = "c"
29c1d0c72aSopenharmony_ci  if (defined(invoker.language)) {
30c1d0c72aSopenharmony_ci    assert(invoker.language == "c" || invoker.language == "cpp",
31c1d0c72aSopenharmony_ci           "the language must be set to 'c' or 'cpp'")
32c1d0c72aSopenharmony_ci    language = invoker.language
33c1d0c72aSopenharmony_ci  }
34c1d0c72aSopenharmony_ci
35c1d0c72aSopenharmony_ci  # the path of root package
36c1d0c72aSopenharmony_ci  root_package = "ohos.hdi"
37c1d0c72aSopenharmony_ci  root_path = rebase_path("//drivers/interface")
38c1d0c72aSopenharmony_ci  if (defined(invoker.root)) {
39c1d0c72aSopenharmony_ci    package_path_map = string_split(invoker.root, ":")
40c1d0c72aSopenharmony_ci    root_package = package_path_map[0]
41c1d0c72aSopenharmony_ci    root_path = rebase_path(package_path_map[1])
42c1d0c72aSopenharmony_ci  }
43c1d0c72aSopenharmony_ci  root_package_path = "${root_package}:${root_path}"
44c1d0c72aSopenharmony_ci
45c1d0c72aSopenharmony_ci  # the path of generate code file
46c1d0c72aSopenharmony_ci  sources_gen_dir = get_path_info("${root_path}/", "gen_dir")
47c1d0c72aSopenharmony_ci
48c1d0c72aSopenharmony_ci  # analysis idl file
49c1d0c72aSopenharmony_ci  get_build_info_args = [
50c1d0c72aSopenharmony_ci    "--system",
51c1d0c72aSopenharmony_ci    system,
52c1d0c72aSopenharmony_ci    "--mode",
53c1d0c72aSopenharmony_ci    mode,
54c1d0c72aSopenharmony_ci    "--language",
55c1d0c72aSopenharmony_ci    language,
56c1d0c72aSopenharmony_ci    "-o",
57c1d0c72aSopenharmony_ci    sources_gen_dir,
58c1d0c72aSopenharmony_ci    "-r",
59c1d0c72aSopenharmony_ci    root_package_path,
60c1d0c72aSopenharmony_ci  ]
61c1d0c72aSopenharmony_ci
62c1d0c72aSopenharmony_ci  foreach(idl_file, invoker.sources) {
63c1d0c72aSopenharmony_ci    get_build_info_args += [ "-f" ]
64c1d0c72aSopenharmony_ci    get_build_info_args += [ rebase_path(idl_file) ]
65c1d0c72aSopenharmony_ci  }
66c1d0c72aSopenharmony_ci
67c1d0c72aSopenharmony_ci  hdi_build_info =
68c1d0c72aSopenharmony_ci      exec_script("$hdf_framework_path/tools/hdi-gen/build_hdi_files_info.py",
69c1d0c72aSopenharmony_ci                  get_build_info_args,
70c1d0c72aSopenharmony_ci                  "json")
71c1d0c72aSopenharmony_ci
72c1d0c72aSopenharmony_ci  assert(defined(hdi_build_info.include_dirs), "missing include_dirs")
73c1d0c72aSopenharmony_ci  assert(defined(hdi_build_info.out_dir), "out_dir")
74c1d0c72aSopenharmony_ci  assert(defined(hdi_build_info.version), "missing version")
75c1d0c72aSopenharmony_ci  assert(defined(hdi_build_info.sources), "missing sources")
76c1d0c72aSopenharmony_ci
77c1d0c72aSopenharmony_ci  idl_headers_config = "$target_name" + "_idl_headers_config"
78c1d0c72aSopenharmony_ci  config("$idl_headers_config") {
79c1d0c72aSopenharmony_ci    include_dirs = [
80c1d0c72aSopenharmony_ci      "//drivers/hdf_core/interfaces/inner_api/osal/shared",
81c1d0c72aSopenharmony_ci      "//drivers/hdf_core/interfaces/inner_api/osal/uhdf",
82c1d0c72aSopenharmony_ci      "//drivers/hdf_core/interfaces/inner_api/utils",
83c1d0c72aSopenharmony_ci    ]
84c1d0c72aSopenharmony_ci    include_dirs += hdi_build_info.include_dirs
85c1d0c72aSopenharmony_ci  }
86c1d0c72aSopenharmony_ci
87c1d0c72aSopenharmony_ci  action("hdi_gen") {
88c1d0c72aSopenharmony_ci    deps = [ "$hdf_framework_path/tools/hdi-gen:build_hdi_gen" ]
89c1d0c72aSopenharmony_ci    script = "/usr/bin/env"
90c1d0c72aSopenharmony_ci    if (defined(ohos_lite)) {
91c1d0c72aSopenharmony_ci      script = "//build/lite/run_shell_cmd.py"
92c1d0c72aSopenharmony_ci    }
93c1d0c72aSopenharmony_ci
94c1d0c72aSopenharmony_ci    idl_sources = invoker.sources
95c1d0c72aSopenharmony_ci    inputs = invoker.sources
96c1d0c72aSopenharmony_ci    outputs = hdi_build_info.sources
97c1d0c72aSopenharmony_ci
98c1d0c72aSopenharmony_ci    args = [
99c1d0c72aSopenharmony_ci      rebase_path(get_path_info("$hdf_framework_path/tools/hdi-gen/",
100c1d0c72aSopenharmony_ci                                "out_dir") + "/hdi-gen"),
101c1d0c72aSopenharmony_ci      "--system",
102c1d0c72aSopenharmony_ci      system,
103c1d0c72aSopenharmony_ci      "--mode",
104c1d0c72aSopenharmony_ci      mode,
105c1d0c72aSopenharmony_ci      "--language",
106c1d0c72aSopenharmony_ci      language,
107c1d0c72aSopenharmony_ci      "-d",
108c1d0c72aSopenharmony_ci      rebase_path(hdi_build_info.out_dir),
109c1d0c72aSopenharmony_ci    ]
110c1d0c72aSopenharmony_ci
111c1d0c72aSopenharmony_ci    foreach(idl_file, idl_sources) {
112c1d0c72aSopenharmony_ci      args += [ "-c" ]
113c1d0c72aSopenharmony_ci      args += [ rebase_path(idl_file) ]
114c1d0c72aSopenharmony_ci    }
115c1d0c72aSopenharmony_ci
116c1d0c72aSopenharmony_ci    args += [
117c1d0c72aSopenharmony_ci      "-r",
118c1d0c72aSopenharmony_ci      root_package_path,
119c1d0c72aSopenharmony_ci    ]
120c1d0c72aSopenharmony_ci  }
121c1d0c72aSopenharmony_ci
122c1d0c72aSopenharmony_ci  lib_client = "lib" + target_name + "_proxy" + "_" + hdi_build_info.version
123c1d0c72aSopenharmony_ci  ohos_shared_library(lib_client) {
124c1d0c72aSopenharmony_ci    output_extension = "z.so"
125c1d0c72aSopenharmony_ci
126c1d0c72aSopenharmony_ci    if (defined(invoker.sources)) {
127c1d0c72aSopenharmony_ci      sources = hdi_build_info.proxy_sources
128c1d0c72aSopenharmony_ci      public_configs = [ ":$idl_headers_config" ]
129c1d0c72aSopenharmony_ci      deps = [ ":hdi_gen" ]
130c1d0c72aSopenharmony_ci
131c1d0c72aSopenharmony_ci      public_deps = hdi_build_info.proxy_deps
132c1d0c72aSopenharmony_ci
133c1d0c72aSopenharmony_ci      external_deps = [
134c1d0c72aSopenharmony_ci        "bounds_checking_function:libsec_shared",
135c1d0c72aSopenharmony_ci        "hdf_core:libhdi",
136c1d0c72aSopenharmony_ci        "hilog_lite:hilog_shared",
137c1d0c72aSopenharmony_ci      ]
138c1d0c72aSopenharmony_ci
139c1d0c72aSopenharmony_ci      if (invoker.language == "c") {
140c1d0c72aSopenharmony_ci        external_deps += [ "hdf_core:libhdf_utils" ]
141c1d0c72aSopenharmony_ci      }
142c1d0c72aSopenharmony_ci
143c1d0c72aSopenharmony_ci      shlib_type = "hdi_proxy"
144c1d0c72aSopenharmony_ci      subsystem_name = invoker.subsystem_name
145c1d0c72aSopenharmony_ci      partname_list = string_split(invoker.part_name, "_")
146c1d0c72aSopenharmony_ci      if (partname_list[0] == "drivers") {
147c1d0c72aSopenharmony_ci        part_name = invoker.part_name
148c1d0c72aSopenharmony_ci      } else {
149c1d0c72aSopenharmony_ci        part_name = invoker.part_name + "_interface"
150c1d0c72aSopenharmony_ci      }
151c1d0c72aSopenharmony_ci    }
152c1d0c72aSopenharmony_ci  }
153c1d0c72aSopenharmony_ci
154c1d0c72aSopenharmony_ci  lib_server = "lib" + target_name + "_stub" + "_" + hdi_build_info.version
155c1d0c72aSopenharmony_ci  group(lib_server) {
156c1d0c72aSopenharmony_ci    public_configs = [ ":$idl_headers_config" ]
157c1d0c72aSopenharmony_ci    deps = [ ":hdi_gen" ]
158c1d0c72aSopenharmony_ci  }
159c1d0c72aSopenharmony_ci
160c1d0c72aSopenharmony_ci  # generate code and shared library
161c1d0c72aSopenharmony_ci  group("$target_name" + "_idl_target") {
162c1d0c72aSopenharmony_ci    deps = [ ":$lib_client" ]
163c1d0c72aSopenharmony_ci  }
164c1d0c72aSopenharmony_ci
165c1d0c72aSopenharmony_ci  # only generate code and provide header file path
166c1d0c72aSopenharmony_ci  group("$target_name" + "_idl_headers") {
167c1d0c72aSopenharmony_ci    public_configs = [ ":$idl_headers_config" ]
168c1d0c72aSopenharmony_ci    deps = [ ":hdi_gen" ]
169c1d0c72aSopenharmony_ci  }
170c1d0c72aSopenharmony_ci}
171