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