• 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
200# Declare an OHOS hap target
201#
202# Variables:
203#   deps: dependencies of this target.
204#   hap_name: name of output hap file.
205#   final_hap_path: full path of output hap file, final_hap_path overwrites hap_name.
206#   js2abc:   whether to transform js bundle to ark bytecode, default value
207#             follows build_ark.
208#   ets2abc:   whether to transform js bundle to ark bytecode, default value false
209#
210#
211template("ohos_hap") {
212  forward_variables_from(invoker, [ "testonly" ])
213  assert(defined(invoker.hap_profile),
214         "hap_profile must be defined for ohos_hap")
215
216  _deps = []
217  if (defined(invoker.deps)) {
218    _deps = invoker.deps
219  }
220
221  _hap_profile = invoker.hap_profile
222  _hap_name = target_name
223  if (defined(invoker.hap_name)) {
224    _hap_name = invoker.hap_name
225  }
226
227  _hap_path = "$target_out_dir/$_hap_name.hap"
228  if (defined(invoker.final_hap_path)) {
229    _hap_path = invoker.final_hap_path
230  }
231
232  _js2abc = build_ark
233  if (defined(invoker.js2abc)) {
234    _js2abc = invoker.js2abc
235  }
236
237  _ets2abc = false
238  if (defined(invoker.ets2abc)) {
239    _ets2abc = invoker.ets2abc
240  }
241
242  if (_ets2abc) {
243    _js2abc = false
244  }
245
246  _js_build_mode = "release"
247  if (defined(invoker.js_build_mode)) {
248    _js_build_mode = invoker.js_build_mode
249  }
250
251  _main_target_name = target_name
252
253  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
254    _subsystem_name = invoker.subsystem_name
255    _part_name = invoker.part_name
256  } else if (defined(invoker.part_name)) {
257    _part_name = invoker.part_name
258    _part_subsystem_info_file =
259        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
260    _arguments = [
261      "--part-name",
262      _part_name,
263      "--part-subsystem-info-file",
264      rebase_path(_part_subsystem_info_file, root_build_dir),
265    ]
266    _get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
267    _subsystem_name =
268        exec_script(_get_subsystem_script, _arguments, "trim string")
269  } else if (defined(invoker.subsystem_name)) {
270    _subsystem_name = invoker.subsystem_name
271    _part_name = _subsystem_name
272  } else {
273    _subsystem_name = "common"
274    _part_name = _subsystem_name
275  }
276
277  assert(_subsystem_name != "")  # Mark as used
278  assert(_part_name != "")  # Mark as used
279
280  # metadata is used to record all necessary data for hap.
281  _metadata_target = "${target_name}__metadata"
282  _meta_data = "$target_gen_dir/$target_name.metadata"
283  write_meta_data(_metadata_target) {
284    forward_variables_from(invoker,
285                           [
286                             "raw_assets",
287                             "resources",
288                             "js_assets",
289                             "ets_assets",
290                           ])
291    hap_profile = invoker.hap_profile
292    meta_data = _meta_data
293    possible_deps = _deps
294    type = "hap"
295    js2abc = _js2abc
296    hap_path = _hap_path
297  }
298
299  _js_assets_target = "${target_name}__js_assets"
300  _packaged_js_assets = "$target_out_dir/$target_name/js_assets.zip"
301  compile_js_assets(_js_assets_target) {
302    hap_profile = _hap_profile
303    packaged_js_assets = _packaged_js_assets
304    meta_data = _meta_data
305    deps = [ ":$_metadata_target" ] + _deps
306    build_mode = _js_build_mode
307    js2abc = _js2abc
308    ets2abc = _ets2abc
309    if (defined(testonly) && testonly == true) {
310      main_target_name = _main_target_name
311    }
312  }
313
314  _resources_target = "${target_name}__compile_resources"
315  _packaged_resources = "$target_out_dir/$target_name/resources.zip"
316  _generated_header_dir = "$target_out_dir/$target_name"
317  compile_resources(_resources_target) {
318    hap_profile = _hap_profile
319    packaged_resources = _packaged_resources
320    generated_header_dir = _generated_header_dir
321    meta_data = _meta_data
322    deps = [ ":$_metadata_target" ] + _deps
323  }
324
325  _notice_target = "${target_name}__notice"
326  collect_notice(_notice_target) {
327    forward_variables_from(invoker,
328                           [
329                             "license_as_sources",
330                             "license_file",
331                           ])
332    module_type = "app"
333    module_name = _main_target_name
334    module_source_dir = get_label_info(":${_main_target_name}", "dir")
335  }
336
337  package_app(target_name) {
338    forward_variables_from(invoker,
339                           [
340                             "shared_libraries",
341                             "private_key_path",
342                             "signature_algorithm",
343                             "certificate_profile",
344                             "keystore_path",
345                             "keystore_password",
346                             "key_alias",
347                             "certificate_file",
348                           ])
349    deps = [
350      ":$_js_assets_target",
351      ":$_metadata_target",
352      ":$_notice_target",
353      ":$_resources_target",
354    ]
355    enable_ark = build_ark
356    if (defined(shared_libraries)) {
357      deps += shared_libraries
358    }
359    packaged_js_assets = _packaged_js_assets
360    packaged_resources = _packaged_resources
361    hap_profile = _hap_profile
362    meta_data = _meta_data
363    hap_path = _hap_path
364    build_mode = _js_build_mode
365
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      subsystem_name = _subsystem_name
372      part_name = _part_name
373      toolchain = current_toolchain
374      toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
375    }
376  }
377
378  generate_module_info("${_main_target_name}_info") {
379    module_name = _main_target_name
380    module_type = "app"
381
382    module_source_dir = get_path_info(_hap_path, "dir")
383    module_install_name = get_path_info(_hap_path, "name")
384    if (defined(invoker.module_install_name)) {
385      module_install_name = invoker.module_install_name
386    }
387
388    module_install_images = [ "system" ]
389    if (defined(invoker.install_images)) {
390      module_install_images = []
391      module_install_images += invoker.install_images
392    }
393    install_enable = true
394    if (defined(invoker.install_enable)) {
395      install_enable = invoker.enable
396    }
397
398    module_output_extension = ".hap"
399
400    module_install_dir = "${module_type}"
401    if (defined(invoker.module_install_dir)) {
402      module_install_dir = invoker.module_install_dir
403    }
404
405    if (defined(invoker.relative_install_dir)) {
406      relative_install_dir = invoker.relative_install_dir
407    }
408
409    if (defined(invoker.symlink_target_name)) {
410      symlink_target_name = invoker.symlink_target_name
411    }
412    notice = "$target_out_dir/$_main_target_name.notice.txt"
413  }
414}
415