• 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          "//arkcompiler/ets_frontend/es2panda:es2panda_build($host_toolchain)",
310        ]
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_ets2bundle:ets_loader_ark_hap",
368        "//developtools/ace_js2bundle:ace_loader_ark_hap",
369        "//third_party/parse5:parse5_ark_hap",
370        "//third_party/weex-loader:weex_loader_ark_hap",
371      ]
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(
436                "//arkcompiler/ets_frontend/es2panda:es2panda_build($host_toolchain)",
437                "target_out_dir")
438      }
439      if (ets2abc) {
440        args += [ "--ets2abc" ]
441      } else if (js2abc) {
442        args += [ "--js2abc" ]
443      }
444      args += [
445        "--ark-es2abc-dir",
446        rebase_path(_es2abc_dir, root_build_dir),
447      ]
448    }
449
450    if (defined(hap_profile)) {
451      inputs += [ hap_profile ]
452    }
453  }
454}
455
456template("app_sign") {
457  forward_variables_from(invoker, [ "testonly" ])
458  sign_variables = [
459    "deps",
460    "private_key_path",
461    "signature_algorithm",
462    "certificate_profile",
463    "keystore_password",
464    "key_alias",
465    "certificate_file",
466    "keystore_path",
467    "unsigned_hap_path_list",
468    "hap_out_dir",
469    "hap_name",
470    "install_module_info",
471    "compatible_version",
472  ]
473  if (defined(invoker.hap_list)) {
474    sign_variables += [ "hap_list" ]
475  }
476  action(target_name) {
477    forward_variables_from(invoker, sign_variables)
478    _sign_hap_py_path = "//build/scripts/app_sign.py"
479    if (defined(sign_hap_py_path) && defined(compatible_version)) {
480      _sign_hap_py_path = sign_hap_py_path
481    }
482    script = _sign_hap_py_path
483    _private_key_path = default_hap_private_key_path
484    if (defined(private_key_path)) {
485      _private_key_path = private_key_path
486    }
487    _key_alias = default_key_alias
488    if (defined(key_alias)) {
489      _key_alias = key_alias
490    }
491    _signature_algorithm = default_signature_algorithm
492    if (defined(signature_algorithm)) {
493      _signature_algorithm = signature_algorithm
494    }
495    _keystore_path = default_keystore_path
496    if (defined(keystore_path)) {
497      _keystore_path = keystore_path
498    }
499    _certificate_file = default_hap_certificate_file
500    if (defined(certificate_file)) {
501      _certificate_file = certificate_file
502    }
503    _keystore_password = default_keystore_password
504    if (defined(keystore_password)) {
505      _keystore_password = keystore_password
506    }
507    if (defined(certificate_profile)) {
508      _certificate_profile = certificate_profile
509    }
510
511    inputs = [
512      hapsigner,
513      certificate_profile,
514      _keystore_path,
515      _certificate_file,
516    ]
517
518    outputs = [ "${target_out_dir}/${target_name}.stamp" ]
519
520    args = [
521      "--keyPwd",
522      _private_key_path,
523      "--sign-algo",
524      _signature_algorithm,
525      "--profileFile",
526      rebase_path(_certificate_profile, root_build_dir),
527      "--keyalias",
528      _key_alias,
529      "--keystoreFile",
530      rebase_path(_keystore_path, root_build_dir),
531      "--keystorePwd",
532      _keystore_password,
533      "--certificate-file",
534      rebase_path(_certificate_file, root_build_dir),
535      "--hapsigner",
536      rebase_path(hapsigner, root_build_dir),
537      "--unsigned-hap-path-list",
538      rebase_path(unsigned_hap_path_list, root_build_dir),
539      "--hap-out-dir",
540      rebase_path(hap_out_dir, root_build_dir),
541      "--hap-name",
542      hap_name,
543    ]
544    if (defined(invoker.hap_list)) {
545      args += [
546        "--hap-list",
547        rebase_path(hap_list, root_build_dir),
548      ]
549    }
550
551    if (defined(sign_hap_py_path)) {
552      if (defined(compatible_version)) {
553        _sign_compatible_version = compatible_version
554        args += [
555          "--compatible_version",
556          _sign_compatible_version,
557        ]
558      } else {
559        _target_label = get_label_info(target_name, "label_no_toolchain")
560        print(
561            "warning: Please set compatible_version in ${_target_label} for remote sign")
562      }
563    }
564
565    if (defined(install_module_info)) {
566      metadata = {
567        install_modules = [ install_module_info ]
568      }
569    }
570  }
571}
572
573template("compile_app") {
574  forward_variables_from(invoker, [ "testonly" ])
575  nodejs_version = "v16.20.2"
576  if (host_os == "mac") {
577    _nodejs = "//prebuilts/build-tools/common/nodejs/node-${nodejs_version}-darwin-x64/bin/node"
578  } else if (host_os == "linux" && host_os == "arm64") {
579    _nodejs = "//prebuilts/build-tools/common/nodejs/node-${nodejs_version}-linux-aarch64/bin/node"
580  } else {
581    _nodejs = "//prebuilts/build-tools/common/nodejs/node-${nodejs_version}-${host_os}-x64/bin/node"
582  }
583  action(target_name) {
584    forward_variables_from(invoker,
585                           [
586                             "deps",
587                             "cwd",
588                             "build_mode",
589                             "build_profile",
590                             "app_profile",
591                             "hap_profile",
592                             "build_level",
593                             "assemble_type",
594                             "sdk_home",
595                             "unsigned_hap_path_list",
596                             "system_lib_deps",
597                             "hap_out_dir",
598                             "hap_name",
599                             "install_module_info",
600                             "test_hap",
601                             "test_module",
602                             "module_libs_dir",
603                             "sdk_type_name",
604                             "build_modules",
605                             "hvigor_home",
606                           ])
607    script = "//build/scripts/compile_app.py"
608    outputs = [ unsigned_hap_path_list ]
609
610    args = [
611      "--nodejs",
612      rebase_path(_nodejs, root_build_dir),
613      "--cwd",
614      rebase_path(cwd, root_build_dir),
615      "--build-profile",
616      rebase_path(build_profile, root_build_dir),
617      "--sdk-home",
618      rebase_path(sdk_home),
619      "--output-file",
620      rebase_path(unsigned_hap_path_list, root_build_dir),
621      "--ohpm-registry",
622      ohpm_registry,
623    ]
624
625    if (defined(hvigor_home) && hvigor_home != "") {
626      args += [
627        "--hvigor-home",
628        rebase_path(hvigor_home, root_build_dir),
629      ]
630    }
631
632    if (defined(build_mode) && build_mode == "debug") {
633      args += [ "--enable-debug" ]
634    }
635
636    if (defined(test_hap) && test_hap) {
637      args += [ "--test-hap" ]
638    }
639
640    if (defined(test_module) && test_module != "") {
641      args += [
642        "--test-module",
643        test_module,
644      ]
645    }
646    if (defined(module_libs_dir) && module_libs_dir != "") {
647      args += [
648        "--module-libs-dir",
649        module_libs_dir,
650      ]
651    }
652    if (defined(build_level) && build_level != "") {
653      args += [
654        "--build-level",
655        build_level,
656      ]
657    }
658    if (defined(assemble_type) && assemble_type != "") {
659      args += [
660        "--assemble-type",
661        assemble_type,
662      ]
663    }
664    if (defined(system_lib_deps)) {
665      args += [ "--system-lib-module-info-list" ]
666      foreach(_lib_deps, system_lib_deps) {
667        _lib_out_name = get_label_info(_lib_deps, "name")
668        _lib_out_dir = get_label_info(_lib_deps, "target_out_dir")
669        args +=
670            [ rebase_path("${_lib_out_dir}/${_lib_out_name}_module_info.json",
671                          root_build_dir) ]
672      }
673
674      if (is_ohos) {
675        args += [
676          "--ohos-app-abi",
677          ohos_app_abi,
678        ]
679      }
680    }
681    if (defined(sdk_type_name) && sdk_type_name != []) {
682      args += [ "--sdk-type-name" ]
683      args += sdk_type_name
684    }
685    if (defined(build_modules) && build_modules != []) {
686      args += [ "--build-modules" ]
687      args += build_modules
688    }
689    if (use_hvigor_cache) {
690      args += [ "--use-hvigor-cache" ]
691    }
692    if (hvigor_obfuscation) {
693      args += [ "--hvigor-obfuscation" ]
694    }
695    if (defined(install_module_info)) {
696      metadata = {
697        install_modules = [ install_module_info ]
698      }
699    }
700    if (defined(target_app_dir) && target_app_dir != "") {
701      args += [
702        "--target-out-dir",
703        rebase_path(root_out_dir),
704        "--target-app-dir",
705        target_app_dir,
706      ]
707    }
708    if (ohos_app_enable_asan) {
709      args += [ "--ohos-app-enable-asan" ]
710    } else if (ohos_app_enable_tsan) {
711      args += [ "--ohos-app-enable-tsan" ]
712    } else if (ohos_app_enable_ubsan) {
713      args += [ "--ohos-app-enable-ubsan" ]
714    }
715  }
716}
717