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    build_image_tools_path = [
208      "//${root_build_dir}/clang_x64/thirdparty/e2fsprogs",
209      "//${root_build_dir}/clang_x64/thirdparty/f2fs-tools",
210      "//third_party/e2fsprogs/prebuilt/host/bin",
211      "//build/ohos/images/mkimage",
212      "//base/startup/hvb/tools",
213    ]
214
215    sources = [ dac_config ]
216    outputs = [
217      output_image_file,
218      output_sign_image_file,
219    ]
220    args = [
221      "--image-name",
222      "module",
223      "--input-path",
224      rebase_path(image_input_path, root_build_dir),
225      "--fs-type",
226      "ext4",
227      "--dac-config",
228      rebase_path(dac_config, root_build_dir),
229      "--file-context",
230      rebase_path(file_context, root_build_dir),
231      "--output-image",
232      rebase_path(output_image_file, root_build_dir),
233      "--target-cpu",
234      target_cpu,
235      "--build-image-tools-path",
236    ]
237    args += rebase_path(build_image_tools_path, root_build_dir)
238    if (defined(invoker.img_public_key)) {
239      args += [
240        "--pubkey",
241        rebase_path(img_public_key, root_build_dir),
242        "--privkey",
243        rebase_path(img_private_key, root_build_dir),
244        "--output-sign-image-path",
245        rebase_path(output_sign_image_file, root_build_dir),
246      ]
247    }
248  }
249
250  ohos_copy("module_config_outer") {
251    sources = [ "$module_config" ]
252    outputs =
253        [ "$output_dir/module_package/$img_output_dir/{{source_file_part}}" ]
254  }
255
256  ohos_copy("pub_key_outer") {
257    sources = [ "$img_public_key" ]
258    outputs = [ "$output_dir/module_package/sign_img_output/pub_key.pem" ]
259  }
260
261  action(target_name) {
262    script = "//base/update/packaging_tools/build_module_package.py"
263    deps = [
264      ":module_config_outer",
265      "//base/update/sys_installer/tools/zipalign:zipalign",
266    ]
267    if (defined(invoker.img_public_key)) {
268      deps += [ ":pub_key_outer" ]
269    }
270    if (!empty) {
271      deps += [ ":build_image" ]
272    }
273
274    source_dir = "$output_dir/module_package/$img_output_dir"
275    out_dir = "$output_dir/module_package/zip_output"
276
277    sources = get_target_outputs(":module_config_outer")
278    outputs = [ "$out_dir/$package_name.zip" ]
279
280    args = [
281      "-pn",
282      package_name,
283      "-pk",
284      rebase_path(zip_private_key, root_build_dir),
285      "-sc",
286      rebase_path(sign_cert, root_build_dir),
287      rebase_path(source_dir, root_build_dir),
288      rebase_path(out_dir, root_build_dir),
289    ]
290  }
291}
292
293template("ohos_hmp") {
294  output_dir = "${root_out_dir}/"
295
296  _deps = []
297  module_packages = []
298  if (defined(invoker.module_packages)) {
299    module_packages += invoker.module_packages
300    _deps += module_packages
301  }
302
303  if (defined(invoker.pack_info)) {
304    pack_info = invoker.pack_info
305  }
306
307  assert(module_packages != "")
308  assert(pack_info != "")
309
310  package_name = target_name
311
312  action("build_hmp") {
313    script = "//base/update/packaging_tools/build_hmp.py"
314    deps = _deps
315
316    out_dir = "$output_dir/hmp"
317
318    sources = []
319    foreach(module_package, module_packages) {
320      module_name = get_label_info(module_package, "name")
321      module_out_dir = get_label_info(module_package, "target_out_dir")
322      sources +=
323          [ "$module_out_dir/module_package/zip_output/$module_name.zip" ]
324    }
325
326    outputs = [ "$out_dir/$package_name.zip" ]
327
328    args = [
329      "-pn",
330      package_name,
331      "-op",
332      rebase_path(out_dir, root_build_dir),
333      "-pi",
334      rebase_path(pack_info, root_build_dir),
335      "-mf",
336    ]
337    foreach(source, sources) {
338      source_path = rebase_path(source, root_build_dir)
339      args += [ source_path ]
340    }
341  }
342
343  group(target_name) {
344    deps = [ ":build_hmp" ]
345  }
346}
347