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/ohos/app/app_internal.gni") 16import("//build/ohos/notice/notice.gni") 17import("//build/ohos_var.gni") 18import("//build/templates/metadata/module_info.gni") 19 20# Declare an OHOS AppScope target 21# 22# Variables: 23# app_profile: common config of hap. 24# sources: list of asset files to be included in hap. 25# 26template("ohos_app_scope") { 27 forward_variables_from(invoker, [ "testonly" ]) 28 assert(defined(invoker.app_profile), 29 "app_profile must be defined for ohos_app_scope") 30 assert(defined(invoker.sources), "sources must be defined for ohos_app_scope") 31 32 _metadata = "$target_gen_dir/$target_name.metadata" 33 _metadata_target = "${target_name}__metadata" 34 write_meta_data(_metadata_target) { 35 forward_variables_from(invoker, [ "app_profile" ]) 36 type = "app_profile" 37 meta_data = _metadata 38 resources = invoker.sources 39 app_profile = invoker.app_profile 40 } 41 group(target_name) { 42 public_deps = [ ":$_metadata_target" ] 43 } 44} 45 46# Declare an OHOS assets target 47# 48# Variables: 49# deps: dependencies of this target. 50# sources: list of asset files to be included in hap. 51# 52template("ohos_assets") { 53 forward_variables_from(invoker, [ "testonly" ]) 54 assert(defined(invoker.sources), "sources must be defined for ohos_assets") 55 _metadata = "$target_gen_dir/$target_name.metadata" 56 57 _metadata_target = "${target_name}__metadata" 58 write_meta_data(_metadata_target) { 59 forward_variables_from(invoker, [ "deps" ]) 60 type = "assets" 61 meta_data = _metadata 62 raw_assets = invoker.sources 63 } 64 group(target_name) { 65 public_deps = [ ":$_metadata_target" ] 66 } 67} 68 69# Declare a js assets target 70# 71# Variables: 72# source_dir: js assets directory, only one directory supported, string not list. 73# js2abc: whether to transform js bundle to ark bytecode, default value 74# follows build_ark. 75# ets2abc: whether to transform ets bundle to ark bytecode, default value false 76# deps: dependencies of this target. 77# 78template("ohos_js_assets") { 79 forward_variables_from(invoker, [ "testonly" ]) 80 assert(defined(invoker.source_dir), 81 "source_dir must be defined for ohos_js_assets") 82 83 _metadata = "$target_gen_dir/$target_name.metadata" 84 _metadata_target = "${target_name}__metadata" 85 write_meta_data(_metadata_target) { 86 forward_variables_from(invoker, 87 [ 88 "source_dir", 89 "deps", 90 ]) 91 meta_data = _metadata 92 if (defined(invoker.ets2abc) && invoker.ets2abc) { 93 type = "ets_assets" 94 ets_assets = [ source_dir ] 95 } else if (defined(invoker.js2abc) && invoker.js2abc) { 96 type = "js_assets" 97 js_assets = [ source_dir ] 98 } else { 99 type = "unresolved_assets" 100 unresolved_assets = [ source_dir ] 101 } 102 if (defined(invoker.hap_profile)) { 103 hap_profile = invoker.hap_profile 104 } 105 } 106 group(target_name) { 107 public_deps = [ ":$_metadata_target" ] 108 } 109} 110 111# Declare an OHOS resource target 112# 113# Variables: 114# deps: dependencies of this target. 115# sources: list of resource files to be compiled. 116# hap_profile: hap_profile is used when building resources. 117# 118template("ohos_resources") { 119 forward_variables_from(invoker, [ "testonly" ]) 120 assert(defined(invoker.sources), "sources must be defined for ohos_resources") 121 _metadata = "$target_gen_dir/$target_name.metadata" 122 123 _deps = [] 124 if (defined(invoker.deps)) { 125 _deps += invoker.deps 126 } 127 128 module_config = "" 129 module_configs = string_split(invoker.hap_profile, "/") 130 foreach(_module_config, module_configs) { 131 module_config = _module_config 132 } 133 _generated_profile = "$target_gen_dir/${target_name}/${module_config}" 134 _metadata_target = "${target_name}__metadata" 135 write_meta_data(_metadata_target) { 136 forward_variables_from(invoker, [ "package_name" ]) 137 type = "resources" 138 meta_data = _metadata 139 resources = invoker.sources 140 hap_profile = _generated_profile 141 deps = _deps 142 possible_deps = _deps 143 } 144 145 _deps += [ ":$_metadata_target" ] 146 147 # compile_resources target here only used for concat app.json to module.json 148 _compile_profile_target = "${target_name}__compile_profile" 149 merge_profile(_compile_profile_target) { 150 forward_variables_from(invoker, 151 [ 152 "deps", 153 "hap_profile", 154 ]) 155 meta_data = _metadata 156 generated_profile = _generated_profile 157 if (defined(deps)) { 158 deps += _deps 159 } else { 160 deps = _deps 161 } 162 } 163 164 _deps += [ ":$_compile_profile_target" ] 165 166 # compile_resources target here only used for resources.h generation 167 _compile_resources_target = "${target_name}__compile_resources" 168 _generated_header_dir = "$target_gen_dir/$target_name" 169 compile_resources(_compile_resources_target) { 170 forward_variables_from(invoker, 171 [ 172 "deps", 173 "package_name", 174 ]) 175 hap_profile = _generated_profile 176 meta_data = _metadata 177 generated_header_dir = _generated_header_dir 178 if (defined(deps)) { 179 deps += _deps 180 } else { 181 deps = _deps 182 } 183 } 184 185 _resources_config = "${target_name}__resources_headers" 186 config(_resources_config) { 187 include_dirs = [ _generated_header_dir ] 188 } 189 190 group(target_name) { 191 public_deps = [ ":$_metadata_target" ] 192 deps = [ 193 ":$_compile_profile_target", 194 ":$_compile_resources_target", 195 ] 196 public_configs = [ ":$_resources_config" ] 197 } 198} 199 200# Declare an OHOS hap target 201# 202# Variables: 203# deps: dependencies of this target. 204# hap_name: name of output hap file. 205# final_hap_path: full path of output hap file, final_hap_path overwrites hap_name. 206# js2abc: whether to transform js bundle to ark bytecode, default value 207# follows build_ark. 208# ets2abc: whether to transform js bundle to ark bytecode, default value false 209# 210# 211template("ohos_hap") { 212 forward_variables_from(invoker, [ "testonly" ]) 213 assert(defined(invoker.hap_profile), 214 "hap_profile must be defined for ohos_hap") 215 216 _deps = [] 217 if (defined(invoker.deps)) { 218 _deps = invoker.deps 219 } 220 221 _hap_profile = invoker.hap_profile 222 _hap_name = target_name 223 if (defined(invoker.hap_name)) { 224 _hap_name = invoker.hap_name 225 } 226 227 _hap_path = "$target_out_dir/$_hap_name.hap" 228 if (defined(invoker.final_hap_path)) { 229 _hap_path = invoker.final_hap_path 230 } 231 232 _js2abc = build_ark 233 if (defined(invoker.js2abc)) { 234 _js2abc = invoker.js2abc 235 } 236 237 _ets2abc = false 238 if (defined(invoker.ets2abc)) { 239 _ets2abc = invoker.ets2abc 240 } 241 242 if (_ets2abc) { 243 _js2abc = false 244 } 245 246 _js_build_mode = "release" 247 if (defined(invoker.js_build_mode)) { 248 _js_build_mode = invoker.js_build_mode 249 } 250 251 _main_target_name = target_name 252 253 if (defined(invoker.subsystem_name) && defined(invoker.part_name)) { 254 _subsystem_name = invoker.subsystem_name 255 _part_name = invoker.part_name 256 } else if (defined(invoker.part_name)) { 257 _part_name = invoker.part_name 258 _part_subsystem_info_file = 259 "$root_build_dir/build_configs/parts_info/part_subsystem.json" 260 _arguments = [ 261 "--part-name", 262 _part_name, 263 "--part-subsystem-info-file", 264 rebase_path(_part_subsystem_info_file, root_build_dir), 265 ] 266 _get_subsystem_script = "//build/templates/common/get_subsystem_name.py" 267 _subsystem_name = 268 exec_script(_get_subsystem_script, _arguments, "trim string") 269 } else if (defined(invoker.subsystem_name)) { 270 _subsystem_name = invoker.subsystem_name 271 _part_name = _subsystem_name 272 } else { 273 _subsystem_name = "common" 274 _part_name = _subsystem_name 275 } 276 277 assert(_subsystem_name != "") # Mark as used 278 assert(_part_name != "") # Mark as used 279 280 # metadata is used to record all necessary data for hap. 281 _metadata_target = "${target_name}__metadata" 282 _meta_data = "$target_gen_dir/$target_name.metadata" 283 write_meta_data(_metadata_target) { 284 forward_variables_from(invoker, 285 [ 286 "raw_assets", 287 "resources", 288 "js_assets", 289 "ets_assets", 290 ]) 291 hap_profile = invoker.hap_profile 292 meta_data = _meta_data 293 possible_deps = _deps 294 type = "hap" 295 js2abc = _js2abc 296 hap_path = _hap_path 297 } 298 299 _js_assets_target = "${target_name}__js_assets" 300 _packaged_js_assets = "$target_out_dir/$target_name/js_assets.zip" 301 compile_js_assets(_js_assets_target) { 302 hap_profile = _hap_profile 303 packaged_js_assets = _packaged_js_assets 304 meta_data = _meta_data 305 deps = [ ":$_metadata_target" ] + _deps 306 build_mode = _js_build_mode 307 js2abc = _js2abc 308 ets2abc = _ets2abc 309 if (defined(testonly) && testonly == true) { 310 main_target_name = _main_target_name 311 } 312 } 313 314 _resources_target = "${target_name}__compile_resources" 315 _packaged_resources = "$target_out_dir/$target_name/resources.zip" 316 _generated_header_dir = "$target_out_dir/$target_name" 317 compile_resources(_resources_target) { 318 hap_profile = _hap_profile 319 packaged_resources = _packaged_resources 320 generated_header_dir = _generated_header_dir 321 meta_data = _meta_data 322 deps = [ ":$_metadata_target" ] + _deps 323 } 324 325 _notice_target = "${target_name}__notice" 326 collect_notice(_notice_target) { 327 forward_variables_from(invoker, 328 [ 329 "license_as_sources", 330 "license_file", 331 ]) 332 module_type = "app" 333 module_name = _main_target_name 334 module_source_dir = get_label_info(":${_main_target_name}", "dir") 335 } 336 337 package_app(target_name) { 338 forward_variables_from(invoker, 339 [ 340 "shared_libraries", 341 "private_key_path", 342 "signature_algorithm", 343 "certificate_profile", 344 "keystore_path", 345 "keystore_password", 346 "key_alias", 347 "certificate_file", 348 ]) 349 deps = [ 350 ":$_js_assets_target", 351 ":$_metadata_target", 352 ":$_notice_target", 353 ":$_resources_target", 354 ] 355 enable_ark = build_ark 356 if (defined(shared_libraries)) { 357 deps += shared_libraries 358 } 359 packaged_js_assets = _packaged_js_assets 360 packaged_resources = _packaged_resources 361 hap_profile = _hap_profile 362 meta_data = _meta_data 363 hap_path = _hap_path 364 build_mode = _js_build_mode 365 366 install_module_info = { 367 module_def = get_label_info(":$target_name", "label_with_toolchain") 368 module_info_file = 369 rebase_path(get_label_info(module_def, "target_out_dir"), 370 root_build_dir) + "/${target_name}_module_info.json" 371 subsystem_name = _subsystem_name 372 part_name = _part_name 373 toolchain = current_toolchain 374 toolchain_out_dir = rebase_path(root_out_dir, root_build_dir) 375 } 376 } 377 378 generate_module_info("${_main_target_name}_info") { 379 module_name = _main_target_name 380 module_type = "app" 381 382 module_source_dir = get_path_info(_hap_path, "dir") 383 module_install_name = get_path_info(_hap_path, "name") 384 if (defined(invoker.module_install_name)) { 385 module_install_name = invoker.module_install_name 386 } 387 388 module_install_images = [ "system" ] 389 if (defined(invoker.install_images)) { 390 module_install_images = [] 391 module_install_images += invoker.install_images 392 } 393 install_enable = true 394 if (defined(invoker.install_enable)) { 395 install_enable = invoker.enable 396 } 397 398 module_output_extension = ".hap" 399 400 module_install_dir = "${module_type}" 401 if (defined(invoker.module_install_dir)) { 402 module_install_dir = invoker.module_install_dir 403 } 404 405 if (defined(invoker.relative_install_dir)) { 406 relative_install_dir = invoker.relative_install_dir 407 } 408 409 if (defined(invoker.symlink_target_name)) { 410 symlink_target_name = invoker.symlink_target_name 411 } 412 notice = "$target_out_dir/$_main_target_name.notice.txt" 413 } 414} 415