• 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/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                         ])
46
47  if (!defined(module_label)) {
48    if (module_type == "java_library" || module_type == "none" ||
49        module_type == "app" || module_type == "dex") {
50      module_label = get_label_info(":$module_name", "label_no_toolchain")
51    } else {
52      module_label = get_label_info(":$module_name", "label_with_toolchain")
53    }
54  }
55  module_deps = [ get_label_info(module_label, "label_no_toolchain") ]
56
57  gen_script = rebase_path("//build/templates/metadata/gen_module_info.py")
58
59  if (!defined(module_source_dir)) {
60    module_source_dir = "$root_out_dir"
61  }
62  if (!defined(module_install_name)) {
63    module_install_name = module_name
64  }
65  if (!defined(module_output_extension)) {
66    module_output_extension = ""
67  }
68
69  output_file = "${target_out_dir}/${module_name}_module_info.json"
70
71  # reset module_type when module_type is lib
72  if (module_type == "lib") {
73    if (target_cpu == "arm64" || target_cpu == "x86_64") {
74      module_type = "lib64"
75    } else if (target_cpu == "arm" || target_cpu == "x86") {
76      module_type = "lib"
77    } else {
78      assert(false, "Error: unsupported target cpu name.")
79    }
80  }
81
82  if (!is_standard_system && is_asan &&
83      ("${module_type}" == "lib" || "${module_type}" == "lib64" ||
84       "${module_type}" == "bin")) {
85    system_base_dir = "${system_base_dir}/asan"
86  }
87
88  arguments = [
89    "--system-base-dir",
90    system_base_dir,
91    "--ramdisk-base-dir",
92    ramdisk_base_dir,
93    "--vendor-base-dir",
94    vendor_base_dir,
95    "--updater-base-dir",
96    updater_base_dir,
97    "--sys_prod-base-dir",
98    sys_prod_base_dir,
99    "--chip_prod-base-dir",
100    chip_prod_base_dir,
101    "--type",
102    module_type,
103    "--target-label",
104    module_label,
105    "--source-dir",
106    rebase_path(module_source_dir, "$root_build_dir"),
107    "--label-name",
108    module_name,
109    "--install-name",
110    module_install_name,
111    "--output-file",
112    rebase_path(output_file, "$root_build_dir"),
113  ]
114
115  if (defined(invoker.module_alt_output_extension)) {
116    arguments += [
117      "--alternative-suffix",
118      invoker.module_alt_output_extension,
119    ]
120  }
121
122  if (defined(invoker.install_enable) && !invoker.install_enable) {
123    arguments += [ "--install-enable" ]
124  }
125  if (defined(invoker.collect) && invoker.collect) {
126    arguments += [ "--collect" ]
127  }
128
129  if (defined(module_install_images)) {
130    if (!defined(module_install_dir)) {
131      module_install_dir = ""
132    }
133    if (!defined(relative_install_dir)) {
134      relative_install_dir = ""
135    }
136    arguments += [
137      "--module-install-dir",
138      module_install_dir,
139      "--relative-install-dir",
140      relative_install_dir,
141      "--install-images",
142    ]
143    arguments += module_install_images
144  }
145
146  # if prebuilt, add prebuilt=True
147  if (defined(invoker.prebuilt) && invoker.prebuilt) {
148    arguments += [
149      "--prebuilt",
150      "--module-source",
151      module_source,
152    ]
153  } else {
154    arguments += [
155      "--install-name",
156      module_install_name,
157    ]
158  }
159
160  if (module_output_extension != "") {
161    arguments += [
162      "--suffix",
163      module_output_extension,
164    ]
165  }
166
167  if (defined(invoker.symlink_target_name)) {
168    arguments += [ "--symlink-target" ]
169    arguments += invoker.symlink_target_name
170  }
171
172  if (defined(invoker.output_prefix_override) &&
173      invoker.output_prefix_override) {
174    arguments += [ "--prefix-override" ]
175  }
176  if (defined(notice)) {
177    arguments += [
178      "--notice",
179      rebase_path(notice, root_build_dir),
180    ]
181  }
182
183  exec_script(gen_script, arguments)
184
185  generated_file("${target_name}") {
186    outputs = [ "${target_out_dir}/${module_name}_install_info.json" ]
187    data_keys = [ "install_modules" ]
188    output_conversion = "json"
189    deps = module_deps
190  }
191}
192
193template("write_meta_data") {
194  assert(defined(invoker.meta_data), "meta_data must be defined")
195  assert(defined(invoker.type), "type must be defined")
196  forward_variables_from(invoker, [ "testonly" ])
197
198  action_with_pydeps(target_name) {
199    forward_variables_from(invoker,
200                           [
201                             "deps",
202                             "meta_data",
203                             "type",
204                             "resources",
205                             "hap_path",
206                             "app_profile",
207                             "hap_profile",
208                             "package_name",
209                             "raw_assets",
210                             "js_assets",
211                             "ets_assets",
212                             "js2abc",
213                             "unresolved_assets",
214                           ])
215    if (type != "js_assets" && type != "ets_assets" &&
216        type != "unresolved_assets" && type != "assets" &&
217        type != "resources" && type != "hap" && type != "app_profile") {
218      assert(
219          false,
220          "type must be one of [js_assets, ets_assets, unresolved_assets, assets, resources, hap, app_profile]")
221    }
222    if (type != "hap") {
223      _parent_invoker = invoker.invoker
224      _caller_target_name = get_label_info(":${_parent_invoker.target_name}",
225                                           "label_no_toolchain")
226      set_sources_assignment_filter(app_target_allowlist)
227      sources = [ _caller_target_name ]
228      if (sources != []) {
229        if (type == "js_assets" || type == "ets_assets" ||
230            type == "unresolved_assets" || type == "assets") {
231          assert(
232              false,
233              "Illegal target name: \"${_caller_target_name}\", target name of ohos_js_assets or ohos_assets must endswith assets or asset ")
234        } else if (type == "resources") {
235          assert(
236              false,
237              "Illegal target name: \"${_caller_target_name}\", target name of ohos_resources must endswith res or resources or resource")
238        }
239      }
240      set_sources_assignment_filter([])
241    }
242
243    script = "//build/templates/metadata/write_meta_data.py"
244    outputs = [ meta_data ]
245    depfile = "$target_gen_dir/$target_name.d"
246
247    args = [
248      "--output",
249      rebase_path(meta_data, root_build_dir),
250      "--type",
251      type,
252      "--depfile",
253      rebase_path(depfile, root_build_dir),
254    ]
255
256    if (!defined(deps)) {
257      deps = []
258    }
259
260    _possible_deps = []
261    if (defined(invoker.possible_deps)) {
262      _possible_deps = invoker.possible_deps
263    }
264
265    _deps_metadata = []
266    inputs = []
267    set_sources_assignment_filter(app_target_allowlist)
268    foreach(d, _possible_deps) {
269      sources = []
270      _target_label = get_label_info(d, "label_no_toolchain")
271      sources += [ _target_label ]
272      if (sources == []) {
273        _deps_metadata += [ get_label_info(d, "target_gen_dir") + "/" +
274                            get_label_info(d, "name") + ".metadata" ]
275        deps += [ "${_target_label}__metadata" ]
276      }
277    }
278    set_sources_assignment_filter([])
279
280    if (_deps_metadata != []) {
281      args += [ "--deps-metadata" ]
282      foreach(d, _deps_metadata) {
283        args += [ rebase_path(d, root_build_dir) ]
284      }
285      inputs += _deps_metadata
286    }
287
288    if (defined(resources)) {
289      args += [ "--resources" ]
290      foreach(res, resources) {
291        args += [ rebase_path(res, root_build_dir) ]
292      }
293      if (defined(package_name)) {
294        args += [
295          "--package-name",
296          package_name,
297        ]
298      }
299    }
300
301    if (defined(app_profile)) {
302      args += [
303        "--app-profile",
304        rebase_path(app_profile, root_build_dir),
305      ]
306    }
307
308    if (defined(hap_profile)) {
309      args += [
310        "--hap-profile",
311        rebase_path(hap_profile, root_build_dir),
312      ]
313    }
314
315    if (defined(raw_assets)) {
316      args += [ "--raw-assets" ]
317      foreach(asset, raw_assets) {
318        args += [ rebase_path(asset, root_build_dir) ]
319      }
320    }
321
322    if (defined(js_assets)) {
323      args += [ "--js-assets" ]
324      foreach(asset, js_assets) {
325        args += [ rebase_path(asset, root_build_dir) ]
326      }
327    }
328
329    if (defined(ets_assets)) {
330      args += [ "--ets-assets" ]
331      foreach(asset, ets_assets) {
332        args += [ rebase_path(asset, root_build_dir) ]
333      }
334    }
335
336    if (defined(unresolved_assets)) {
337      args += [ "--unresolved-assets" ]
338      foreach(asset, unresolved_assets) {
339        args += [ rebase_path(asset, root_build_dir) ]
340      }
341    }
342
343    if (defined(js2abc) && js2abc) {
344      args += [ "--js2abc" ]
345    }
346
347    if (defined(hap_path)) {
348      args += [
349        "--hap-path",
350        rebase_path(hap_path, root_build_dir),
351      ]
352    }
353  }
354}
355