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 ]) 46 47 if (!defined(module_label)) { 48 if (module_type == "java_library" || module_type == "none" || 49 module_type == "app" || module_type == "dex") { 50 module_label = get_label_info(":$module_name", "label_no_toolchain") 51 } else { 52 module_label = get_label_info(":$module_name", "label_with_toolchain") 53 } 54 } 55 module_deps = [ get_label_info(module_label, "label_no_toolchain") ] 56 57 gen_script = rebase_path("//build/templates/metadata/gen_module_info.py") 58 59 if (!defined(module_source_dir)) { 60 module_source_dir = "$root_out_dir" 61 } 62 if (!defined(module_install_name)) { 63 module_install_name = module_name 64 } 65 if (!defined(module_output_extension)) { 66 module_output_extension = "" 67 } 68 69 output_file = "${target_out_dir}/${module_name}_module_info.json" 70 71 # reset module_type when module_type is lib 72 if (module_type == "lib") { 73 if (target_cpu == "arm64" || target_cpu == "x86_64") { 74 module_type = "lib64" 75 } else if (target_cpu == "arm" || target_cpu == "x86") { 76 module_type = "lib" 77 } else { 78 assert(false, "Error: unsupported target cpu name.") 79 } 80 } 81 82 if (!is_standard_system && is_asan && 83 ("${module_type}" == "lib" || "${module_type}" == "lib64" || 84 "${module_type}" == "bin")) { 85 system_base_dir = "${system_base_dir}/asan" 86 } 87 88 arguments = [ 89 "--system-base-dir", 90 system_base_dir, 91 "--ramdisk-base-dir", 92 ramdisk_base_dir, 93 "--vendor-base-dir", 94 vendor_base_dir, 95 "--updater-base-dir", 96 updater_base_dir, 97 "--sys_prod-base-dir", 98 sys_prod_base_dir, 99 "--chip_prod-base-dir", 100 chip_prod_base_dir, 101 "--type", 102 module_type, 103 "--target-label", 104 module_label, 105 "--source-dir", 106 rebase_path(module_source_dir, "$root_build_dir"), 107 "--label-name", 108 module_name, 109 "--install-name", 110 module_install_name, 111 "--output-file", 112 rebase_path(output_file, "$root_build_dir"), 113 ] 114 115 if (defined(invoker.module_alt_output_extension)) { 116 arguments += [ 117 "--alternative-suffix", 118 invoker.module_alt_output_extension, 119 ] 120 } 121 122 if (defined(invoker.install_enable) && !invoker.install_enable) { 123 arguments += [ "--install-enable" ] 124 } 125 if (defined(invoker.collect) && invoker.collect) { 126 arguments += [ "--collect" ] 127 } 128 129 if (defined(module_install_images)) { 130 if (!defined(module_install_dir)) { 131 module_install_dir = "" 132 } 133 if (!defined(relative_install_dir)) { 134 relative_install_dir = "" 135 } 136 arguments += [ 137 "--module-install-dir", 138 module_install_dir, 139 "--relative-install-dir", 140 relative_install_dir, 141 "--install-images", 142 ] 143 arguments += module_install_images 144 } 145 146 # if prebuilt, add prebuilt=True 147 if (defined(invoker.prebuilt) && invoker.prebuilt) { 148 arguments += [ 149 "--prebuilt", 150 "--module-source", 151 module_source, 152 ] 153 } else { 154 arguments += [ 155 "--install-name", 156 module_install_name, 157 ] 158 } 159 160 if (module_output_extension != "") { 161 arguments += [ 162 "--suffix", 163 module_output_extension, 164 ] 165 } 166 167 if (defined(invoker.symlink_target_name)) { 168 arguments += [ "--symlink-target" ] 169 arguments += invoker.symlink_target_name 170 } 171 172 if (defined(invoker.output_prefix_override) && 173 invoker.output_prefix_override) { 174 arguments += [ "--prefix-override" ] 175 } 176 if (defined(notice)) { 177 arguments += [ 178 "--notice", 179 rebase_path(notice, root_build_dir), 180 ] 181 } 182 183 exec_script(gen_script, arguments) 184 185 generated_file("${target_name}") { 186 outputs = [ "${target_out_dir}/${module_name}_install_info.json" ] 187 data_keys = [ "install_modules" ] 188 output_conversion = "json" 189 deps = module_deps 190 } 191} 192 193template("write_meta_data") { 194 assert(defined(invoker.meta_data), "meta_data must be defined") 195 assert(defined(invoker.type), "type must be defined") 196 forward_variables_from(invoker, [ "testonly" ]) 197 198 action_with_pydeps(target_name) { 199 forward_variables_from(invoker, 200 [ 201 "deps", 202 "meta_data", 203 "type", 204 "resources", 205 "hap_path", 206 "app_profile", 207 "hap_profile", 208 "package_name", 209 "raw_assets", 210 "js_assets", 211 "ets_assets", 212 "js2abc", 213 "unresolved_assets", 214 ]) 215 if (type != "js_assets" && type != "ets_assets" && 216 type != "unresolved_assets" && type != "assets" && 217 type != "resources" && type != "hap" && type != "app_profile") { 218 assert( 219 false, 220 "type must be one of [js_assets, ets_assets, unresolved_assets, assets, resources, hap, app_profile]") 221 } 222 if (type != "hap") { 223 _parent_invoker = invoker.invoker 224 _caller_target_name = get_label_info(":${_parent_invoker.target_name}", 225 "label_no_toolchain") 226 set_sources_assignment_filter(app_target_allowlist) 227 sources = [ _caller_target_name ] 228 if (sources != []) { 229 if (type == "js_assets" || type == "ets_assets" || 230 type == "unresolved_assets" || type == "assets") { 231 assert( 232 false, 233 "Illegal target name: \"${_caller_target_name}\", target name of ohos_js_assets or ohos_assets must endswith assets or asset ") 234 } else if (type == "resources") { 235 assert( 236 false, 237 "Illegal target name: \"${_caller_target_name}\", target name of ohos_resources must endswith res or resources or resource") 238 } 239 } 240 set_sources_assignment_filter([]) 241 } 242 243 script = "//build/templates/metadata/write_meta_data.py" 244 outputs = [ meta_data ] 245 depfile = "$target_gen_dir/$target_name.d" 246 247 args = [ 248 "--output", 249 rebase_path(meta_data, root_build_dir), 250 "--type", 251 type, 252 "--depfile", 253 rebase_path(depfile, root_build_dir), 254 ] 255 256 if (!defined(deps)) { 257 deps = [] 258 } 259 260 _possible_deps = [] 261 if (defined(invoker.possible_deps)) { 262 _possible_deps = invoker.possible_deps 263 } 264 265 _deps_metadata = [] 266 inputs = [] 267 set_sources_assignment_filter(app_target_allowlist) 268 foreach(d, _possible_deps) { 269 sources = [] 270 _target_label = get_label_info(d, "label_no_toolchain") 271 sources += [ _target_label ] 272 if (sources == []) { 273 _deps_metadata += [ get_label_info(d, "target_gen_dir") + "/" + 274 get_label_info(d, "name") + ".metadata" ] 275 deps += [ "${_target_label}__metadata" ] 276 } 277 } 278 set_sources_assignment_filter([]) 279 280 if (_deps_metadata != []) { 281 args += [ "--deps-metadata" ] 282 foreach(d, _deps_metadata) { 283 args += [ rebase_path(d, root_build_dir) ] 284 } 285 inputs += _deps_metadata 286 } 287 288 if (defined(resources)) { 289 args += [ "--resources" ] 290 foreach(res, resources) { 291 args += [ rebase_path(res, root_build_dir) ] 292 } 293 if (defined(package_name)) { 294 args += [ 295 "--package-name", 296 package_name, 297 ] 298 } 299 } 300 301 if (defined(app_profile)) { 302 args += [ 303 "--app-profile", 304 rebase_path(app_profile, root_build_dir), 305 ] 306 } 307 308 if (defined(hap_profile)) { 309 args += [ 310 "--hap-profile", 311 rebase_path(hap_profile, root_build_dir), 312 ] 313 } 314 315 if (defined(raw_assets)) { 316 args += [ "--raw-assets" ] 317 foreach(asset, raw_assets) { 318 args += [ rebase_path(asset, root_build_dir) ] 319 } 320 } 321 322 if (defined(js_assets)) { 323 args += [ "--js-assets" ] 324 foreach(asset, js_assets) { 325 args += [ rebase_path(asset, root_build_dir) ] 326 } 327 } 328 329 if (defined(ets_assets)) { 330 args += [ "--ets-assets" ] 331 foreach(asset, ets_assets) { 332 args += [ rebase_path(asset, root_build_dir) ] 333 } 334 } 335 336 if (defined(unresolved_assets)) { 337 args += [ "--unresolved-assets" ] 338 foreach(asset, unresolved_assets) { 339 args += [ rebase_path(asset, root_build_dir) ] 340 } 341 } 342 343 if (defined(js2abc) && js2abc) { 344 args += [ "--js2abc" ] 345 } 346 347 if (defined(hap_path)) { 348 args += [ 349 "--hap-path", 350 rebase_path(hap_path, root_build_dir), 351 ] 352 } 353 } 354} 355