• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2023 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6#     http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14import("//build/config/clang/clang.gni")
15import("//build/config/ohos/config.gni")
16import("//build/ohos/notice/notice.gni")
17import("//build/ohos_var.gni")
18import("//build/templates/common/check_target.gni")
19import("//build/templates/metadata/module_info.gni")
20
21template("ohos_rust_library") {
22  assert(!defined(invoker.output_dir),
23         "output_dir is not allowed to be defined.")
24  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
25    subsystem_name = invoker.subsystem_name
26    part_name = invoker.part_name
27  } else if (defined(invoker.part_name)) {
28    part_name = invoker.part_name
29    _part_subsystem_info_file =
30        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
31    _arguments = [
32      "--part-name",
33      part_name,
34      "--part-subsystem-info-file",
35      rebase_path(_part_subsystem_info_file, root_build_dir),
36    ]
37    get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
38    subsystem_name =
39        exec_script(get_subsystem_script, _arguments, "trim string")
40    if (is_use_check_deps) {
41      skip_check_subsystem = true
42    }
43  } else if (defined(invoker.subsystem_name)) {
44    subsystem_name = invoker.subsystem_name
45    part_name = subsystem_name
46  } else {
47    subsystem_name = "common"
48    part_name = subsystem_name
49  }
50  assert(subsystem_name != "")
51  assert(part_name != "")
52  if (is_use_check_deps) {
53    _check_target = "${target_name}__check"
54    target_path = get_label_info(":${target_name}", "label_no_toolchain")
55    check_target(_check_target) {
56      module_deps = []
57      if (defined(invoker.deps)) {
58        module_deps += invoker.deps
59      }
60      if (defined(invoker.public_deps)) {
61        module_deps += invoker.public_deps
62      }
63      if (defined(invoker.external_deps)) {
64        module_ex_deps = invoker.external_deps
65      }
66    }
67  }
68
69  if (check_deps) {
70    deps_data = {
71    }
72    module_label = get_label_info(":${target_name}", "label_with_toolchain")
73    module_deps = []
74    if (defined(invoker.deps)) {
75      foreach(dep, invoker.deps) {
76        module_deps += [ get_label_info(dep, "label_no_toolchain") ]
77      }
78    }
79    module_ex_deps = []
80    if (defined(invoker.external_deps) && invoker.external_deps != []) {
81      module_ex_deps = invoker.external_deps
82    }
83    deps_data = {
84      part_name = part_name
85      module_label = module_label
86      deps = module_deps
87      external_deps = module_ex_deps
88    }
89    write_file("${root_out_dir}/deps_files/${part_name}__${target_name}.json",
90               deps_data,
91               "json")
92  }
93
94  if (is_standard_system) {
95    output_dir = "${root_out_dir}/${subsystem_name}/${part_name}"
96  } else {
97    output_dir = "${root_out_dir}"
98  }
99
100  _test_target = defined(invoker.testonly) && invoker.testonly
101  if (!_test_target) {
102    _notice_target = "${target_name}__notice"
103    _main_target_name = target_name
104    collect_notice(_notice_target) {
105      forward_variables_from(invoker,
106                             [
107                               "testonly",
108                               "license_as_sources",
109                               "license_file",
110                             ])
111
112      module_name = _main_target_name
113      module_source_dir = get_label_info(":${_main_target_name}", "dir")
114    }
115  }
116
117  target_label = get_label_info(":${target_name}", "label_with_toolchain")
118  target_toolchain = get_label_info(target_label, "toolchain")
119
120  if (target_toolchain == "${current_toolchain}") {
121    ohos_module_name = target_name
122    _module_info_target = "${target_name}_info"
123    generate_module_info(_module_info_target) {
124      module_name = ohos_module_name
125      module_type = "lib"
126      module_source_dir = "$root_out_dir"
127      if (defined(output_dir)) {
128        module_source_dir = output_dir
129      }
130
131      module_install_name = ohos_module_name
132      if (defined(invoker.output_name)) {
133        module_install_name = invoker.output_name
134      }
135
136      module_install_images = [ "system" ]
137      if (defined(invoker.install_images)) {
138        module_install_images = []
139        module_install_images += invoker.install_images
140      }
141
142      module_output_extension = shlib_extension
143      if (defined(invoker.module_output_extension)) {
144        module_output_extension = invoker.module_output_extension
145      }
146
147      install_enable = true
148      if (defined(invoker.install_enable)) {
149        install_enable = invoker.install_enable
150      }
151
152      if (defined(invoker.module_install_dir)) {
153        module_install_dir = invoker.module_install_dir
154      }
155
156      if (defined(invoker.relative_install_dir)) {
157        relative_install_dir = invoker.relative_install_dir
158      }
159
160      if (defined(invoker.symlink_target_name)) {
161        symlink_target_name = invoker.symlink_target_name
162      }
163
164      if (defined(invoker.output_prefix_override)) {
165        output_prefix_override = invoker.output_prefix_override
166      }
167      notice = "$target_out_dir/$ohos_module_name.notice.txt"
168    }
169  }
170
171  rust_library("${target_name}") {
172    forward_variables_from(invoker,
173                           "*",
174                           [
175                             "configs",
176                             "remove_configs",
177                             "no_default_deps",
178                             "external_deps",
179                             "install_images",
180                             "module_install_dir",
181                             "relative_install_dir",
182                             "symlink_target_name",
183                             "output_dir",
184                             "install_enable",
185                             "version_script",
186                             "license_file",
187                             "license_as_sources",
188                             "use_exceptions",
189                             "stl",
190
191                             # Sanitizer variables
192                             "sanitize",
193                           ])
194    output_dir = output_dir
195
196    if (!defined(inputs)) {
197      inputs = []
198    }
199
200    if (!defined(ldflags)) {
201      ldflags = []
202    }
203
204    if (defined(invoker.configs)) {
205      configs += invoker.configs
206    }
207    if (defined(invoker.remove_configs)) {
208      configs -= invoker.remove_configs
209    }
210
211    if (!defined(output_name)) {
212      output_name = target_name
213    }
214
215    if (defined(invoker.no_default_deps)) {
216      no_default_deps = invoker.no_default_deps
217    }
218
219    if (!defined(ldflags)) {
220      ldflags = []
221    }
222    if (!defined(libs)) {
223      libs = []
224    }
225    if (!defined(cflags_cc)) {
226      cflags_cc = []
227    }
228    if (!defined(deps)) {
229      deps = []
230    }
231    if (is_use_check_deps) {
232      deps += [ ":$_check_target" ]
233    }
234    if (target_toolchain == "${current_toolchain}" && !skip_gen_module_info) {
235      deps += [ ":$_module_info_target" ]
236    }
237
238    if (is_ohos) {
239      if (defined(invoker.stl)) {
240        cflags_cc += [
241          "-nostdinc++",
242          "-I" + rebase_path(
243                  "//prebuilts/clang/ohos/${host_platform_dir}/llvm_ndk/include/c++/v1",
244                  root_build_dir),
245        ]
246        ldflags += [
247          "-nostdlib++",
248          "-L" + rebase_path("${clang_stl_path}/${abi_target}/c++",
249                             root_build_dir),
250        ]
251
252        libs += [ invoker.stl ]
253      } else {
254        if (current_cpu == "arm" || current_cpu == "arm64") {
255          libs += [ "unwind" ]
256        }
257        ldflags += [ "-L" + rebase_path("${clang_stl_path}/${abi_target}/c++",
258                                        root_build_dir) ]
259
260        libs += [ "c++" ]
261      }
262    }
263
264    if (!_test_target) {
265      deps += [ ":$_notice_target" ]
266    }
267    if (!defined(include_dirs)) {
268      include_dirs = []
269    }
270    if (defined(invoker.external_deps)) {
271      component_override_map = rebase_path(
272              "${root_build_dir}/build_configs/component_override_map.json")
273      external_deps_script =
274          rebase_path("//build/templates/common/external_deps_handler.py")
275      external_deps_temp_file =
276          "$target_gen_dir/${part_name}__${target_name}_external_deps_temp.json"
277      arguments = [ "--external-deps" ]
278      arguments += invoker.external_deps
279      arguments += [
280        "--parts-src-flag-file",
281        rebase_path(parts_src_flag_file, root_build_dir),
282        "--external-deps-temp-file",
283        rebase_path(external_deps_temp_file, root_build_dir),
284        "--sdk-base-dir",
285        rebase_path("${innersdk_base_dir}", root_build_dir),
286        "--sdk-dir-name",
287        "${innersdk_dir_name}",
288        "--current-toolchain",
289        current_toolchain,
290        "--innerkits-adapter-info-file",
291        rebase_path("//build/ohos/inner_kits_adapter.json", root_build_dir),
292        "--component-override-map",
293        component_override_map,
294      ]
295      if (is_use_sdk) {
296        arguments += [ "--use-sdk" ]
297      }
298
299      exec_script(external_deps_script, arguments, "string")
300
301      external_deps_info = read_file(external_deps_temp_file, "json")
302      if (defined(external_deps_info.deps)) {
303        deps += external_deps_info.deps
304      }
305      if (defined(external_deps_info.libs)) {
306        libs += external_deps_info.libs
307      }
308      if (defined(external_deps_info.include_dirs)) {
309        include_dirs += external_deps_info.include_dirs
310      }
311    }
312
313    install_module_info = {
314      module_def = target_label
315      module_info_file =
316          rebase_path(get_label_info(module_def, "target_out_dir"),
317                      root_build_dir) + "/${target_name}_module_info.json"
318      subsystem_name = subsystem_name
319      part_name = part_name
320      toolchain = current_toolchain
321      toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
322    }
323    metadata = {
324      install_modules = [ install_module_info ]
325    }
326    if (defined(is_debug) && !is_debug && enable_debug_components != "") {
327      foreach(component_name, debug_components) {
328        if (part_name == component_name) {
329          configs -= default_opt_configs
330          configs += debug_level_configs
331        }
332      }
333    }
334  }
335}
336