1# Copyright (c) 2021 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/python.gni") 15import("//build/config/sanitizers/sanitizers.gni") 16import("//build/ohos_var.gni") 17 18# Gen module info to file 19# private template 20# 21template("generate_module_info") { 22 assert(defined(invoker.module_name), 23 "module_label must be defined for ${target_name}.") 24 assert(defined(invoker.module_type), 25 "module_type must be defined for ${target_name}.") 26 27 forward_variables_from(invoker, 28 [ 29 "testonly", 30 "visibility", 31 ]) 32 forward_variables_from(invoker, 33 [ 34 "module_label", 35 "module_name", 36 "module_source_dir", 37 "module_install_images", 38 "module_type", 39 "module_install_name", 40 "module_install_dir", 41 "relative_install_dir", 42 "module_output_extension", 43 "module_source", 44 "notice", 45 "shlib_type", 46 "innerapi_tags", 47 "version_script", 48 "part_name", 49 "subsystem_name", 50 "symlink_ext", 51 "symlink_path", 52 ]) 53 54 if (!defined(module_label)) { 55 if (module_type == "java_library" || module_type == "none" || 56 module_type == "app" || module_type == "dex") { 57 module_label = get_label_info(":$module_name", "label_no_toolchain") 58 } else { 59 module_label = get_label_info(":$module_name", "label_with_toolchain") 60 } 61 } 62 module_deps = [ get_label_info(module_label, "label_no_toolchain") ] 63 64 gen_script = "//build/templates/metadata/gen_module_info.py" 65 66 if (!defined(module_source_dir)) { 67 module_source_dir = "$root_out_dir" 68 } 69 if (!defined(module_install_name)) { 70 module_install_name = module_name 71 } 72 if (!defined(module_output_extension)) { 73 module_output_extension = "" 74 } 75 76 output_file = "${target_out_dir}/${module_name}_module_info.json" 77 78 # reset module_type when module_type is lib 79 if (module_type == "lib") { 80 if (target_cpu == "arm64" || target_cpu == "x86_64" || 81 target_cpu == "loongarch64" || target_cpu == "riscv64") { 82 module_type = "lib64" 83 } else if (target_cpu == "arm" || target_cpu == "x86") { 84 module_type = "lib" 85 } else if (target_cpu == "riscv64" || target_cpu == "mipsel") { 86 module_type = "lib" 87 } else { 88 assert(false, "Error: unsupported target cpu name.") 89 } 90 } 91 92 if (!is_standard_system && (is_asan || is_tsan) && 93 ("${module_type}" == "lib" || "${module_type}" == "lib64" || 94 "${module_type}" == "bin")) { 95 system_base_dir = "${system_base_dir}/asan" 96 } 97 98 action(target_name) { 99 args = [ 100 "--system-base-dir", 101 system_base_dir, 102 "--ramdisk-base-dir", 103 ramdisk_base_dir, 104 "--vendor-base-dir", 105 vendor_base_dir, 106 "--updater-base-dir", 107 updater_base_dir, 108 "--sys_prod-base-dir", 109 sys_prod_base_dir, 110 "--eng_system-base-dir", 111 eng_system_base_dir, 112 "--eng_chipset-base-dir", 113 eng_chipset_base_dir, 114 "--updater_vendor-base-dir", 115 updater_vendor_base_dir, 116 "--chip_prod-base-dir", 117 chip_prod_base_dir, 118 "--type", 119 module_type, 120 "--target-label", 121 module_label, 122 "--source-dir", 123 rebase_path(module_source_dir, "$root_build_dir"), 124 "--label-name", 125 module_name, 126 "--output-file", 127 rebase_path(output_file, "$root_build_dir"), 128 ] 129 130 if (module_install_name != "") { 131 args += [ 132 "--install-name", 133 module_install_name, 134 ] 135 } 136 137 if (defined(invoker.module_alt_output_extension)) { 138 args += [ 139 "--alternative-suffix", 140 invoker.module_alt_output_extension, 141 ] 142 } 143 144 if (defined(invoker.install_enable) && !invoker.install_enable) { 145 args += [ "--install-enable" ] 146 } 147 if (defined(invoker.collect) && invoker.collect) { 148 args += [ "--collect" ] 149 } 150 151 if (defined(module_install_images)) { 152 if (defined(module_install_dir) && module_install_dir != "") { 153 args += [ 154 "--module-install-dir", 155 module_install_dir, 156 ] 157 } 158 if (defined(relative_install_dir) && relative_install_dir != "") { 159 args += [ 160 "--relative-install-dir", 161 relative_install_dir, 162 ] 163 } 164 args += [ "--install-images" ] 165 args += module_install_images 166 } 167 168 # if prebuilt, add prebuilt=True 169 if (defined(invoker.prebuilt) && invoker.prebuilt) { 170 args += [ 171 "--prebuilt", 172 "--module-source", 173 module_source, 174 ] 175 } 176 177 if (module_output_extension != "") { 178 args += [ 179 "--suffix", 180 module_output_extension, 181 ] 182 } 183 184 if (defined(invoker.symlink_target_name)) { 185 args += [ "--symlink-target" ] 186 args += invoker.symlink_target_name 187 } 188 189 if (defined(invoker.output_prefix_override) && 190 invoker.output_prefix_override) { 191 args += [ "--prefix-override" ] 192 } 193 if (defined(notice)) { 194 args += [ 195 "--notice", 196 rebase_path(notice, root_build_dir), 197 ] 198 } 199 200 if (defined(part_name)) { 201 args += [ 202 "--part-name", 203 part_name, 204 ] 205 } 206 if (defined(subsystem_name)) { 207 args += [ 208 "--subsystem-name", 209 subsystem_name, 210 ] 211 } 212 if (defined(shlib_type)) { 213 args += [ 214 "--shlib-type", 215 shlib_type, 216 ] 217 } 218 if (defined(innerapi_tags)) { 219 args += [ "--innerapi-tags" ] 220 args += innerapi_tags 221 } 222 if (defined(version_script)) { 223 args += [ 224 "--version_script", 225 version_script, 226 ] 227 } 228 if (defined(symlink_ext)) { 229 args += [ "--symlink-ext" ] 230 args += symlink_ext 231 } 232 if (defined(symlink_path) && symlink_path != "") { 233 args += [ 234 "--symlink-path", 235 symlink_path, 236 ] 237 } 238 script = gen_script 239 outputs = [ output_file ] 240 } 241 242 generated_file("${target_name}_install_info") { 243 outputs = [ "${target_out_dir}/${module_name}_install_info.json" ] 244 data_keys = [ "install_modules" ] 245 output_conversion = "json" 246 deps = module_deps 247 } 248} 249 250template("write_meta_data") { 251 assert(defined(invoker.meta_data), "meta_data must be defined") 252 assert(defined(invoker.type), "type must be defined") 253 forward_variables_from(invoker, [ "testonly" ]) 254 255 action_with_pydeps(target_name) { 256 forward_variables_from(invoker, 257 [ 258 "deps", 259 "meta_data", 260 "type", 261 "resources", 262 "hap_path", 263 "app_profile", 264 "hap_profile", 265 "package_name", 266 "raw_assets", 267 "js_assets", 268 "ets_assets", 269 "js2abc", 270 "unresolved_assets", 271 ]) 272 if (type != "js_assets" && type != "ets_assets" && 273 type != "unresolved_assets" && type != "assets" && 274 type != "resources" && type != "hap" && type != "app_profile") { 275 assert( 276 false, 277 "type must be one of [js_assets, ets_assets, unresolved_assets, assets, resources, hap, app_profile]") 278 } 279 if (type != "hap") { 280 _parent_invoker = invoker.invoker 281 _caller_target_name = get_label_info(":${_parent_invoker.target_name}", 282 "label_no_toolchain") 283 sources = [ _caller_target_name ] 284 sources = filter_exclude(sources, app_target_allowlist) 285 if (sources != []) { 286 if (type == "js_assets" || type == "ets_assets" || 287 type == "unresolved_assets" || type == "assets") { 288 assert( 289 false, 290 "Illegal target name: \"${_caller_target_name}\", target name of ohos_js_assets or ohos_assets must endswith assets or asset ") 291 } else if (type == "resources") { 292 assert( 293 false, 294 "Illegal target name: \"${_caller_target_name}\", target name of ohos_resources must endswith res or resources or resource") 295 } 296 } 297 } 298 299 script = "//build/templates/metadata/write_meta_data.py" 300 outputs = [ meta_data ] 301 depfile = "$target_gen_dir/$target_name.d" 302 303 args = [ 304 "--output", 305 rebase_path(meta_data, root_build_dir), 306 "--type", 307 type, 308 "--depfile", 309 rebase_path(depfile, root_build_dir), 310 ] 311 312 if (!defined(deps)) { 313 deps = [] 314 } 315 316 _possible_deps = [] 317 if (defined(invoker.possible_deps)) { 318 _possible_deps = invoker.possible_deps 319 } 320 321 _deps_metadata = [] 322 inputs = [] 323 foreach(d, _possible_deps) { 324 sources_raw = [] 325 _target_label = get_label_info(d, "label_no_toolchain") 326 sources_raw += [ _target_label ] 327 sources = filter_exclude(sources_raw, app_target_allowlist) 328 if (sources == []) { 329 _deps_metadata += [ get_label_info(d, "target_gen_dir") + "/" + 330 get_label_info(d, "name") + ".metadata" ] 331 deps += [ "${_target_label}__metadata" ] 332 } 333 } 334 335 if (_deps_metadata != []) { 336 args += [ "--deps-metadata" ] 337 foreach(d, _deps_metadata) { 338 args += [ rebase_path(d, root_build_dir) ] 339 } 340 inputs += _deps_metadata 341 } 342 343 if (defined(resources)) { 344 args += [ "--resources" ] 345 foreach(res, resources) { 346 args += [ rebase_path(res, root_build_dir) ] 347 } 348 if (defined(package_name)) { 349 args += [ 350 "--package-name", 351 package_name, 352 ] 353 } 354 } 355 356 if (defined(app_profile)) { 357 args += [ 358 "--app-profile", 359 rebase_path(app_profile, root_build_dir), 360 ] 361 } 362 363 if (defined(hap_profile)) { 364 args += [ 365 "--hap-profile", 366 rebase_path(hap_profile, root_build_dir), 367 ] 368 } 369 370 if (defined(raw_assets)) { 371 args += [ "--raw-assets" ] 372 foreach(asset, raw_assets) { 373 args += [ rebase_path(asset, root_build_dir) ] 374 } 375 } 376 377 if (defined(js_assets)) { 378 args += [ "--js-assets" ] 379 foreach(asset, js_assets) { 380 args += [ rebase_path(asset, root_build_dir) ] 381 } 382 } 383 384 if (defined(ets_assets)) { 385 args += [ "--ets-assets" ] 386 foreach(asset, ets_assets) { 387 args += [ rebase_path(asset, root_build_dir) ] 388 } 389 } 390 391 if (defined(unresolved_assets)) { 392 args += [ "--unresolved-assets" ] 393 foreach(asset, unresolved_assets) { 394 args += [ rebase_path(asset, root_build_dir) ] 395 } 396 } 397 398 if (defined(js2abc) && js2abc) { 399 args += [ "--js2abc" ] 400 } 401 402 if (defined(hap_path)) { 403 args += [ 404 "--hap-path", 405 rebase_path(hap_path, root_build_dir), 406 ] 407 } 408 } 409} 410