• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
18if (is_ohos) {
19  import("//build/config/ohos/abi.gni")
20}
21
22template("merge_profile") {
23  forward_variables_from(invoker, [ "testonly" ])
24  assert(defined(invoker.hap_profile),
25         "hap_profile must be defined for compile_resources")
26  action(target_name) {
27    forward_variables_from(invoker,
28                           [
29                             "meta_data",
30                             "hap_profile",
31                             "generated_profile",
32                             "deps",
33                           ])
34    script = "//build/scripts/merge_profile.py"
35    depfile = "$target_gen_dir/$target_name.d"
36
37    _rebased_metadata = rebase_path(meta_data, root_build_dir)
38    inputs = [
39      meta_data,
40      hap_profile,
41    ]
42    args = [
43      "--resources-dir=@FileArg($_rebased_metadata:root:resources)",
44      "--depfile",
45      rebase_path(depfile, root_build_dir),
46      "--app-profile=@FileArg($_rebased_metadata:root:app_profile)",
47      "--hap-profile",
48      rebase_path(hap_profile, root_build_dir),
49      "--generated-profile",
50      rebase_path(generated_profile, root_build_dir),
51      "--release-type",
52      release_type,
53    ]
54    outputs = [ generated_profile ]
55  }
56}
57
58template("compile_resources") {
59  forward_variables_from(invoker, [ "testonly" ])
60  assert(defined(invoker.hap_profile),
61         "hap_profile must be defined for compile_resources")
62  assert(
63      defined(invoker.packaged_resources) ||
64          defined(invoker.generated_header_dir),
65      "hap_profile or generated_header_dir must be defined for compile_resources")
66  _generate_resource = defined(invoker.packaged_resources)
67  if (_generate_resource) {
68    _packaged_resources = invoker.packaged_resources
69  }
70  _generate_header = defined(invoker.generated_header_dir)
71  if (_generate_header) {
72    _generated_header_file = invoker.generated_header_dir + "/ResourceTable.h"
73  }
74  action_with_pydeps(target_name) {
75    forward_variables_from(invoker,
76                           [
77                             "meta_data",
78                             "hap_profile",
79                             "deps",
80                           ])
81    script = "//build/scripts/compile_resources.py"
82    depfile = "$target_gen_dir/$target_name.d"
83    if (defined(deps)) {
84      deps += [
85        "//developtools/global_resource_tool:restool($host_toolchain)",
86        "//developtools/global_resource_tool:restool_id_defined($host_toolchain)",
87      ]
88    } else {
89      deps = [
90        "//developtools/global_resource_tool:restool($host_toolchain)",
91        "//developtools/global_resource_tool:restool_id_defined($host_toolchain)",
92      ]
93    }
94    restool_path =
95        get_label_info(
96            "//developtools/global_resource_tool:restool($host_toolchain)",
97            "root_out_dir") + "/developtools/global_resource_tool/restool"
98    _rebased_metadata = rebase_path(meta_data, root_build_dir)
99    inputs = [
100      meta_data,
101      restool_path,
102      hap_profile,
103    ]
104    args = [
105      "--resources-dir=@FileArg($_rebased_metadata:root:resources)",
106      "--depfile",
107      rebase_path(depfile, root_build_dir),
108      "--restool-path",
109      rebase_path(restool_path, root_build_dir),
110      "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)",
111      "--app-profile=@FileArg($_rebased_metadata:root:app_profile)",
112    ]
113    outputs = []
114    if (_generate_resource) {
115      outputs += [ _packaged_resources ]
116      args += [
117        "--output-resources-zipfile",
118        rebase_path(_packaged_resources, root_build_dir),
119      ]
120    }
121    if (_generate_header) {
122      outputs += [ _generated_header_file ]
123      args += [
124        "--output-header-file",
125        rebase_path(_generated_header_file, root_build_dir),
126      ]
127    }
128  }
129}
130
131template("package_app") {
132  forward_variables_from(invoker, [ "testonly" ])
133  assert(defined(invoker.hap_profile),
134         "hap_profile must be defined for $target_name")
135  assert(defined(invoker.hap_path), "hap_path must be defined for $target_name")
136  action_with_pydeps(target_name) {
137    forward_variables_from(invoker,
138                           [
139                             "deps",
140                             "shared_libraries",
141                             "hap_profile",
142                             "hap_path",
143                             "packaged_resources",
144                             "packaged_js_assets",
145                             "meta_data",
146                             "private_key_path",
147                             "signature_algorithm",
148                             "certificate_profile",
149                             "keystore_path",
150                             "keystore_password",
151                             "key_alias",
152                             "certificate_file",
153                             "install_module_info",
154                             "enable_ark",
155                             "build_mode",
156                             "compatible_version",
157                           ])
158    script = "//build/scripts/hapbuilder.py"
159    depfile = "$target_gen_dir/$target_name.d"
160    _rebased_metadata = rebase_path(meta_data, root_build_dir)
161    outputs = [ hap_path ]
162    args = [
163      "--depfile",
164      rebase_path(depfile, root_build_dir),
165      "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)",
166      "--hapsigner",
167      rebase_path(hapsigner, root_build_dir),
168      "--hap-packing-tool",
169      rebase_path(hap_packing_tool, root_build_dir),
170      "--hap-path",
171      rebase_path(hap_path, root_build_dir),
172      "--packaged-resources",
173      rebase_path(packaged_resources, root_build_dir),
174      "--packaged-js-assets",
175      rebase_path(packaged_js_assets, root_build_dir),
176      "--assets=@FileArg($_rebased_metadata:root:assets)",
177      "--app-profile=@FileArg($_rebased_metadata:root:app_profile)",
178      "--build-mode",
179      build_mode,
180    ]
181
182    inputs = [
183      hap_profile,
184      hapsigner,
185      hap_packing_tool,
186      packaged_js_assets,
187      packaged_resources,
188      meta_data,
189    ]
190
191    _private_key_path = default_hap_private_key_path
192    if (defined(private_key_path)) {
193      _private_key_path = private_key_path
194    }
195    _signature_algorithm = default_signature_algorithm
196    if (defined(signature_algorithm)) {
197      _signature_algorithm = signature_algorithm
198    }
199    _key_alias = default_key_alias
200    if (defined(key_alias)) {
201      _key_alias = key_alias
202    }
203    _keystore_path = default_keystore_path
204    if (defined(keystore_path)) {
205      _keystore_path = keystore_path
206    }
207    _keystore_password = default_keystore_password
208    if (defined(keystore_password)) {
209      _keystore_password = keystore_password
210    }
211    _certificate_file = default_hap_certificate_file
212    if (defined(certificate_file)) {
213      _certificate_file = certificate_file
214    }
215
216    inputs += [
217      certificate_profile,
218      _keystore_path,
219      _certificate_file,
220    ]
221    _sign_hap_py_path = "//build/scripts/app_sign.py"
222    if (defined(sign_hap_py_path)) {
223      _sign_hap_py_path = sign_hap_py_path
224    }
225    args += [
226      "--sign_hap_py_path",
227      rebase_path(_sign_hap_py_path),
228    ]
229    if (defined(compatible_version)) {
230      _sign_compatible_version = compatible_version
231      print("INFO: Set para compatible_version for remote sign app, ",
232            target_name,
233            " value is ",
234            _sign_compatible_version)
235      args += [
236        "--sign_compatible_version",
237        _sign_compatible_version,
238      ]
239    } else if (defined(sign_hap_py_path)) {
240      print(
241          "warning: Please set compatible_version for remote sign app!!! target_name: ",
242          target_name)
243    }
244    args += [
245      "--private-key-path",
246      _private_key_path,
247      "--sign-algo",
248      _signature_algorithm,
249      "--certificate-profile",
250      rebase_path(certificate_profile, root_build_dir),
251      "--keyalias",
252      _key_alias,
253      "--keystore-path",
254      rebase_path(_keystore_path, root_build_dir),
255      "--keystorepasswd",
256      _keystore_password,
257      "--certificate-file",
258      rebase_path(_certificate_file, root_build_dir),
259    ]
260
261    if (defined(shared_libraries)) {
262      foreach(lib, shared_libraries) {
263        _module_info = get_label_info(lib, "target_out_dir") + "/" +
264                       get_label_info(lib, "name") + "_module_info.json"
265        _rebased_module_info = rebase_path(_module_info, root_build_dir)
266        args += [ "--dso=@FileArg($_rebased_module_info:source)" ]
267      }
268      if (is_ohos) {
269        args += [
270          "--ohos-app-abi",
271          ohos_app_abi,
272        ]
273      }
274    }
275
276    if (defined(install_module_info)) {
277      metadata = {
278        install_modules = [ install_module_info ]
279      }
280    }
281    if (defined(enable_ark) && enable_ark) {
282      _ark_deps = [
283        "//arkcompiler/ets_frontend/es2panda:es2abc_js_file($host_toolchain)",
284        "//arkcompiler/ets_frontend/es2panda:es2panda_build($host_toolchain)",
285      ]
286      if (defined(deps)) {
287        deps += _ark_deps
288      } else {
289        deps = _ark_deps
290      }
291      _js2abc_js = get_label_info(
292                       "//arkcompiler/ets_frontend/es2panda:es2abc_js_file($host_toolchain)",
293                       "target_out_dir") + "/ts2abc.js"
294      args += [
295        "--nodejs-path",
296        rebase_path(nodejs, root_build_dir),
297        "--js2abc-js",
298        rebase_path(_js2abc_js, root_build_dir),
299        "--enable-ark",
300      ]
301      inputs += [
302        nodejs,
303        _js2abc_js,
304      ]
305    }
306  }
307}
308
309template("compile_js_assets") {
310  forward_variables_from(invoker, [ "testonly" ])
311  assert(defined(invoker.meta_data) && defined(invoker.packaged_js_assets),
312         "meta_data and packaged_js_assets must be for compile_js_assets")
313
314  _packaged_js_assets = invoker.packaged_js_assets
315  action_with_pydeps(target_name) {
316    forward_variables_from(invoker,
317                           [
318                             "deps",
319                             "meta_data",
320                             "hap_profile",
321                             "build_mode",
322                             "js2abc",
323                             "ets2abc",
324                             "main_target_name",
325                           ])
326    script = "//build/scripts/build_js_assets.py"
327    depfile = "$target_gen_dir/$target_name.d"
328    outputs = [ _packaged_js_assets ]
329
330    _rebased_metadata = rebase_path(meta_data, root_build_dir)
331
332    if (!defined(deps)) {
333      deps = []
334    }
335    deps += [
336      "//arkcompiler/ets_frontend/es2panda:build_es2abc_for_hap($host_toolchain)",
337      "//developtools/ace_ets2bundle:ets_loader_ark_hap",
338      "//developtools/ace_js2bundle:ace_loader_ark_hap",
339      "//third_party/weex-loader:weex_loader_ark_hap",
340    ]
341    _ace_loader_home =
342        get_label_info("//developtools/ace_js2bundle:ace_loader_node_modules",
343                       "target_out_dir") + "/ace_loader_ark"
344    _webpack_config_js = "${_ace_loader_home}/webpack.rich.config.js"
345    _ets_loader_home =
346        get_label_info("//developtools/ace_ets2bundle:ets_loader_node_modules",
347                       "target_out_dir") + "/ets_loader_ark"
348    _webpack_config_ets = "${_ets_loader_home}/webpack.config.js"
349    _webpack_js = "${_ace_loader_home}/node_modules/webpack/bin/webpack.js"
350    _manifest_file_path = "${target_gen_dir}/manifest_file"
351
352    inputs = [
353      meta_data,
354      nodejs,
355    ]
356
357    args = [
358      "--js-assets-dir=@FileArg($_rebased_metadata:root:js_assets)",
359      "--ets-assets-dir=@FileArg($_rebased_metadata:root:ets_assets)",
360      "--js-forms-dir=@FileArg($_rebased_metadata:root:js_forms)",
361      "--testrunner-dir=@FileArg($_rebased_metadata:root:testrunner)",
362      "--output",
363      rebase_path(_packaged_js_assets, root_build_dir),
364      "--depfile",
365      rebase_path(depfile, root_build_dir),
366      "--nodejs-path",
367      rebase_path(nodejs, root_build_dir),
368      "--webpack-js",
369      rebase_path(_webpack_js, root_build_dir),
370      "--webpack-config-js",
371      rebase_path(_webpack_config_js, root_build_dir),
372      "--webpack-config-ets",
373      rebase_path(_webpack_config_ets, root_build_dir),
374      "--build-mode",
375      build_mode,
376      "--ace-loader-home",
377      rebase_path(_ace_loader_home, root_build_dir),
378      "--ets-loader-home",
379      rebase_path(_ets_loader_home, root_build_dir),
380      "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)",
381      "--app-profile=@FileArg($_rebased_metadata:root:app_profile)",
382      "--manifest-file-path",
383      rebase_path(_manifest_file_path, root_build_dir),
384    ]
385    if (defined(testonly) && testonly == true) {
386      _js_sources_file = target_gen_dir + "/$main_target_name.sources"
387      args += [
388        "--js-sources-file",
389        rebase_path(_js_sources_file, root_build_dir),
390      ]
391      outputs += [ _js_sources_file ]
392    }
393
394    if (js2abc || ets2abc) {
395      _es2abc_dir = get_label_info(
396              "//arkcompiler/ets_frontend/es2panda:es2panda_build($host_toolchain)",
397              "target_out_dir")
398      if (ets2abc) {
399        args += [ "--ets2abc" ]
400      } else if (js2abc) {
401        args += [ "--js2abc" ]
402      }
403      args += [
404        "--ark-es2abc-dir",
405        rebase_path(_es2abc_dir, root_build_dir),
406      ]
407    }
408
409    if (defined(hap_profile)) {
410      inputs += [ hap_profile ]
411    }
412  }
413}
414
415template("app_sign") {
416  forward_variables_from(invoker, [ "testonly" ])
417  action(target_name) {
418    forward_variables_from(invoker,
419                           [
420                             "deps",
421                             "private_key_path",
422                             "signature_algorithm",
423                             "certificate_profile",
424                             "keystore_password",
425                             "key_alias",
426                             "certificate_file",
427                             "keystore_path",
428                             "unsigned_hap_path_list",
429                             "hap_out_dir",
430                             "hap_name",
431                             "install_module_info",
432                           ])
433    script = "//build/scripts/app_sign.py"
434    _private_key_path = default_hap_private_key_path
435    if (defined(private_key_path)) {
436      _private_key_path = private_key_path
437    }
438    _key_alias = default_key_alias
439    if (defined(key_alias)) {
440      _key_alias = key_alias
441    }
442    _signature_algorithm = default_signature_algorithm
443    if (defined(signature_algorithm)) {
444      _signature_algorithm = signature_algorithm
445    }
446    _keystore_path = default_keystore_path
447    if (defined(keystore_path)) {
448      _keystore_path = keystore_path
449    }
450    _certificate_file = default_hap_certificate_file
451    if (defined(certificate_file)) {
452      _certificate_file = certificate_file
453    }
454    _keystore_password = default_keystore_password
455    if (defined(keystore_password)) {
456      _keystore_password = keystore_password
457    }
458    if (defined(certificate_profile)) {
459      _certificate_profile = certificate_profile
460    }
461
462    inputs = [
463      hapsigner,
464      certificate_profile,
465      _keystore_path,
466      _certificate_file,
467    ]
468
469    outputs = [ "${target_out_dir}/${target_name}.stamp" ]
470
471    args = [
472      "--keyPwd",
473      _private_key_path,
474      "--sign-algo",
475      _signature_algorithm,
476      "--profileFile",
477      rebase_path(_certificate_profile, root_build_dir),
478      "--keyalias",
479      _key_alias,
480      "--keystoreFile",
481      rebase_path(_keystore_path, root_build_dir),
482      "--keystorePwd",
483      _keystore_password,
484      "--certificate-file",
485      rebase_path(_certificate_file, root_build_dir),
486      "--hapsigner",
487      rebase_path(hapsigner, root_build_dir),
488      "--unsigned-hap-path-list",
489      rebase_path(unsigned_hap_path_list, root_build_dir),
490      "--hap-out-dir",
491      rebase_path(hap_out_dir, root_build_dir),
492      "--hap-name",
493      hap_name,
494    ]
495    if (defined(install_module_info)) {
496      metadata = {
497        install_modules = [ install_module_info ]
498      }
499    }
500  }
501}
502
503template("compile_app") {
504  forward_variables_from(invoker, [ "testonly" ])
505  nodejs_version = "v14.21.1"
506  if (host_os == "mac") {
507    _nodejs = "//prebuilts/build-tools/common/nodejs/node-${nodejs_version}-darwin-x64/bin/node"
508  } else {
509    _nodejs = "//prebuilts/build-tools/common/nodejs/node-${nodejs_version}-${host_os}-x64/bin/node"
510  }
511  action(target_name) {
512    forward_variables_from(invoker,
513                           [
514                             "deps",
515                             "cwd",
516                             "build_mode",
517                             "build_profile",
518                             "app_profile",
519                             "hap_profile",
520                             "build_level",
521                             "assemble_type",
522                             "sdk_home",
523                             "unsigned_hap_path_list",
524                             "system_lib_deps",
525                             "hap_out_dir",
526                             "hap_name",
527                             "install_module_info",
528                             "test_hap",
529                             "test_module",
530                             "module_libs_dir",
531                             "sdk_type_name",
532                           ])
533    script = "//build/scripts/compile_app.py"
534    outputs = [ unsigned_hap_path_list ]
535
536    args = [
537      "--nodejs",
538      rebase_path(_nodejs, root_build_dir),
539      "--cwd",
540      rebase_path(cwd, root_build_dir),
541      "--build-profile",
542      rebase_path(build_profile, root_build_dir),
543      "--sdk-home",
544      rebase_path(sdk_home),
545      "--output-file",
546      rebase_path(unsigned_hap_path_list, root_build_dir),
547      "--ohpm-registry",
548      ohpm_registry,
549    ]
550
551    if (defined(build_mode) && build_mode == "debug") {
552      args += [ "--enable-debug" ]
553    }
554
555    if (defined(test_hap) && test_hap) {
556      args += [ "--test-hap" ]
557    }
558
559    if (defined(test_module) && test_module != "") {
560      args += [
561        "--test-module",
562        test_module,
563      ]
564    }
565    if (defined(module_libs_dir) && module_libs_dir != "") {
566      args += [
567        "--module-libs-dir",
568        module_libs_dir,
569      ]
570    }
571    if (defined(build_level) && build_level != "") {
572      args += [
573        "--build-level",
574        build_level,
575      ]
576    }
577    if (defined(assemble_type) && assemble_type != "") {
578      args += [
579        "--assemble-type",
580        assemble_type,
581      ]
582    }
583    if (defined(system_lib_deps)) {
584      args += [ "--system-lib-module-info-list" ]
585      foreach(_lib_deps, system_lib_deps) {
586        _lib_out_name = get_label_info(_lib_deps, "name")
587        _lib_out_dir = get_label_info(_lib_deps, "target_out_dir")
588        args +=
589            [ rebase_path("${_lib_out_dir}/${_lib_out_name}_module_info.json",
590                          root_build_dir) ]
591      }
592
593      if (is_ohos) {
594        args += [
595          "--ohos-app-abi",
596          ohos_app_abi,
597        ]
598      }
599    }
600    if (defined(sdk_type_name) && sdk_type_name != []) {
601      args += [ "--sdk-type-name" ]
602      args += sdk_type_name
603    }
604    if (defined(install_module_info)) {
605      metadata = {
606        install_modules = [ install_module_info ]
607      }
608    }
609  }
610}
611