• 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      "--api-version",
54      api_version,
55    ]
56    outputs = [ generated_profile ]
57  }
58}
59
60template("compile_resources") {
61  forward_variables_from(invoker, [ "testonly" ])
62  assert(defined(invoker.hap_profile),
63         "hap_profile must be defined for compile_resources")
64  assert(
65      defined(invoker.packaged_resources) ||
66          defined(invoker.generated_header_dir),
67      "hap_profile or generated_header_dir must be defined for compile_resources")
68  _generate_resource = defined(invoker.packaged_resources)
69  if (_generate_resource) {
70    _packaged_resources = invoker.packaged_resources
71  }
72  _generate_header = defined(invoker.generated_header_dir)
73  if (_generate_header) {
74    _generated_header_file = invoker.generated_header_dir + "/ResourceTable.h"
75  }
76  action_with_pydeps(target_name) {
77    forward_variables_from(invoker,
78                           [
79                             "meta_data",
80                             "hap_profile",
81                             "deps",
82                           ])
83    script = "//build/scripts/compile_resources.py"
84    depfile = "$target_gen_dir/$target_name.d"
85    if (ohos_indep_compiler_enable) {
86      restool_path = "${prebuilts_sdk_dir}/toolchains/restool"
87    } else {
88      if (defined(deps)) {
89        deps += [
90          "//developtools/global_resource_tool:restool($host_toolchain)",
91          "//developtools/global_resource_tool:restool_id_defined($host_toolchain)",
92        ]
93      } else {
94        deps = [
95          "//developtools/global_resource_tool:restool($host_toolchain)",
96          "//developtools/global_resource_tool:restool_id_defined($host_toolchain)",
97        ]
98      }
99      restool_path =
100          get_label_info(
101              "//developtools/global_resource_tool:restool($host_toolchain)",
102              "root_out_dir") + "/developtools/global_resource_tool/restool"
103    }
104    _rebased_metadata = rebase_path(meta_data, root_build_dir)
105    inputs = [
106      meta_data,
107      restool_path,
108      hap_profile,
109    ]
110    args = [
111      "--resources-dir=@FileArg($_rebased_metadata:root:resources)",
112      "--depfile",
113      rebase_path(depfile, root_build_dir),
114      "--restool-path",
115      rebase_path(restool_path, root_build_dir),
116      "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)",
117      "--app-profile=@FileArg($_rebased_metadata:root:app_profile)",
118    ]
119    outputs = []
120    if (_generate_resource) {
121      outputs += [ _packaged_resources ]
122      args += [
123        "--output-resources-zipfile",
124        rebase_path(_packaged_resources, root_build_dir),
125      ]
126    }
127    if (_generate_header) {
128      outputs += [ _generated_header_file ]
129      args += [
130        "--output-header-file",
131        rebase_path(_generated_header_file, root_build_dir),
132      ]
133    }
134  }
135}
136
137template("package_app") {
138  forward_variables_from(invoker, [ "testonly" ])
139  assert(defined(invoker.hap_profile),
140         "hap_profile must be defined for $target_name")
141  assert(defined(invoker.hap_path), "hap_path must be defined for $target_name")
142  action_with_pydeps(target_name) {
143    forward_variables_from(invoker,
144                           [
145                             "deps",
146                             "external_deps",
147                             "shared_libraries",
148                             "hap_profile",
149                             "hap_path",
150                             "packaged_resources",
151                             "packaged_js_assets",
152                             "meta_data",
153                             "private_key_path",
154                             "signature_algorithm",
155                             "certificate_profile",
156                             "keystore_path",
157                             "keystore_password",
158                             "key_alias",
159                             "certificate_file",
160                             "install_module_info",
161                             "enable_ark",
162                             "build_mode",
163                             "compatible_version",
164                           ])
165    script = "//build/scripts/hapbuilder.py"
166    depfile = "$target_gen_dir/$target_name.d"
167    _rebased_metadata = rebase_path(meta_data, root_build_dir)
168    outputs = [ hap_path ]
169    args = [
170      "--depfile",
171      rebase_path(depfile, root_build_dir),
172      "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)",
173      "--hapsigner",
174      rebase_path(hapsigner, root_build_dir),
175      "--hap-packing-tool",
176      rebase_path(hap_packing_tool, root_build_dir),
177      "--hap-path",
178      rebase_path(hap_path, root_build_dir),
179      "--packaged-resources",
180      rebase_path(packaged_resources, root_build_dir),
181      "--packaged-js-assets",
182      rebase_path(packaged_js_assets, root_build_dir),
183      "--assets=@FileArg($_rebased_metadata:root:assets)",
184      "--app-profile=@FileArg($_rebased_metadata:root:app_profile)",
185      "--build-mode",
186      build_mode,
187    ]
188
189    inputs = [
190      hap_profile,
191      hapsigner,
192      hap_packing_tool,
193      packaged_js_assets,
194      packaged_resources,
195      meta_data,
196    ]
197
198    _private_key_path = default_hap_private_key_path
199    if (defined(private_key_path)) {
200      _private_key_path = private_key_path
201    }
202    _signature_algorithm = default_signature_algorithm
203    if (defined(signature_algorithm)) {
204      _signature_algorithm = signature_algorithm
205    }
206    _key_alias = default_key_alias
207    if (defined(key_alias)) {
208      _key_alias = key_alias
209    }
210    _keystore_path = default_keystore_path
211    if (defined(keystore_path)) {
212      _keystore_path = keystore_path
213    }
214    _keystore_password = default_keystore_password
215    if (defined(keystore_password)) {
216      _keystore_password = keystore_password
217    }
218    _certificate_file = default_hap_certificate_file
219    if (defined(certificate_file)) {
220      _certificate_file = certificate_file
221    }
222
223    inputs += [
224      certificate_profile,
225      _keystore_path,
226      _certificate_file,
227    ]
228    _sign_hap_py_path = "//build/scripts/app_sign.py"
229    if (defined(sign_hap_py_path) && defined(compatible_version)) {
230      _sign_hap_py_path = sign_hap_py_path
231    }
232
233    args += [
234      "--sign_hap_py_path",
235      rebase_path(_sign_hap_py_path),
236    ]
237    if (defined(sign_hap_py_path)) {
238      if (defined(compatible_version)) {
239        _sign_compatible_version = compatible_version
240        args += [
241          "--sign_compatible_version",
242          _sign_compatible_version,
243        ]
244      } else {
245        _target_label = get_label_info(target_name, "label_no_toolchain")
246        print(
247            "warning: Please set compatible_version in ${_target_label} for remote sign")
248      }
249    }
250    args += [
251      "--private-key-path",
252      _private_key_path,
253      "--sign-algo",
254      _signature_algorithm,
255      "--certificate-profile",
256      rebase_path(certificate_profile, root_build_dir),
257      "--keyalias",
258      _key_alias,
259      "--keystore-path",
260      rebase_path(_keystore_path, root_build_dir),
261      "--keystorepasswd",
262      _keystore_password,
263      "--certificate-file",
264      rebase_path(_certificate_file, root_build_dir),
265    ]
266
267    if (defined(shared_libraries)) {
268      foreach(lib, shared_libraries) {
269        _module_info = get_label_info(lib, "target_out_dir") + "/" +
270                       get_label_info(lib, "name") + "_module_info.json"
271        _rebased_module_info = rebase_path(_module_info, root_build_dir)
272        args += [ "--dso=@FileArg($_rebased_module_info:source)" ]
273      }
274      if (is_ohos) {
275        args += [
276          "--ohos-app-abi",
277          ohos_app_abi,
278        ]
279      }
280    }
281
282    if (defined(external_deps)) {
283      foreach(lib, external_deps) {
284        _module_info = get_label_info(lib, "target_out_dir") + "/" +
285                       get_label_info(lib, "name") + "_module_info.json"
286        _rebased_module_info = rebase_path(_module_info, root_build_dir)
287        args += [ "--dso=@FileArg($_rebased_module_info:source)" ]
288      }
289      if (is_ohos) {
290        args += [
291          "--ohos-app-abi",
292          ohos_app_abi,
293        ]
294      }
295    }
296
297    if (defined(install_module_info)) {
298      metadata = {
299        install_modules = [ install_module_info ]
300      }
301    }
302    if (defined(enable_ark) && enable_ark) {
303      if (ohos_indep_compiler_enable) {
304        _js2abc_js =
305            "${prebuilts_sdk_dir}/ets/build-tools/ets-loader/bin/ark/ts2abc.js"
306      } else {
307        _ark_deps = [
308          "//arkcompiler/ets_frontend/es2panda:es2abc_js_file($host_toolchain)",
309        ]
310        external_deps = [ "ets_frontend:es2panda($host_toolchain)" ]
311        if (defined(deps)) {
312          deps += _ark_deps
313        } else {
314          deps = _ark_deps
315        }
316        _js2abc_js = get_label_info(
317                         "//arkcompiler/ets_frontend/es2panda:es2abc_js_file($host_toolchain)",
318                         "target_out_dir") + "/ts2abc.js"
319      }
320      args += [
321        "--nodejs-path",
322        rebase_path(nodejs, root_build_dir),
323        "--js2abc-js",
324        rebase_path(_js2abc_js, root_build_dir),
325        "--enable-ark",
326      ]
327      inputs += [
328        nodejs,
329        _js2abc_js,
330      ]
331    }
332  }
333}
334
335template("compile_js_assets") {
336  forward_variables_from(invoker, [ "testonly" ])
337  assert(defined(invoker.meta_data) && defined(invoker.packaged_js_assets),
338         "meta_data and packaged_js_assets must be for compile_js_assets")
339
340  _packaged_js_assets = invoker.packaged_js_assets
341  action_with_pydeps(target_name) {
342    forward_variables_from(invoker,
343                           [
344                             "deps",
345                             "meta_data",
346                             "hap_profile",
347                             "build_mode",
348                             "js2abc",
349                             "ets2abc",
350                             "main_target_name",
351                           ])
352    script = "//build/scripts/build_js_assets.py"
353    depfile = "$target_gen_dir/$target_name.d"
354    outputs = [ _packaged_js_assets ]
355
356    _rebased_metadata = rebase_path(meta_data, root_build_dir)
357
358    if (!defined(deps)) {
359      deps = []
360    }
361    if (ohos_indep_compiler_enable) {
362      _ace_loader_home = "${prebuilts_sdk_dir}/js/build-tools/ace-loader"
363      _ets_loader_home = "${prebuilts_sdk_dir}/ets/build-tools/ets-loader/"
364    } else {
365      deps += [
366        "//arkcompiler/ets_frontend/es2panda:build_es2abc_for_hap($host_toolchain)",
367        "//developtools/ace_js2bundle:ace_loader_ark_hap",
368        "//third_party/parse5:parse5_ark_hap",
369        "//third_party/weex-loader:weex_loader_ark_hap",
370      ]
371      external_deps = [ "ace_ets2bundle:ets_loader_ark_hap" ]
372      _ace_loader_home =
373          get_label_info("//developtools/ace_js2bundle:ace_loader_node_modules",
374                         "target_out_dir") + "/ace_loader_ark"
375      _ets_loader_home =
376          get_label_info(
377              "//developtools/ace_ets2bundle:ets_loader_node_modules",
378              "target_out_dir") + "/ets_loader_ark"
379    }
380
381    _webpack_config_js = "${_ace_loader_home}/webpack.rich.config.js"
382    _webpack_config_ets = "${_ets_loader_home}/webpack.config.js"
383    _webpack_js = "${_ace_loader_home}/node_modules/webpack/bin/webpack.js"
384    _webpack_ets = "${_ets_loader_home}/node_modules/webpack/bin/webpack.js"
385    _manifest_file_path = "${target_gen_dir}/manifest_file"
386
387    inputs = [
388      meta_data,
389      nodejs,
390    ]
391
392    args = [
393      "--js-assets-dir=@FileArg($_rebased_metadata:root:js_assets)",
394      "--ets-assets-dir=@FileArg($_rebased_metadata:root:ets_assets)",
395      "--js-forms-dir=@FileArg($_rebased_metadata:root:js_forms)",
396      "--testrunner-dir=@FileArg($_rebased_metadata:root:testrunner)",
397      "--output",
398      rebase_path(_packaged_js_assets, root_build_dir),
399      "--depfile",
400      rebase_path(depfile, root_build_dir),
401      "--nodejs-path",
402      rebase_path(nodejs, root_build_dir),
403      "--webpack-js",
404      rebase_path(_webpack_js, root_build_dir),
405      "--webpack-ets",
406      rebase_path(_webpack_ets, root_build_dir),
407      "--webpack-config-js",
408      rebase_path(_webpack_config_js, root_build_dir),
409      "--webpack-config-ets",
410      rebase_path(_webpack_config_ets, root_build_dir),
411      "--build-mode",
412      build_mode,
413      "--ace-loader-home",
414      rebase_path(_ace_loader_home, root_build_dir),
415      "--ets-loader-home",
416      rebase_path(_ets_loader_home, root_build_dir),
417      "--hap-profile=@FileArg($_rebased_metadata:root:hap_profile)",
418      "--app-profile=@FileArg($_rebased_metadata:root:app_profile)",
419      "--manifest-file-path",
420      rebase_path(_manifest_file_path, root_build_dir),
421    ]
422    if (defined(testonly) && testonly == true) {
423      _js_sources_file = target_gen_dir + "/$main_target_name.sources"
424      args += [
425        "--js-sources-file",
426        rebase_path(_js_sources_file, root_build_dir),
427      ]
428      outputs += [ _js_sources_file ]
429    }
430
431    if (js2abc || ets2abc) {
432      if (ohos_indep_compiler_enable) {
433        _es2abc_dir = "${prebuilts_sdk_dir}/js/build-tools/ace-loader/bin/ark"
434      } else {
435        _es2abc_dir = get_label_info("ets_frontend:es2panda($host_toolchain)",
436                                     "target_out_dir")
437      }
438      if (ets2abc) {
439        args += [ "--ets2abc" ]
440      } else if (js2abc) {
441        args += [ "--js2abc" ]
442      }
443      args += [
444        "--ark-es2abc-dir",
445        rebase_path(_es2abc_dir, root_build_dir),
446      ]
447    }
448
449    if (defined(hap_profile)) {
450      inputs += [ hap_profile ]
451    }
452  }
453}
454
455template("app_sign") {
456  forward_variables_from(invoker, [ "testonly" ])
457  sign_variables = [
458    "deps",
459    "private_key_path",
460    "signature_algorithm",
461    "certificate_profile",
462    "keystore_password",
463    "key_alias",
464    "certificate_file",
465    "keystore_path",
466    "unsigned_hap_path_list",
467    "hap_out_dir",
468    "hap_name",
469    "install_module_info",
470    "compatible_version",
471  ]
472  if (defined(invoker.hap_list)) {
473    sign_variables += [ "hap_list" ]
474  }
475  action(target_name) {
476    forward_variables_from(invoker, sign_variables)
477    _sign_hap_py_path = "//build/scripts/app_sign.py"
478    if (defined(sign_hap_py_path) && defined(compatible_version)) {
479      _sign_hap_py_path = sign_hap_py_path
480    }
481    script = _sign_hap_py_path
482    _private_key_path = default_hap_private_key_path
483    if (defined(private_key_path)) {
484      _private_key_path = private_key_path
485    }
486    _key_alias = default_key_alias
487    if (defined(key_alias)) {
488      _key_alias = key_alias
489    }
490    _signature_algorithm = default_signature_algorithm
491    if (defined(signature_algorithm)) {
492      _signature_algorithm = signature_algorithm
493    }
494    _keystore_path = default_keystore_path
495    if (defined(keystore_path)) {
496      _keystore_path = keystore_path
497    }
498    _certificate_file = default_hap_certificate_file
499    if (defined(certificate_file)) {
500      _certificate_file = certificate_file
501    }
502    _keystore_password = default_keystore_password
503    if (defined(keystore_password)) {
504      _keystore_password = keystore_password
505    }
506    if (defined(certificate_profile)) {
507      _certificate_profile = certificate_profile
508    }
509
510    inputs = [
511      hapsigner,
512      certificate_profile,
513      _keystore_path,
514      _certificate_file,
515    ]
516
517    outputs = [ "${target_out_dir}/${target_name}.stamp" ]
518
519    args = [
520      "--keyPwd",
521      _private_key_path,
522      "--sign-algo",
523      _signature_algorithm,
524      "--profileFile",
525      rebase_path(_certificate_profile, root_build_dir),
526      "--keyalias",
527      _key_alias,
528      "--keystoreFile",
529      rebase_path(_keystore_path, root_build_dir),
530      "--keystorePwd",
531      _keystore_password,
532      "--certificate-file",
533      rebase_path(_certificate_file, root_build_dir),
534      "--hapsigner",
535      rebase_path(hapsigner, root_build_dir),
536      "--unsigned-hap-path-list",
537      rebase_path(unsigned_hap_path_list, root_build_dir),
538      "--hap-out-dir",
539      rebase_path(hap_out_dir, root_build_dir),
540      "--hap-name",
541      hap_name,
542    ]
543    if (defined(invoker.hap_list)) {
544      args += [
545        "--hap-list",
546        rebase_path(hap_list, root_build_dir),
547      ]
548    }
549
550    if (defined(sign_hap_py_path)) {
551      if (defined(compatible_version)) {
552        _sign_compatible_version = compatible_version
553        args += [
554          "--compatible_version",
555          _sign_compatible_version,
556        ]
557      } else {
558        _target_label = get_label_info(target_name, "label_no_toolchain")
559        print(
560            "warning: Please set compatible_version in ${_target_label} for remote sign")
561      }
562    }
563
564    if (defined(install_module_info)) {
565      metadata = {
566        install_modules = [ install_module_info ]
567      }
568    }
569  }
570}
571
572template("compile_app") {
573  forward_variables_from(invoker,
574                         [
575                           "testonly",
576                           "nodejs_path",
577                         ])
578  if (defined(nodejs_path) && nodejs_path != "") {
579    _nodejs = nodejs_path
580  } else {
581    if (host_os == "mac") {
582      _nodejs = "//prebuilts/build-tools/common/nodejs/node-${default_hvigor_nodejs_version}-darwin-x64/bin/node"
583    } else if (host_os == "linux" && host_os == "arm64") {
584      _nodejs = "//prebuilts/build-tools/common/nodejs/node-${default_hvigor_nodejs_version}-linux-aarch64/bin/node"
585    } else {
586      _nodejs = "//prebuilts/build-tools/common/nodejs/node-${default_hvigor_nodejs_version}-${host_os}-x64/bin/node"
587    }
588  }
589
590  action(target_name) {
591    forward_variables_from(invoker,
592                           [
593                             "deps",
594                             "cwd",
595                             "build_mode",
596                             "build_profile",
597                             "app_profile",
598                             "hap_profile",
599                             "build_level",
600                             "assemble_type",
601                             "sdk_home",
602                             "unsigned_hap_path_list",
603                             "system_lib_deps",
604                             "hap_out_dir",
605                             "hap_name",
606                             "install_module_info",
607                             "test_hap",
608                             "test_module",
609                             "module_libs_dir",
610                             "sdk_type_name",
611                             "build_modules",
612                             "hvigor_home",
613                             "product",
614                             "module_target",
615                             "modules_filter",
616                             "ohos_test_coverage",
617                           ])
618    script = "//build/scripts/compile_app.py"
619    outputs = [ unsigned_hap_path_list ]
620
621    args = [
622      "--nodejs",
623      rebase_path(_nodejs, root_build_dir),
624      "--cwd",
625      rebase_path(cwd, root_build_dir),
626      "--build-profile",
627      rebase_path(build_profile, root_build_dir),
628      "--sdk-home",
629      rebase_path(sdk_home),
630      "--output-file",
631      rebase_path(unsigned_hap_path_list, root_build_dir),
632      "--ohpm-registry",
633      ohpm_registry,
634      "--product",
635      product,
636      "--module-target",
637      module_target,
638    ]
639
640    if (defined(modules_filter) && modules_filter) {
641      args += [ "--modules-filter" ]
642    }
643
644    if (defined(ohos_test_coverage) && ohos_test_coverage) {
645      args += [ "--ohos-test-coverage" ]
646    }
647
648    if (defined(hvigor_home) && hvigor_home != "") {
649      args += [
650        "--hvigor-home",
651        rebase_path(hvigor_home, root_build_dir),
652      ]
653    }
654
655    if (defined(build_mode) && build_mode == "debug") {
656      args += [ "--enable-debug" ]
657    }
658
659    if (defined(test_hap) && test_hap) {
660      args += [ "--test-hap" ]
661    }
662
663    if (defined(test_module) && test_module != "") {
664      args += [
665        "--test-module",
666        test_module,
667      ]
668    }
669    if (defined(module_libs_dir) && module_libs_dir != "") {
670      args += [
671        "--module-libs-dir",
672        module_libs_dir,
673      ]
674    }
675    if (defined(build_level) && build_level != "") {
676      args += [
677        "--build-level",
678        build_level,
679      ]
680    }
681    if (defined(assemble_type) && assemble_type != "") {
682      args += [
683        "--assemble-type",
684        assemble_type,
685      ]
686    }
687    if (defined(system_lib_deps)) {
688      args += [ "--system-lib-module-info-list" ]
689      foreach(_lib_deps, system_lib_deps) {
690        _lib_out_name = get_label_info(_lib_deps, "name")
691        _lib_out_dir = get_label_info(_lib_deps, "target_out_dir")
692        args +=
693            [ rebase_path("${_lib_out_dir}/${_lib_out_name}_module_info.json",
694                          root_build_dir) ]
695      }
696
697      if (is_ohos) {
698        args += [
699          "--ohos-app-abi",
700          ohos_app_abi,
701        ]
702      }
703    }
704    if (defined(sdk_type_name) && sdk_type_name != []) {
705      args += [ "--sdk-type-name" ]
706      args += sdk_type_name
707    }
708    if (defined(build_modules) && build_modules != []) {
709      args += [ "--build-modules" ]
710      args += build_modules
711    }
712    if (use_hvigor_cache) {
713      args += [ "--use-hvigor-cache" ]
714    }
715    if (hvigor_obfuscation) {
716      args += [ "--hvigor-obfuscation" ]
717    }
718    if (defined(install_module_info)) {
719      metadata = {
720        install_modules = [ install_module_info ]
721      }
722    }
723    if (defined(target_app_dir) && target_app_dir != "") {
724      args += [
725        "--target-out-dir",
726        rebase_path(root_out_dir),
727        "--target-app-dir",
728        target_app_dir,
729      ]
730    }
731    if (ohos_app_enable_asan) {
732      args += [ "--ohos-app-enable-asan" ]
733    } else if (ohos_app_enable_tsan) {
734      args += [ "--ohos-app-enable-tsan" ]
735    } else if (ohos_app_enable_ubsan) {
736      args += [ "--ohos-app-enable-ubsan" ]
737    }
738  }
739}
740