• 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/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
200template("ohos_app") {
201  forward_variables_from(invoker, [ "testonly" ])
202
203  _unsigned_hap_path_list =
204      "${target_out_dir}/${target_name}/unsigned_hap_path_list.json"
205
206  _abs_path = get_path_info("./", "abspath")
207  _hap_out_dir = "${target_out_dir}/${target_name}"
208  if (defined(invoker.hap_out_dir)) {
209    _hap_out_dir = invoker.hap_out_dir
210  }
211
212  _hap_name = target_name
213  if (defined(invoker.hap_name)) {
214    _hap_name = invoker.hap_name
215  }
216
217  if (defined(invoker.build_profile)) {
218    build_profile = invoker.build_profile
219  } else {
220    build_profile = "./build-profile.json5"
221  }
222
223  _js_build_mode = "release"
224  if (defined(invoker.js_build_mode)) {
225    _js_build_mode = invoker.js_build_mode
226  }
227
228  if (defined(invoker.system_lib_deps)) {
229    _system_lib_deps = invoker.system_lib_deps
230  }
231
232  _main_target_name = target_name
233
234  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
235    _subsystem_name = invoker.subsystem_name
236    _part_name = invoker.part_name
237  } else if (defined(invoker.part_name)) {
238    _part_name = invoker.part_name
239    _part_subsystem_info_file =
240        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
241    _arguments = [
242      "--part-name",
243      _part_name,
244      "--part-subsystem-info-file",
245      rebase_path(_part_subsystem_info_file, root_build_dir),
246    ]
247    _get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
248    _subsystem_name =
249        exec_script(_get_subsystem_script, _arguments, "trim string")
250  } else if (defined(invoker.subsystem_name)) {
251    _subsystem_name = invoker.subsystem_name
252    _part_name = _subsystem_name
253  } else {
254    _subsystem_name = "build"
255    _part_name = "build_framework"
256  }
257
258  assert(_subsystem_name != "")  # Mark as used
259  assert(_part_name != "")  # Mark as used
260
261  _module_info_target = "${_main_target_name}_info"
262  generate_module_info(_module_info_target) {
263    module_name = _main_target_name
264    module_type = "app"
265    module_source_dir = get_path_info(_hap_out_dir, "dir")
266
267    if (defined(invoker.install_images)) {
268      module_install_images = []
269      module_install_images += invoker.install_images
270    } else {
271      module_install_images = [ "system" ]
272    }
273    install_enable = true
274    if (defined(invoker.install_enable)) {
275      install_enable = invoker.install_enable
276    }
277
278    if (defined(invoker.module_install_dir)) {
279      module_install_dir = invoker.module_install_dir
280    } else {
281      module_install_dir = "${module_type}"
282    }
283
284    if (defined(invoker.symlink_target_name)) {
285      symlink_target_name = invoker.symlink_target_name
286    }
287
288    if (defined(invoker.relative_install_dir)) {
289      relative_install_dir = invoker.relative_install_dir
290    }
291
292    notice = "$target_out_dir/$_main_target_name.notice.txt"
293  }
294
295  _notice_target = "${target_name}_notice"
296  collect_notice(_notice_target) {
297    forward_variables_from(invoker,
298                           [
299                             "license_as_sources",
300                             "license_file",
301                           ])
302    module_name = _main_target_name
303    module_type = "app"
304    module_source_dir = get_label_info(":${_main_target_name}", "dir")
305  }
306
307  _compile_app_target = "${target_name}_compile_app"
308  compile_app(_compile_app_target) {
309    build_mode = _js_build_mode
310    cwd = _abs_path
311    unsigned_hap_path_list = _unsigned_hap_path_list
312    deps = [ ":$_notice_target" ]
313    if (defined(invoker.deps)) {
314      deps += invoker.deps
315    }
316    if (defined(invoker.system_lib_deps)) {
317      system_lib_deps = _system_lib_deps
318      deps += _system_lib_deps
319    }
320    if (defined(invoker.test_hap)) {
321      test_hap = invoker.test_hap
322    }
323    if (defined(invoker.test_module)) {
324      test_module = invoker.test_module
325    }
326    if (defined(invoker.module_libs_dir)) {
327      module_libs_dir = invoker.module_libs_dir
328    }
329    if (defined(invoker.sdk_home)) {
330      sdk_home = invoker.sdk_home
331    } else {
332      sdk_home = "//prebuilts/ohos-sdk/linux"
333    }
334    if (defined(invoker.sdk_type_name)) {
335      sdk_type_name = invoker.sdk_type_name
336    }
337    if (defined(invoker.build_modules)) {
338      build_modules = invoker.build_modules
339    }
340    if (defined(invoker.assemble_type)) {
341      assemble_type = invoker.assemble_type
342    }
343    if (defined(invoker.build_level)) {
344      build_level = invoker.build_level
345    }
346  }
347  app_sign(target_name) {
348    forward_variables_from(invoker,
349                           [
350                             "private_key_path",
351                             "signature_algorithm",
352                             "certificate_profile",
353                             "keystore_path",
354                             "keystore_password",
355                             "key_alias",
356                             "certificate_file",
357                             "compatible_version",
358                           ])
359    unsigned_hap_path_list = _unsigned_hap_path_list
360    deps = [
361      ":$_compile_app_target",
362      ":$_module_info_target",
363    ]
364    hap_out_dir = _hap_out_dir
365    hap_name = _hap_name
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      toolchain = current_toolchain
372      toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
373      part_name = _part_name
374      subsystem_name = _subsystem_name
375    }
376  }
377}
378
379# Declare an OHOS hap target
380#
381# Variables:
382#   deps: dependencies of this target.
383#   hap_name: name of output hap file.
384#   final_hap_path: full path of output hap file, final_hap_path overwrites hap_name.
385#   js2abc:   whether to transform js bundle to ark bytecode, default value
386#             follows build_ark.
387#   ets2abc:   whether to transform js bundle to ark bytecode, default value false
388#
389#
390template("ohos_hap") {
391  forward_variables_from(invoker, [ "testonly" ])
392  assert(defined(invoker.hap_profile),
393         "hap_profile must be defined for ohos_hap")
394
395  _deps = []
396  if (defined(invoker.deps)) {
397    _deps = invoker.deps
398  }
399
400  _hap_profile = invoker.hap_profile
401  _hap_name = target_name
402  if (defined(invoker.hap_name)) {
403    _hap_name = invoker.hap_name
404  }
405
406  _hap_path = "$target_out_dir/$_hap_name.hap"
407  if (defined(invoker.final_hap_path)) {
408    _hap_path = invoker.final_hap_path
409  }
410
411  _js2abc = build_ark
412  if (defined(invoker.js2abc)) {
413    _js2abc = invoker.js2abc
414  }
415
416  _ets2abc = false
417  if (defined(invoker.ets2abc)) {
418    _ets2abc = invoker.ets2abc
419  }
420
421  if (_ets2abc) {
422    _js2abc = false
423  }
424
425  _js_build_mode = "release"
426  if (defined(invoker.js_build_mode)) {
427    _js_build_mode = invoker.js_build_mode
428  }
429
430  _main_target_name = target_name
431
432  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
433    _subsystem_name = invoker.subsystem_name
434    _part_name = invoker.part_name
435  } else if (defined(invoker.part_name)) {
436    _part_name = invoker.part_name
437    _part_subsystem_info_file =
438        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
439    _arguments = [
440      "--part-name",
441      _part_name,
442      "--part-subsystem-info-file",
443      rebase_path(_part_subsystem_info_file, root_build_dir),
444    ]
445    _get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
446    _subsystem_name =
447        exec_script(_get_subsystem_script, _arguments, "trim string")
448  } else if (defined(invoker.subsystem_name)) {
449    _subsystem_name = invoker.subsystem_name
450    _part_name = _subsystem_name
451  } else {
452    _subsystem_name = "build"
453    _part_name = "build_framework"
454  }
455
456  assert(_subsystem_name != "")  # Mark as used
457  assert(_part_name != "")  # Mark as used
458
459  # metadata is used to record all necessary data for hap.
460  _metadata_target = "${target_name}__metadata"
461  _meta_data = "$target_gen_dir/$target_name.metadata"
462  write_meta_data(_metadata_target) {
463    forward_variables_from(invoker,
464                           [
465                             "raw_assets",
466                             "resources",
467                             "js_assets",
468                             "ets_assets",
469                           ])
470    hap_profile = invoker.hap_profile
471    meta_data = _meta_data
472    possible_deps = _deps
473    type = "hap"
474    js2abc = _js2abc
475    hap_path = _hap_path
476  }
477
478  _js_assets_target = "${target_name}__js_assets"
479  _packaged_js_assets = "$target_out_dir/$target_name/js_assets.zip"
480  compile_js_assets(_js_assets_target) {
481    hap_profile = _hap_profile
482    packaged_js_assets = _packaged_js_assets
483    meta_data = _meta_data
484    deps = [ ":$_metadata_target" ] + _deps
485    build_mode = _js_build_mode
486    js2abc = _js2abc
487    ets2abc = _ets2abc
488    if (defined(testonly) && testonly == true) {
489      main_target_name = _main_target_name
490    }
491  }
492
493  _resources_target = "${target_name}__compile_resources"
494  _packaged_resources = "$target_out_dir/$target_name/resources.zip"
495  _generated_header_dir = "$target_out_dir/$target_name"
496  compile_resources(_resources_target) {
497    hap_profile = _hap_profile
498    packaged_resources = _packaged_resources
499    generated_header_dir = _generated_header_dir
500    meta_data = _meta_data
501    deps = [ ":$_metadata_target" ] + _deps
502  }
503
504  _notice_target = "${target_name}__notice"
505  collect_notice(_notice_target) {
506    forward_variables_from(invoker,
507                           [
508                             "license_as_sources",
509                             "license_file",
510                           ])
511    module_type = "app"
512    module_name = _main_target_name
513    module_source_dir = get_label_info(":${_main_target_name}", "dir")
514  }
515
516  _module_info_target = "${_main_target_name}_info"
517  generate_module_info(_module_info_target) {
518    module_name = _main_target_name
519    module_type = "app"
520
521    module_source_dir = get_path_info(_hap_path, "dir")
522    module_install_name = get_path_info(_hap_path, "name")
523    if (defined(invoker.module_install_name)) {
524      module_install_name = invoker.module_install_name
525    }
526
527    module_install_images = [ "system" ]
528    if (defined(invoker.install_images)) {
529      module_install_images = []
530      module_install_images += invoker.install_images
531    }
532    install_enable = true
533    if (defined(invoker.install_enable)) {
534      install_enable = invoker.install_enable
535    }
536
537    module_output_extension = ".hap"
538
539    module_install_dir = "${module_type}"
540    if (defined(invoker.module_install_dir)) {
541      module_install_dir = invoker.module_install_dir
542    }
543
544    if (defined(invoker.relative_install_dir)) {
545      relative_install_dir = invoker.relative_install_dir
546    }
547
548    if (defined(invoker.symlink_target_name)) {
549      symlink_target_name = invoker.symlink_target_name
550    }
551    notice = "$target_out_dir/$_main_target_name.notice.txt"
552  }
553
554  package_app(target_name) {
555    forward_variables_from(invoker,
556                           [
557                             "shared_libraries",
558                             "private_key_path",
559                             "signature_algorithm",
560                             "certificate_profile",
561                             "keystore_path",
562                             "keystore_password",
563                             "key_alias",
564                             "certificate_file",
565                             "compatible_version",
566                           ])
567    deps = [
568      ":$_js_assets_target",
569      ":$_metadata_target",
570      ":$_notice_target",
571      ":$_resources_target",
572      "//developtools/packing_tool:packing_tool",
573    ]
574    if (!skip_gen_module_info) {
575      deps += [ ":$_module_info_target" ]
576    }
577    enable_ark = build_ark
578    if (defined(shared_libraries)) {
579      deps += shared_libraries
580    }
581    packaged_js_assets = _packaged_js_assets
582    packaged_resources = _packaged_resources
583    hap_profile = _hap_profile
584    meta_data = _meta_data
585    hap_path = _hap_path
586    build_mode = _js_build_mode
587
588    install_module_info = {
589      module_def = get_label_info(":$target_name", "label_with_toolchain")
590      module_info_file =
591          rebase_path(get_label_info(module_def, "target_out_dir"),
592                      root_build_dir) + "/${target_name}_module_info.json"
593      subsystem_name = _subsystem_name
594      part_name = _part_name
595      toolchain = current_toolchain
596      toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
597    }
598  }
599}
600