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_var.gni") 16import("//build/templates/metadata/module_info.gni") 17 18template("merge_profile") { 19 forward_variables_from(invoker, [ "testonly" ]) 20 assert(defined(invoker.hap_profile), 21 "hap_profile must be defined for compile_resources") 22 action(target_name) { 23 forward_variables_from(invoker, 24 [ 25 "meta_data", 26 "hap_profile", 27 "generated_profile", 28 "deps", 29 ]) 30 script = "//build/scripts/merge_profile.py" 31 depfile = "$target_gen_dir/$target_name.d" 32 33 _rebased_metadata = rebase_path(meta_data, root_build_dir) 34 inputs = [ 35 meta_data, 36 restool, 37 hap_profile, 38 ] 39 args = [ 40 "--resources-dir=@FileArg($_rebased_metadata:root:resources)", 41 "--depfile", 42 rebase_path(depfile, root_build_dir), 43 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 44 "--hap-profile", 45 rebase_path(hap_profile, root_build_dir), 46 "--generated-profile", 47 rebase_path(generated_profile, root_build_dir), 48 ] 49 outputs = [ generated_profile ] 50 } 51} 52 53template("compile_resources") { 54 forward_variables_from(invoker, [ "testonly" ]) 55 assert(defined(invoker.hap_profile), 56 "hap_profile must be defined for compile_resources") 57 assert( 58 defined(invoker.packaged_resources) || 59 defined(invoker.generated_header_dir), 60 "hap_profile or generated_header_dir must be defined for compile_resources") 61 _generate_resource = defined(invoker.packaged_resources) 62 if (_generate_resource) { 63 _packaged_resources = invoker.packaged_resources 64 } 65 _generate_header = defined(invoker.generated_header_dir) 66 if (_generate_header) { 67 _generated_header_file = invoker.generated_header_dir + "/ResourceTable.h" 68 } 69 action_with_pydeps(target_name) { 70 forward_variables_from(invoker, 71 [ 72 "meta_data", 73 "hap_profile", 74 "deps", 75 ]) 76 script = "//build/scripts/compile_resources.py" 77 depfile = "$target_gen_dir/$target_name.d" 78 79 _rebased_metadata = rebase_path(meta_data, root_build_dir) 80 inputs = [ 81 meta_data, 82 restool, 83 hap_profile, 84 ] 85 args = [ 86 "--resources-dir=@FileArg($_rebased_metadata:root:resources)", 87 "--depfile", 88 rebase_path(depfile, root_build_dir), 89 "--restool-path", 90 rebase_path(restool, root_build_dir), 91 "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)", 92 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 93 ] 94 outputs = [] 95 if (_generate_resource) { 96 outputs += [ _packaged_resources ] 97 args += [ 98 "--output-resources-zipfile", 99 rebase_path(_packaged_resources, root_build_dir), 100 ] 101 } 102 if (_generate_header) { 103 outputs += [ _generated_header_file ] 104 args += [ 105 "--output-header-file", 106 rebase_path(_generated_header_file, root_build_dir), 107 ] 108 } 109 } 110} 111 112template("package_app") { 113 forward_variables_from(invoker, [ "testonly" ]) 114 assert(defined(invoker.hap_profile), 115 "hap_profile must be defined for $target_name") 116 assert(defined(invoker.hap_path), "hap_path must be defined for $target_name") 117 action_with_pydeps(target_name) { 118 forward_variables_from(invoker, 119 [ 120 "deps", 121 "shared_libraries", 122 "hap_profile", 123 "hap_path", 124 "packaged_resources", 125 "packaged_js_assets", 126 "meta_data", 127 "private_key_path", 128 "signature_algorithm", 129 "certificate_profile", 130 "keystore_path", 131 "keystore_password", 132 "key_alias", 133 "certificate_file", 134 "install_module_info", 135 "enable_ark", 136 "build_mode", 137 ]) 138 script = "//build/scripts/hapbuilder.py" 139 depfile = "$target_gen_dir/$target_name.d" 140 _rebased_metadata = rebase_path(meta_data, root_build_dir) 141 outputs = [ hap_path ] 142 args = [ 143 "--depfile", 144 rebase_path(depfile, root_build_dir), 145 "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)", 146 "--hapsigner", 147 rebase_path(hapsigner, root_build_dir), 148 "--hap-packing-tool", 149 rebase_path(hap_packing_tool, root_build_dir), 150 "--hap-path", 151 rebase_path(hap_path, root_build_dir), 152 "--packaged-resources", 153 rebase_path(packaged_resources, root_build_dir), 154 "--packaged-js-assets", 155 rebase_path(packaged_js_assets, root_build_dir), 156 "--assets=@FileArg($_rebased_metadata:root:assets)", 157 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 158 "--build-mode", 159 build_mode, 160 ] 161 162 inputs = [ 163 hap_profile, 164 hapsigner, 165 hap_packing_tool, 166 packaged_js_assets, 167 packaged_resources, 168 meta_data, 169 ] 170 171 _private_key_path = default_hap_private_key_path 172 if (defined(private_key_path)) { 173 _private_key_path = private_key_path 174 } 175 _signature_algorithm = default_signature_algorithm 176 if (defined(signature_algorithm)) { 177 _signature_algorithm = signature_algorithm 178 } 179 _key_alias = default_key_alias 180 if (defined(key_alias)) { 181 _key_alias = key_alias 182 } 183 _keystore_path = default_keystore_path 184 if (defined(keystore_path)) { 185 _keystore_path = keystore_path 186 } 187 _keystore_password = default_keystore_password 188 if (defined(keystore_password)) { 189 _keystore_password = keystore_password 190 } 191 _certificate_file = default_hap_certificate_file 192 if (defined(certificate_file)) { 193 _certificate_file = certificate_file 194 } 195 196 inputs += [ 197 certificate_profile, 198 _keystore_path, 199 _certificate_file, 200 ] 201 202 args += [ 203 "--private-key-path", 204 _private_key_path, 205 "--sign-algo", 206 _signature_algorithm, 207 "--certificate-profile", 208 rebase_path(certificate_profile, root_build_dir), 209 "--keyalias", 210 _key_alias, 211 "--keystore-path", 212 rebase_path(_keystore_path, root_build_dir), 213 "--keystorepasswd", 214 _keystore_password, 215 "--certificate-file", 216 rebase_path(_certificate_file, root_build_dir), 217 ] 218 219 if (defined(shared_libraries)) { 220 foreach(lib, shared_libraries) { 221 _module_info = get_label_info(lib, "target_out_dir") + "/" + 222 get_label_info(lib, "name") + "_module_info.json" 223 _rebased_module_info = rebase_path(_module_info, root_build_dir) 224 args += [ "--dso=@FileArg($_rebased_module_info:source)" ] 225 } 226 } 227 228 if (defined(install_module_info)) { 229 metadata = { 230 install_modules = [ install_module_info ] 231 } 232 } 233 if (defined(enable_ark) && enable_ark) { 234 _ark_dpes = [ 235 "//ark/ts2abc/ts2panda:ts2abc_js_file($host_toolchain)", 236 "//ark/ts2abc/ts2panda:ark_ts2abc_build($host_toolchain)", 237 ] 238 if (defined(deps)) { 239 deps += _ark_dpes 240 } else { 241 deps = _ark_dpes 242 } 243 _js2abc_js = get_label_info( 244 "//ark/ts2abc/ts2panda:ts2abc_js_file($host_toolchain)", 245 "target_out_dir") + "/ts2abc.js" 246 args += [ 247 "--nodejs-path", 248 rebase_path(nodejs, root_build_dir), 249 "--js2abc-js", 250 rebase_path(_js2abc_js, root_build_dir), 251 "--enable-ark", 252 ] 253 inputs += [ 254 nodejs, 255 _js2abc_js, 256 ] 257 } 258 } 259} 260 261template("compile_js_assets") { 262 forward_variables_from(invoker, [ "testonly" ]) 263 assert(defined(invoker.meta_data) && defined(invoker.packaged_js_assets), 264 "meta_data and packaged_js_assets must be for compile_js_assets") 265 266 _packaged_js_assets = invoker.packaged_js_assets 267 action_with_pydeps(target_name) { 268 forward_variables_from(invoker, 269 [ 270 "deps", 271 "meta_data", 272 "hap_profile", 273 "build_mode", 274 "js2abc", 275 "ets2abc", 276 "main_target_name", 277 ]) 278 script = "//build/scripts/build_js_assets.py" 279 depfile = "$target_gen_dir/$target_name.d" 280 outputs = [ _packaged_js_assets ] 281 282 _rebased_metadata = rebase_path(meta_data, root_build_dir) 283 284 if (!defined(deps)) { 285 deps = [] 286 } 287 deps += [ 288 "//ark/ts2abc/ts2panda:ark_ts2abc_build($host_toolchain)", 289 "//developtools/ace-ets2bundle:ets_loader_node_modules", 290 "//developtools/ace-js2bundle:ace_loader_node_modules", 291 ] 292 _ace_loader_home = 293 get_label_info("//developtools/ace-js2bundle:ace_loader_node_modules", 294 "target_out_dir") + "/ace_loader_ark" 295 _webpack_config_js = "${_ace_loader_home}/webpack.rich.config.js" 296 _ets_loader_home = 297 get_label_info("//developtools/ace-ets2bundle:ets_loader_node_modules", 298 "target_out_dir") + "/ets_loader_ark" 299 _webpack_config_ets = "${_ets_loader_home}/webpack.config.js" 300 _webpack_js = "${_ace_loader_home}/node_modules/webpack/bin/webpack.js" 301 302 inputs = [ 303 meta_data, 304 nodejs, 305 ] 306 307 args = [ 308 "--js-assets-dir=@FileArg($_rebased_metadata:root:js_assets)", 309 "--ets-assets-dir=@FileArg($_rebased_metadata:root:ets_assets)", 310 "--output", 311 rebase_path(_packaged_js_assets, root_build_dir), 312 "--depfile", 313 rebase_path(depfile, root_build_dir), 314 "--nodejs-path", 315 rebase_path(nodejs, root_build_dir), 316 "--webpack-js", 317 rebase_path(_webpack_js, root_build_dir), 318 "--webpack-config-js", 319 rebase_path(_webpack_config_js, root_build_dir), 320 "--webpack-config-ets", 321 rebase_path(_webpack_config_ets, root_build_dir), 322 "--build-mode", 323 build_mode, 324 "--ace-loader-home", 325 rebase_path(_ace_loader_home, root_build_dir), 326 "--ets-loader-home", 327 rebase_path(_ets_loader_home, root_build_dir), 328 "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)", 329 "--app-profile=@FileArg($_rebased_metadata:root:app_profile)", 330 ] 331 if (defined(testonly) && testonly == true) { 332 _js_sources_file = target_gen_dir + "/$main_target_name.sources" 333 args += [ 334 "--js-sources-file", 335 rebase_path(_js_sources_file, root_build_dir), 336 ] 337 outputs += [ _js_sources_file ] 338 } 339 340 if (js2abc || ets2abc) { 341 _ark_dir = get_label_info( 342 "//ark/ts2abc/ts2panda:ark_ts2abc_build($host_toolchain)", 343 "target_out_dir") 344 if (ets2abc) { 345 args += [ "--ets2abc" ] 346 } else if (js2abc) { 347 args += [ "--js2abc" ] 348 } 349 args += [ 350 "--ark-frontend-dir", 351 rebase_path(_ark_dir, root_build_dir), 352 ] 353 } 354 355 if (defined(hap_profile)) { 356 inputs += [ hap_profile ] 357 } 358 } 359} 360