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/config/sanitizers/sanitizers.gni")
16import("//build/ohos_var.gni")
17
18# Gen module info to file
19# private template
20#
21template("generate_module_info") {
22  assert(defined(invoker.module_name),
23         "module_label must be defined for ${target_name}.")
24  assert(defined(invoker.module_type),
25         "module_type must be defined for ${target_name}.")
26
27  forward_variables_from(invoker,
28                         [
29                           "testonly",
30                           "visibility",
31                         ])
32  forward_variables_from(invoker,
33                         [
34                           "module_label",
35                           "module_name",
36                           "module_source_dir",
37                           "module_install_images",
38                           "module_type",
39                           "module_install_name",
40                           "module_install_dir",
41                           "relative_install_dir",
42                           "module_output_extension",
43                           "module_source",
44                           "notice",
45                           "shlib_type",
46                           "innerapi_tags",
47                           "version_script",
48                           "part_name",
49                           "subsystem_name",
50                           "symlink_ext",
51                           "symlink_path",
52                         ])
53
54  if (!defined(module_label)) {
55    if (module_type == "java_library" || module_type == "none" ||
56        module_type == "app" || module_type == "dex") {
57      module_label = get_label_info(":$module_name", "label_no_toolchain")
58    } else {
59      module_label = get_label_info(":$module_name", "label_with_toolchain")
60    }
61  }
62  module_deps = [ get_label_info(module_label, "label_no_toolchain") ]
63
64  gen_script = "//build/templates/metadata/gen_module_info.py"
65
66  if (!defined(module_source_dir)) {
67    module_source_dir = "$root_out_dir"
68  }
69  if (!defined(module_install_name)) {
70    module_install_name = module_name
71  }
72  if (!defined(module_output_extension)) {
73    module_output_extension = ""
74  }
75
76  output_file = "${target_out_dir}/${module_name}_module_info.json"
77
78  # reset module_type when module_type is lib
79  if (module_type == "lib") {
80    if (target_cpu == "arm64" || target_cpu == "x86_64" ||
81        target_cpu == "loongarch64" || target_cpu == "riscv64") {
82      module_type = "lib64"
83    } else if (target_cpu == "arm" || target_cpu == "x86") {
84      module_type = "lib"
85    } else if (target_cpu == "riscv64" || target_cpu == "mipsel") {
86      module_type = "lib"
87    } else {
88      assert(false, "Error: unsupported target cpu name.")
89    }
90  }
91
92  if (!is_standard_system && (is_asan || is_tsan) &&
93      ("${module_type}" == "lib" || "${module_type}" == "lib64" ||
94       "${module_type}" == "bin")) {
95    system_base_dir = "${system_base_dir}/asan"
96  }
97
98  action(target_name) {
99    args = [
100      "--system-base-dir",
101      system_base_dir,
102      "--ramdisk-base-dir",
103      ramdisk_base_dir,
104      "--vendor-base-dir",
105      vendor_base_dir,
106      "--updater-base-dir",
107      updater_base_dir,
108      "--sys_prod-base-dir",
109      sys_prod_base_dir,
110      "--eng_system-base-dir",
111      eng_system_base_dir,
112      "--eng_chipset-base-dir",
113      eng_chipset_base_dir,
114      "--updater_vendor-base-dir",
115      updater_vendor_base_dir,
116      "--chip_prod-base-dir",
117      chip_prod_base_dir,
118      "--type",
119      module_type,
120      "--target-label",
121      module_label,
122      "--source-dir",
123      rebase_path(module_source_dir, "$root_build_dir"),
124      "--label-name",
125      module_name,
126      "--output-file",
127      rebase_path(output_file, "$root_build_dir"),
128    ]
129
130    if (module_install_name != "") {
131      args += [
132        "--install-name",
133        module_install_name,
134      ]
135    }
136
137    if (defined(invoker.module_alt_output_extension)) {
138      args += [
139        "--alternative-suffix",
140        invoker.module_alt_output_extension,
141      ]
142    }
143
144    if (defined(invoker.install_enable) && !invoker.install_enable) {
145      args += [ "--install-enable" ]
146    }
147    if (defined(invoker.collect) && invoker.collect) {
148      args += [ "--collect" ]
149    }
150
151    if (defined(module_install_images)) {
152      if (defined(module_install_dir) && module_install_dir != "") {
153        args += [
154          "--module-install-dir",
155          module_install_dir,
156        ]
157      }
158      if (defined(relative_install_dir) && relative_install_dir != "") {
159        args += [
160          "--relative-install-dir",
161          relative_install_dir,
162        ]
163      }
164      args += [ "--install-images" ]
165      args += module_install_images
166    }
167
168    # if prebuilt, add prebuilt=True
169    if (defined(invoker.prebuilt) && invoker.prebuilt) {
170      args += [
171        "--prebuilt",
172        "--module-source",
173        module_source,
174      ]
175    }
176
177    if (module_output_extension != "") {
178      args += [
179        "--suffix",
180        module_output_extension,
181      ]
182    }
183
184    if (defined(invoker.symlink_target_name)) {
185      args += [ "--symlink-target" ]
186      args += invoker.symlink_target_name
187    }
188
189    if (defined(invoker.output_prefix_override) &&
190        invoker.output_prefix_override) {
191      args += [ "--prefix-override" ]
192    }
193    if (defined(notice)) {
194      args += [
195        "--notice",
196        rebase_path(notice, root_build_dir),
197      ]
198    }
199
200    if (defined(part_name)) {
201      args += [
202        "--part-name",
203        part_name,
204      ]
205    }
206    if (defined(subsystem_name)) {
207      args += [
208        "--subsystem-name",
209        subsystem_name,
210      ]
211    }
212    if (defined(shlib_type)) {
213      args += [
214        "--shlib-type",
215        shlib_type,
216      ]
217    }
218    if (defined(innerapi_tags)) {
219      args += [ "--innerapi-tags" ]
220      args += innerapi_tags
221    }
222    if (defined(version_script)) {
223      args += [
224        "--version_script",
225        version_script,
226      ]
227    }
228    if (defined(symlink_ext)) {
229      args += [ "--symlink-ext" ]
230      args += symlink_ext
231    }
232    if (defined(symlink_path) && symlink_path != "") {
233      args += [
234        "--symlink-path",
235        symlink_path,
236      ]
237    }
238    script = gen_script
239    outputs = [ output_file ]
240  }
241
242  generated_file("${target_name}_install_info") {
243    outputs = [ "${target_out_dir}/${module_name}_install_info.json" ]
244    data_keys = [ "install_modules" ]
245    output_conversion = "json"
246    deps = module_deps
247  }
248}
249
250template("write_meta_data") {
251  assert(defined(invoker.meta_data), "meta_data must be defined")
252  assert(defined(invoker.type), "type must be defined")
253  forward_variables_from(invoker, [ "testonly" ])
254
255  action_with_pydeps(target_name) {
256    forward_variables_from(invoker,
257                           [
258                             "deps",
259                             "meta_data",
260                             "type",
261                             "resources",
262                             "hap_path",
263                             "app_profile",
264                             "hap_profile",
265                             "package_name",
266                             "raw_assets",
267                             "js_assets",
268                             "ets_assets",
269                             "js2abc",
270                             "unresolved_assets",
271                           ])
272    if (type != "js_assets" && type != "ets_assets" &&
273        type != "unresolved_assets" && type != "assets" &&
274        type != "resources" && type != "hap" && type != "app_profile") {
275      assert(
276          false,
277          "type must be one of [js_assets, ets_assets, unresolved_assets, assets, resources, hap, app_profile]")
278    }
279    if (type != "hap") {
280      _parent_invoker = invoker.invoker
281      _caller_target_name = get_label_info(":${_parent_invoker.target_name}",
282                                           "label_no_toolchain")
283      sources = [ _caller_target_name ]
284      sources = filter_exclude(sources, app_target_allowlist)
285      if (sources != []) {
286        if (type == "js_assets" || type == "ets_assets" ||
287            type == "unresolved_assets" || type == "assets") {
288          assert(
289              false,
290              "Illegal target name: \"${_caller_target_name}\", target name of ohos_js_assets or ohos_assets must endswith assets or asset ")
291        } else if (type == "resources") {
292          assert(
293              false,
294              "Illegal target name: \"${_caller_target_name}\", target name of ohos_resources must endswith res or resources or resource")
295        }
296      }
297    }
298
299    script = "//build/templates/metadata/write_meta_data.py"
300    outputs = [ meta_data ]
301    depfile = "$target_gen_dir/$target_name.d"
302
303    args = [
304      "--output",
305      rebase_path(meta_data, root_build_dir),
306      "--type",
307      type,
308      "--depfile",
309      rebase_path(depfile, root_build_dir),
310    ]
311
312    if (!defined(deps)) {
313      deps = []
314    }
315
316    _possible_deps = []
317    if (defined(invoker.possible_deps)) {
318      _possible_deps = invoker.possible_deps
319    }
320
321    _deps_metadata = []
322    inputs = []
323    foreach(d, _possible_deps) {
324      sources_raw = []
325      _target_label = get_label_info(d, "label_no_toolchain")
326      sources_raw += [ _target_label ]
327      sources = filter_exclude(sources_raw, app_target_allowlist)
328      if (sources == []) {
329        _deps_metadata += [ get_label_info(d, "target_gen_dir") + "/" +
330                            get_label_info(d, "name") + ".metadata" ]
331        deps += [ "${_target_label}__metadata" ]
332      }
333    }
334
335    if (_deps_metadata != []) {
336      args += [ "--deps-metadata" ]
337      foreach(d, _deps_metadata) {
338        args += [ rebase_path(d, root_build_dir) ]
339      }
340      inputs += _deps_metadata
341    }
342
343    if (defined(resources)) {
344      args += [ "--resources" ]
345      foreach(res, resources) {
346        args += [ rebase_path(res, root_build_dir) ]
347      }
348      if (defined(package_name)) {
349        args += [
350          "--package-name",
351          package_name,
352        ]
353      }
354    }
355
356    if (defined(app_profile)) {
357      args += [
358        "--app-profile",
359        rebase_path(app_profile, root_build_dir),
360      ]
361    }
362
363    if (defined(hap_profile)) {
364      args += [
365        "--hap-profile",
366        rebase_path(hap_profile, root_build_dir),
367      ]
368    }
369
370    if (defined(raw_assets)) {
371      args += [ "--raw-assets" ]
372      foreach(asset, raw_assets) {
373        args += [ rebase_path(asset, root_build_dir) ]
374      }
375    }
376
377    if (defined(js_assets)) {
378      args += [ "--js-assets" ]
379      foreach(asset, js_assets) {
380        args += [ rebase_path(asset, root_build_dir) ]
381      }
382    }
383
384    if (defined(ets_assets)) {
385      args += [ "--ets-assets" ]
386      foreach(asset, ets_assets) {
387        args += [ rebase_path(asset, root_build_dir) ]
388      }
389    }
390
391    if (defined(unresolved_assets)) {
392      args += [ "--unresolved-assets" ]
393      foreach(asset, unresolved_assets) {
394        args += [ rebase_path(asset, root_build_dir) ]
395      }
396    }
397
398    if (defined(js2abc) && js2abc) {
399      args += [ "--js2abc" ]
400    }
401
402    if (defined(hap_path)) {
403      args += [
404        "--hap-path",
405        rebase_path(hap_path, root_build_dir),
406      ]
407    }
408  }
409}
410