• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2023 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.gni")
16import("//build/ohos/build_var.gni")
17import("//build/ohos_var.gni")
18
19template("check_abi_and_copy_deps") {
20  action(target_name) {
21    abidiff_target = "//third_party/libabigail/tools:abidiff($host_toolchain)"
22    abidw_target = "//third_party/libabigail/tools:abidw($host_toolchain)"
23    deps = invoker.sources
24    deps += [ abidiff_target ]
25    deps += [ abidw_target ]
26    outputs = []
27    check_params = []
28    foreach(element, invoker.sources) {
29      element_target_out_dir = get_label_info(element, "target_out_dir")
30      element_name = get_label_info(element, "name")
31
32      param_data = []
33      param_data = {
34        type = invoker.type
35        target_out_dir = rebase_path(element_target_out_dir, root_build_dir)
36        target_name = element_name
37        root_out_dir = rebase_path(invoker.root_out_dir, root_build_dir)
38      }
39      check_params += [ param_data ]
40
41      outputs += [ "${element_target_out_dir}/${element_name}_abi_info.dump" ]
42    }
43
44    check_datas_file =
45        "${target_out_dir}/${invoker.target_name}_check_datas.json"
46    write_file(check_datas_file, check_params, "json")
47
48    inputs = [ check_datas_file ]
49    script = "//build/ohos/update/check_abi_and_copy_deps.py"
50
51    args = [
52      "--clang-readelf",
53      rebase_path("$clang_base_path/bin/llvm-readelf", root_build_dir),
54      "--target-out-dir",
55      rebase_path(target_out_dir, root_build_dir),
56      "--check-datas-file",
57      rebase_path(check_datas_file, root_build_dir),
58      "--abidiff-target-name",
59      get_label_info(abidiff_target, "name"),
60      "--abidiff-target-out-dir",
61      rebase_path(get_label_info(abidiff_target, "target_out_dir"),
62                  root_build_dir),
63      "--abidw-target-name",
64      get_label_info(abidw_target, "name"),
65      "--abidw-target-out-dir",
66      rebase_path(get_label_info(abidw_target, "target_out_dir"),
67                  root_build_dir),
68      "--abi-dumps-path",
69      rebase_path("//prebuilts/abi_dumps", root_build_dir),
70    ]
71  }
72}
73
74template("ohos_module_package") {
75  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
76    subsystem_name = invoker.subsystem_name
77    part_name = invoker.part_name
78  } else if (defined(invoker.part_name)) {
79    part_name = invoker.part_name
80    _part_subsystem_info_file =
81        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
82    _arguments = [
83      "--part-name",
84      part_name,
85      "--part-subsystem-info-file",
86      rebase_path(_part_subsystem_info_file, root_build_dir),
87    ]
88    get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
89    subsystem_name =
90        exec_script(get_subsystem_script, _arguments, "trim string")
91  } else if (defined(invoker.subsystem_name)) {
92    subsystem_name = invoker.subsystem_name
93    part_name = subsystem_name
94  } else {
95    subsystem_name = "build"
96    part_name = "build_framework"
97  }
98
99  if (defined(invoker.zip_private_key)) {
100    zip_private_key = invoker.zip_private_key
101  }
102
103  if (defined(invoker.sign_cert)) {
104    sign_cert = invoker.sign_cert
105  }
106
107  if (defined(invoker.img_private_key)) {
108    img_private_key = invoker.img_private_key
109  } else {
110    img_private_key = "//base/startup/hvb/tools/vb_pub_key/test_priv.pem"
111  }
112
113  if (defined(invoker.img_public_key)) {
114    img_public_key = invoker.img_public_key
115    img_output_dir = "sign_img_output"
116  } else {
117    img_public_key = "//base/startup/hvb/tools/vb_pub_key/test_pub.pem"
118    img_output_dir = "img_output"
119  }
120
121  if (defined(invoker.libraries) && invoker.libraries != []) {
122    libraries = invoker.libraries
123    check_abi_and_copy_deps("${target_name}_libraries") {
124      sources = libraries
125      type = "shared_library"
126    }
127  }
128
129  if (defined(invoker.prebuilts) && invoker.prebuilts != []) {
130    prebuilts = invoker.prebuilts
131    check_abi_and_copy_deps("${target_name}_prebuilts") {
132      sources = prebuilts
133      type = "prebuilt"
134    }
135  }
136
137  if (defined(invoker.binaries) && invoker.binaries != []) {
138    binaries = invoker.binaries
139    check_abi_and_copy_deps("${target_name}_binaries") {
140      sources = binaries
141      type = "executable"
142    }
143  }
144
145  if (defined(invoker.etc) && invoker.etc != []) {
146    etc = invoker.etc
147    check_abi_and_copy_deps("${target_name}_etc") {
148      sources = etc
149      type = "etc"
150    }
151  }
152
153  if (defined(invoker.empty)) {
154    empty = invoker.empty
155  } else {
156    empty = false
157  }
158
159  output_dir = "${target_out_dir}/"
160  package_name = target_name
161
162  if (defined(invoker.module_config)) {
163    module_config = invoker.module_config
164  }
165
166  assert(subsystem_name != "")
167  assert(part_name != "")
168  assert(zip_private_key != "")
169  assert(sign_cert != "")
170  assert(img_private_key != "")
171  assert(img_public_key != "")
172  assert(module_config != "")
173
174  ohos_copy("module_config_inner") {
175    sources = [ "$module_config" ]
176    outputs = [ "$output_dir/module_package/img_input/{{source_file_part}}" ]
177  }
178
179  action("build_image") {
180    script = "//base/update/packaging_tools/build_module_img.py"
181
182    deps = [
183      ":module_config_inner",
184      "//third_party/e2fsprogs:e2fsprogs_host_toolchain",
185      "//third_party/e2fsprogs:resize2fs($host_toolchain)",
186    ]
187    if (defined(invoker.etc) && etc != []) {
188      deps += [ ":${package_name}_etc" ]
189    }
190    if (defined(invoker.libraries) && libraries != []) {
191      deps += [ ":${package_name}_libraries" ]
192    }
193    if (defined(invoker.prebuilts) && prebuilts != []) {
194      deps += [ ":${package_name}_prebuilts" ]
195    }
196    if (defined(invoker.binaries) && binaries != []) {
197      deps += [ ":${package_name}_binaries" ]
198    }
199
200    dac_config = "//build/ohos/images/mkimage/dac.txt"
201    file_context =
202        "$root_build_dir/obj/base/security/selinux_adapter/file_contexts.bin"
203    image_input_path = "$output_dir/module_package/img_input"
204    output_image_file = "$output_dir/module_package/img_output/module.img"
205    output_sign_image_file =
206        "$output_dir/module_package/sign_img_output/module.img"
207    if (host_cpu == "arm64") {
208      build_image_tools_path = [
209        "//${root_build_dir}/clang_arm64/thirdparty/e2fsprogs",
210        "//${root_build_dir}/clang_arm64/thirdparty/f2fs-tools",
211      ]
212    } else {
213      build_image_tools_path = [
214        "//${root_build_dir}/clang_x64/thirdparty/e2fsprogs",
215        "//${root_build_dir}/clang_x64/thirdparty/f2fs-tools",
216      ]
217    }
218    build_image_tools_path += [
219      "//third_party/e2fsprogs/prebuilt/host/bin",
220      "//build/ohos/images/mkimage",
221      "//base/startup/hvb/tools",
222    ]
223
224    sources = [ dac_config ]
225    outputs = [
226      output_image_file,
227      output_sign_image_file,
228    ]
229    args = [
230      "--image-name",
231      "module",
232      "--input-path",
233      rebase_path(image_input_path, root_build_dir),
234      "--fs-type",
235      "ext4",
236      "--dac-config",
237      rebase_path(dac_config, root_build_dir),
238      "--file-context",
239      rebase_path(file_context, root_build_dir),
240      "--output-image",
241      rebase_path(output_image_file, root_build_dir),
242      "--target-cpu",
243      target_cpu,
244      "--build-image-tools-path",
245    ]
246    args += rebase_path(build_image_tools_path, root_build_dir)
247    if (defined(invoker.img_public_key)) {
248      args += [
249        "--pubkey",
250        rebase_path(img_public_key, root_build_dir),
251        "--privkey",
252        rebase_path(img_private_key, root_build_dir),
253        "--output-sign-image-path",
254        rebase_path(output_sign_image_file, root_build_dir),
255      ]
256    }
257  }
258
259  ohos_copy("module_config_outer") {
260    sources = [ "$module_config" ]
261    outputs =
262        [ "$output_dir/module_package/$img_output_dir/{{source_file_part}}" ]
263  }
264
265  ohos_copy("pub_key_outer") {
266    sources = [ "$img_public_key" ]
267    outputs = [ "$output_dir/module_package/sign_img_output/pub_key.pem" ]
268  }
269
270  action(target_name) {
271    script = "//base/update/packaging_tools/build_module_package.py"
272    deps = [
273      ":module_config_outer",
274      "//base/update/sys_installer/tools/zipalign:zipalign",
275    ]
276    if (defined(invoker.img_public_key)) {
277      deps += [ ":pub_key_outer" ]
278    }
279    if (!empty) {
280      deps += [ ":build_image" ]
281    }
282
283    source_dir = "$output_dir/module_package/$img_output_dir"
284    out_dir = "$output_dir/module_package/zip_output"
285
286    sources = get_target_outputs(":module_config_outer")
287    outputs = [ "$out_dir/$package_name.zip" ]
288
289    args = [
290      "-pn",
291      package_name,
292      "-pk",
293      rebase_path(zip_private_key, root_build_dir),
294      "-sc",
295      rebase_path(sign_cert, root_build_dir),
296      rebase_path(source_dir, root_build_dir),
297      rebase_path(out_dir, root_build_dir),
298    ]
299  }
300}
301
302template("ohos_hmp") {
303  output_dir = "${root_out_dir}/"
304
305  _deps = []
306  module_packages = []
307  if (defined(invoker.module_packages)) {
308    module_packages += invoker.module_packages
309    _deps += module_packages
310  }
311
312  if (defined(invoker.pack_info)) {
313    pack_info = invoker.pack_info
314  }
315
316  assert(module_packages != "")
317  assert(pack_info != "")
318
319  package_name = target_name
320
321  action("build_hmp") {
322    script = "//base/update/packaging_tools/build_hmp.py"
323    deps = _deps
324
325    out_dir = "$output_dir/hmp"
326
327    sources = []
328    foreach(module_package, module_packages) {
329      module_name = get_label_info(module_package, "name")
330      module_out_dir = get_label_info(module_package, "target_out_dir")
331      sources +=
332          [ "$module_out_dir/module_package/zip_output/$module_name.zip" ]
333    }
334
335    outputs = [ "$out_dir/$package_name.zip" ]
336
337    args = [
338      "-pn",
339      package_name,
340      "-op",
341      rebase_path(out_dir, root_build_dir),
342      "-pi",
343      rebase_path(pack_info, root_build_dir),
344      "-mf",
345    ]
346    foreach(source, sources) {
347      source_path = rebase_path(source, root_build_dir)
348      args += [ source_path ]
349    }
350  }
351
352  group(target_name) {
353    deps = [ ":build_hmp" ]
354  }
355}
356