xref: /build/templates/update/module_update.gni (revision 5f9996aa)
15f9996aaSopenharmony_ci# Copyright (c) 2023 Huawei Device Co., Ltd.
25f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
35f9996aaSopenharmony_ci# you may not use this file except in compliance with the License.
45f9996aaSopenharmony_ci# You may obtain a copy of the License at
55f9996aaSopenharmony_ci#
65f9996aaSopenharmony_ci#     http://www.apache.org/licenses/LICENSE-2.0
75f9996aaSopenharmony_ci#
85f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
95f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
105f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
115f9996aaSopenharmony_ci# See the License for the specific language governing permissions and
125f9996aaSopenharmony_ci# limitations under the License.
135f9996aaSopenharmony_ci
145f9996aaSopenharmony_ciimport("//build/config/python.gni")
155f9996aaSopenharmony_ciimport("//build/ohos.gni")
165f9996aaSopenharmony_ciimport("//build/ohos/build_var.gni")
175f9996aaSopenharmony_ciimport("//build/ohos_var.gni")
185f9996aaSopenharmony_ci
195f9996aaSopenharmony_citemplate("check_abi_and_copy_deps") {
205f9996aaSopenharmony_ci  action(target_name) {
215f9996aaSopenharmony_ci    abidiff_target = "//third_party/libabigail/tools:abidiff($host_toolchain)"
225f9996aaSopenharmony_ci    abidw_target = "//third_party/libabigail/tools:abidw($host_toolchain)"
235f9996aaSopenharmony_ci    deps = invoker.sources
245f9996aaSopenharmony_ci    deps += [ abidiff_target ]
255f9996aaSopenharmony_ci    deps += [ abidw_target ]
265f9996aaSopenharmony_ci    outputs = []
275f9996aaSopenharmony_ci    check_params = []
285f9996aaSopenharmony_ci    foreach(element, invoker.sources) {
295f9996aaSopenharmony_ci      element_target_out_dir = get_label_info(element, "target_out_dir")
305f9996aaSopenharmony_ci      element_name = get_label_info(element, "name")
315f9996aaSopenharmony_ci
325f9996aaSopenharmony_ci      param_data = []
335f9996aaSopenharmony_ci      param_data = {
345f9996aaSopenharmony_ci        type = invoker.type
355f9996aaSopenharmony_ci        target_out_dir = rebase_path(element_target_out_dir, root_build_dir)
365f9996aaSopenharmony_ci        target_name = element_name
375f9996aaSopenharmony_ci        root_out_dir = rebase_path(invoker.root_out_dir, root_build_dir)
385f9996aaSopenharmony_ci      }
395f9996aaSopenharmony_ci      check_params += [ param_data ]
405f9996aaSopenharmony_ci
415f9996aaSopenharmony_ci      outputs += [ "${element_target_out_dir}/${element_name}_abi_info.dump" ]
425f9996aaSopenharmony_ci    }
435f9996aaSopenharmony_ci
445f9996aaSopenharmony_ci    check_datas_file =
455f9996aaSopenharmony_ci        "${target_out_dir}/${invoker.target_name}_check_datas.json"
465f9996aaSopenharmony_ci    write_file(check_datas_file, check_params, "json")
475f9996aaSopenharmony_ci
485f9996aaSopenharmony_ci    inputs = [ check_datas_file ]
495f9996aaSopenharmony_ci    script = "//build/ohos/update/check_abi_and_copy_deps.py"
505f9996aaSopenharmony_ci
515f9996aaSopenharmony_ci    args = [
525f9996aaSopenharmony_ci      "--clang-readelf",
535f9996aaSopenharmony_ci      rebase_path("$clang_base_path/bin/llvm-readelf", root_build_dir),
545f9996aaSopenharmony_ci      "--target-out-dir",
555f9996aaSopenharmony_ci      rebase_path(target_out_dir, root_build_dir),
565f9996aaSopenharmony_ci      "--check-datas-file",
575f9996aaSopenharmony_ci      rebase_path(check_datas_file, root_build_dir),
585f9996aaSopenharmony_ci      "--abidiff-target-name",
595f9996aaSopenharmony_ci      get_label_info(abidiff_target, "name"),
605f9996aaSopenharmony_ci      "--abidiff-target-out-dir",
615f9996aaSopenharmony_ci      rebase_path(get_label_info(abidiff_target, "target_out_dir"),
625f9996aaSopenharmony_ci                  root_build_dir),
635f9996aaSopenharmony_ci      "--abidw-target-name",
645f9996aaSopenharmony_ci      get_label_info(abidw_target, "name"),
655f9996aaSopenharmony_ci      "--abidw-target-out-dir",
665f9996aaSopenharmony_ci      rebase_path(get_label_info(abidw_target, "target_out_dir"),
675f9996aaSopenharmony_ci                  root_build_dir),
685f9996aaSopenharmony_ci      "--abi-dumps-path",
695f9996aaSopenharmony_ci      rebase_path("//prebuilts/abi_dumps", root_build_dir),
705f9996aaSopenharmony_ci    ]
715f9996aaSopenharmony_ci  }
725f9996aaSopenharmony_ci}
735f9996aaSopenharmony_ci
745f9996aaSopenharmony_citemplate("ohos_module_package") {
755f9996aaSopenharmony_ci  if (defined(invoker.subsystem_name) && defined(invoker.part_name)) {
765f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
775f9996aaSopenharmony_ci    part_name = invoker.part_name
785f9996aaSopenharmony_ci  } else if (defined(invoker.part_name)) {
795f9996aaSopenharmony_ci    part_name = invoker.part_name
805f9996aaSopenharmony_ci    _part_subsystem_info_file =
815f9996aaSopenharmony_ci        "$root_build_dir/build_configs/parts_info/part_subsystem.json"
825f9996aaSopenharmony_ci    _arguments = [
835f9996aaSopenharmony_ci      "--part-name",
845f9996aaSopenharmony_ci      part_name,
855f9996aaSopenharmony_ci      "--part-subsystem-info-file",
865f9996aaSopenharmony_ci      rebase_path(_part_subsystem_info_file, root_build_dir),
875f9996aaSopenharmony_ci    ]
885f9996aaSopenharmony_ci    get_subsystem_script = "//build/templates/common/get_subsystem_name.py"
895f9996aaSopenharmony_ci    subsystem_name =
905f9996aaSopenharmony_ci        exec_script(get_subsystem_script, _arguments, "trim string")
915f9996aaSopenharmony_ci  } else if (defined(invoker.subsystem_name)) {
925f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
935f9996aaSopenharmony_ci    part_name = subsystem_name
945f9996aaSopenharmony_ci  } else {
955f9996aaSopenharmony_ci    subsystem_name = "build"
965f9996aaSopenharmony_ci    part_name = "build_framework"
975f9996aaSopenharmony_ci  }
985f9996aaSopenharmony_ci
995f9996aaSopenharmony_ci  if (defined(invoker.zip_private_key)) {
1005f9996aaSopenharmony_ci    zip_private_key = invoker.zip_private_key
1015f9996aaSopenharmony_ci  }
1025f9996aaSopenharmony_ci
1035f9996aaSopenharmony_ci  if (defined(invoker.sign_cert)) {
1045f9996aaSopenharmony_ci    sign_cert = invoker.sign_cert
1055f9996aaSopenharmony_ci  }
1065f9996aaSopenharmony_ci
1075f9996aaSopenharmony_ci  if (defined(invoker.img_private_key)) {
1085f9996aaSopenharmony_ci    img_private_key = invoker.img_private_key
1095f9996aaSopenharmony_ci  } else {
1105f9996aaSopenharmony_ci    img_private_key = "//base/startup/hvb/tools/vb_pub_key/test_priv.pem"
1115f9996aaSopenharmony_ci  }
1125f9996aaSopenharmony_ci
1135f9996aaSopenharmony_ci  if (defined(invoker.img_public_key)) {
1145f9996aaSopenharmony_ci    img_public_key = invoker.img_public_key
1155f9996aaSopenharmony_ci    img_output_dir = "sign_img_output"
1165f9996aaSopenharmony_ci  } else {
1175f9996aaSopenharmony_ci    img_public_key = "//base/startup/hvb/tools/vb_pub_key/test_pub.pem"
1185f9996aaSopenharmony_ci    img_output_dir = "img_output"
1195f9996aaSopenharmony_ci  }
1205f9996aaSopenharmony_ci
1215f9996aaSopenharmony_ci  if (defined(invoker.libraries) && invoker.libraries != []) {
1225f9996aaSopenharmony_ci    libraries = invoker.libraries
1235f9996aaSopenharmony_ci    check_abi_and_copy_deps("${target_name}_libraries") {
1245f9996aaSopenharmony_ci      sources = libraries
1255f9996aaSopenharmony_ci      type = "shared_library"
1265f9996aaSopenharmony_ci    }
1275f9996aaSopenharmony_ci  }
1285f9996aaSopenharmony_ci
1295f9996aaSopenharmony_ci  if (defined(invoker.prebuilts) && invoker.prebuilts != []) {
1305f9996aaSopenharmony_ci    prebuilts = invoker.prebuilts
1315f9996aaSopenharmony_ci    check_abi_and_copy_deps("${target_name}_prebuilts") {
1325f9996aaSopenharmony_ci      sources = prebuilts
1335f9996aaSopenharmony_ci      type = "prebuilt"
1345f9996aaSopenharmony_ci    }
1355f9996aaSopenharmony_ci  }
1365f9996aaSopenharmony_ci
1375f9996aaSopenharmony_ci  if (defined(invoker.binaries) && invoker.binaries != []) {
1385f9996aaSopenharmony_ci    binaries = invoker.binaries
1395f9996aaSopenharmony_ci    check_abi_and_copy_deps("${target_name}_binaries") {
1405f9996aaSopenharmony_ci      sources = binaries
1415f9996aaSopenharmony_ci      type = "executable"
1425f9996aaSopenharmony_ci    }
1435f9996aaSopenharmony_ci  }
1445f9996aaSopenharmony_ci
1455f9996aaSopenharmony_ci  if (defined(invoker.etc) && invoker.etc != []) {
1465f9996aaSopenharmony_ci    etc = invoker.etc
1475f9996aaSopenharmony_ci    check_abi_and_copy_deps("${target_name}_etc") {
1485f9996aaSopenharmony_ci      sources = etc
1495f9996aaSopenharmony_ci      type = "etc"
1505f9996aaSopenharmony_ci    }
1515f9996aaSopenharmony_ci  }
1525f9996aaSopenharmony_ci
1535f9996aaSopenharmony_ci  if (defined(invoker.empty)) {
1545f9996aaSopenharmony_ci    empty = invoker.empty
1555f9996aaSopenharmony_ci  } else {
1565f9996aaSopenharmony_ci    empty = false
1575f9996aaSopenharmony_ci  }
1585f9996aaSopenharmony_ci
1595f9996aaSopenharmony_ci  output_dir = "${target_out_dir}/"
1605f9996aaSopenharmony_ci  package_name = target_name
1615f9996aaSopenharmony_ci
1625f9996aaSopenharmony_ci  if (defined(invoker.module_config)) {
1635f9996aaSopenharmony_ci    module_config = invoker.module_config
1645f9996aaSopenharmony_ci  }
1655f9996aaSopenharmony_ci
1665f9996aaSopenharmony_ci  assert(subsystem_name != "")
1675f9996aaSopenharmony_ci  assert(part_name != "")
1685f9996aaSopenharmony_ci  assert(zip_private_key != "")
1695f9996aaSopenharmony_ci  assert(sign_cert != "")
1705f9996aaSopenharmony_ci  assert(img_private_key != "")
1715f9996aaSopenharmony_ci  assert(img_public_key != "")
1725f9996aaSopenharmony_ci  assert(module_config != "")
1735f9996aaSopenharmony_ci
1745f9996aaSopenharmony_ci  ohos_copy("module_config_inner") {
1755f9996aaSopenharmony_ci    sources = [ "$module_config" ]
1765f9996aaSopenharmony_ci    outputs = [ "$output_dir/module_package/img_input/{{source_file_part}}" ]
1775f9996aaSopenharmony_ci  }
1785f9996aaSopenharmony_ci
1795f9996aaSopenharmony_ci  action("build_image") {
1805f9996aaSopenharmony_ci    script = "//base/update/packaging_tools/build_module_img.py"
1815f9996aaSopenharmony_ci
1825f9996aaSopenharmony_ci    deps = [
1835f9996aaSopenharmony_ci      ":module_config_inner",
1845f9996aaSopenharmony_ci      "//third_party/e2fsprogs:e2fsprogs_host_toolchain",
1855f9996aaSopenharmony_ci      "//third_party/e2fsprogs:resize2fs($host_toolchain)",
1865f9996aaSopenharmony_ci    ]
1875f9996aaSopenharmony_ci    if (defined(invoker.etc) && etc != []) {
1885f9996aaSopenharmony_ci      deps += [ ":${package_name}_etc" ]
1895f9996aaSopenharmony_ci    }
1905f9996aaSopenharmony_ci    if (defined(invoker.libraries) && libraries != []) {
1915f9996aaSopenharmony_ci      deps += [ ":${package_name}_libraries" ]
1925f9996aaSopenharmony_ci    }
1935f9996aaSopenharmony_ci    if (defined(invoker.prebuilts) && prebuilts != []) {
1945f9996aaSopenharmony_ci      deps += [ ":${package_name}_prebuilts" ]
1955f9996aaSopenharmony_ci    }
1965f9996aaSopenharmony_ci    if (defined(invoker.binaries) && binaries != []) {
1975f9996aaSopenharmony_ci      deps += [ ":${package_name}_binaries" ]
1985f9996aaSopenharmony_ci    }
1995f9996aaSopenharmony_ci
2005f9996aaSopenharmony_ci    dac_config = "//build/ohos/images/mkimage/dac.txt"
2015f9996aaSopenharmony_ci    file_context =
2025f9996aaSopenharmony_ci        "$root_build_dir/obj/base/security/selinux_adapter/file_contexts.bin"
2035f9996aaSopenharmony_ci    image_input_path = "$output_dir/module_package/img_input"
2045f9996aaSopenharmony_ci    output_image_file = "$output_dir/module_package/img_output/module.img"
2055f9996aaSopenharmony_ci    output_sign_image_file =
2065f9996aaSopenharmony_ci        "$output_dir/module_package/sign_img_output/module.img"
2075f9996aaSopenharmony_ci    build_image_tools_path = [
2085f9996aaSopenharmony_ci      "//${root_build_dir}/clang_x64/thirdparty/e2fsprogs",
2095f9996aaSopenharmony_ci      "//${root_build_dir}/clang_x64/thirdparty/f2fs-tools",
2105f9996aaSopenharmony_ci      "//third_party/e2fsprogs/prebuilt/host/bin",
2115f9996aaSopenharmony_ci      "//build/ohos/images/mkimage",
2125f9996aaSopenharmony_ci      "//base/startup/hvb/tools",
2135f9996aaSopenharmony_ci    ]
2145f9996aaSopenharmony_ci
2155f9996aaSopenharmony_ci    sources = [ dac_config ]
2165f9996aaSopenharmony_ci    outputs = [
2175f9996aaSopenharmony_ci      output_image_file,
2185f9996aaSopenharmony_ci      output_sign_image_file,
2195f9996aaSopenharmony_ci    ]
2205f9996aaSopenharmony_ci    args = [
2215f9996aaSopenharmony_ci      "--image-name",
2225f9996aaSopenharmony_ci      "module",
2235f9996aaSopenharmony_ci      "--input-path",
2245f9996aaSopenharmony_ci      rebase_path(image_input_path, root_build_dir),
2255f9996aaSopenharmony_ci      "--fs-type",
2265f9996aaSopenharmony_ci      "ext4",
2275f9996aaSopenharmony_ci      "--dac-config",
2285f9996aaSopenharmony_ci      rebase_path(dac_config, root_build_dir),
2295f9996aaSopenharmony_ci      "--file-context",
2305f9996aaSopenharmony_ci      rebase_path(file_context, root_build_dir),
2315f9996aaSopenharmony_ci      "--output-image",
2325f9996aaSopenharmony_ci      rebase_path(output_image_file, root_build_dir),
2335f9996aaSopenharmony_ci      "--target-cpu",
2345f9996aaSopenharmony_ci      target_cpu,
2355f9996aaSopenharmony_ci      "--build-image-tools-path",
2365f9996aaSopenharmony_ci    ]
2375f9996aaSopenharmony_ci    args += rebase_path(build_image_tools_path, root_build_dir)
2385f9996aaSopenharmony_ci    if (defined(invoker.img_public_key)) {
2395f9996aaSopenharmony_ci      args += [
2405f9996aaSopenharmony_ci        "--pubkey",
2415f9996aaSopenharmony_ci        rebase_path(img_public_key, root_build_dir),
2425f9996aaSopenharmony_ci        "--privkey",
2435f9996aaSopenharmony_ci        rebase_path(img_private_key, root_build_dir),
2445f9996aaSopenharmony_ci        "--output-sign-image-path",
2455f9996aaSopenharmony_ci        rebase_path(output_sign_image_file, root_build_dir),
2465f9996aaSopenharmony_ci      ]
2475f9996aaSopenharmony_ci    }
2485f9996aaSopenharmony_ci  }
2495f9996aaSopenharmony_ci
2505f9996aaSopenharmony_ci  ohos_copy("module_config_outer") {
2515f9996aaSopenharmony_ci    sources = [ "$module_config" ]
2525f9996aaSopenharmony_ci    outputs =
2535f9996aaSopenharmony_ci        [ "$output_dir/module_package/$img_output_dir/{{source_file_part}}" ]
2545f9996aaSopenharmony_ci  }
2555f9996aaSopenharmony_ci
2565f9996aaSopenharmony_ci  ohos_copy("pub_key_outer") {
2575f9996aaSopenharmony_ci    sources = [ "$img_public_key" ]
2585f9996aaSopenharmony_ci    outputs = [ "$output_dir/module_package/sign_img_output/pub_key.pem" ]
2595f9996aaSopenharmony_ci  }
2605f9996aaSopenharmony_ci
2615f9996aaSopenharmony_ci  action(target_name) {
2625f9996aaSopenharmony_ci    script = "//base/update/packaging_tools/build_module_package.py"
2635f9996aaSopenharmony_ci    deps = [
2645f9996aaSopenharmony_ci      ":module_config_outer",
2655f9996aaSopenharmony_ci      "//base/update/sys_installer/tools/zipalign:zipalign",
2665f9996aaSopenharmony_ci    ]
2675f9996aaSopenharmony_ci    if (defined(invoker.img_public_key)) {
2685f9996aaSopenharmony_ci      deps += [ ":pub_key_outer" ]
2695f9996aaSopenharmony_ci    }
2705f9996aaSopenharmony_ci    if (!empty) {
2715f9996aaSopenharmony_ci      deps += [ ":build_image" ]
2725f9996aaSopenharmony_ci    }
2735f9996aaSopenharmony_ci
2745f9996aaSopenharmony_ci    source_dir = "$output_dir/module_package/$img_output_dir"
2755f9996aaSopenharmony_ci    out_dir = "$output_dir/module_package/zip_output"
2765f9996aaSopenharmony_ci
2775f9996aaSopenharmony_ci    sources = get_target_outputs(":module_config_outer")
2785f9996aaSopenharmony_ci    outputs = [ "$out_dir/$package_name.zip" ]
2795f9996aaSopenharmony_ci
2805f9996aaSopenharmony_ci    args = [
2815f9996aaSopenharmony_ci      "-pn",
2825f9996aaSopenharmony_ci      package_name,
2835f9996aaSopenharmony_ci      "-pk",
2845f9996aaSopenharmony_ci      rebase_path(zip_private_key, root_build_dir),
2855f9996aaSopenharmony_ci      "-sc",
2865f9996aaSopenharmony_ci      rebase_path(sign_cert, root_build_dir),
2875f9996aaSopenharmony_ci      rebase_path(source_dir, root_build_dir),
2885f9996aaSopenharmony_ci      rebase_path(out_dir, root_build_dir),
2895f9996aaSopenharmony_ci    ]
2905f9996aaSopenharmony_ci  }
2915f9996aaSopenharmony_ci}
2925f9996aaSopenharmony_ci
2935f9996aaSopenharmony_citemplate("ohos_hmp") {
2945f9996aaSopenharmony_ci  output_dir = "${root_out_dir}/"
2955f9996aaSopenharmony_ci
2965f9996aaSopenharmony_ci  _deps = []
2975f9996aaSopenharmony_ci  module_packages = []
2985f9996aaSopenharmony_ci  if (defined(invoker.module_packages)) {
2995f9996aaSopenharmony_ci    module_packages += invoker.module_packages
3005f9996aaSopenharmony_ci    _deps += module_packages
3015f9996aaSopenharmony_ci  }
3025f9996aaSopenharmony_ci
3035f9996aaSopenharmony_ci  if (defined(invoker.pack_info)) {
3045f9996aaSopenharmony_ci    pack_info = invoker.pack_info
3055f9996aaSopenharmony_ci  }
3065f9996aaSopenharmony_ci
3075f9996aaSopenharmony_ci  assert(module_packages != "")
3085f9996aaSopenharmony_ci  assert(pack_info != "")
3095f9996aaSopenharmony_ci
3105f9996aaSopenharmony_ci  package_name = target_name
3115f9996aaSopenharmony_ci
3125f9996aaSopenharmony_ci  action("build_hmp") {
3135f9996aaSopenharmony_ci    script = "//base/update/packaging_tools/build_hmp.py"
3145f9996aaSopenharmony_ci    deps = _deps
3155f9996aaSopenharmony_ci
3165f9996aaSopenharmony_ci    out_dir = "$output_dir/hmp"
3175f9996aaSopenharmony_ci
3185f9996aaSopenharmony_ci    sources = []
3195f9996aaSopenharmony_ci    foreach(module_package, module_packages) {
3205f9996aaSopenharmony_ci      module_name = get_label_info(module_package, "name")
3215f9996aaSopenharmony_ci      module_out_dir = get_label_info(module_package, "target_out_dir")
3225f9996aaSopenharmony_ci      sources +=
3235f9996aaSopenharmony_ci          [ "$module_out_dir/module_package/zip_output/$module_name.zip" ]
3245f9996aaSopenharmony_ci    }
3255f9996aaSopenharmony_ci
3265f9996aaSopenharmony_ci    outputs = [ "$out_dir/$package_name.zip" ]
3275f9996aaSopenharmony_ci
3285f9996aaSopenharmony_ci    args = [
3295f9996aaSopenharmony_ci      "-pn",
3305f9996aaSopenharmony_ci      package_name,
3315f9996aaSopenharmony_ci      "-op",
3325f9996aaSopenharmony_ci      rebase_path(out_dir, root_build_dir),
3335f9996aaSopenharmony_ci      "-pi",
3345f9996aaSopenharmony_ci      rebase_path(pack_info, root_build_dir),
3355f9996aaSopenharmony_ci      "-mf",
3365f9996aaSopenharmony_ci    ]
3375f9996aaSopenharmony_ci    foreach(source, sources) {
3385f9996aaSopenharmony_ci      source_path = rebase_path(source, root_build_dir)
3395f9996aaSopenharmony_ci      args += [ source_path ]
3405f9996aaSopenharmony_ci    }
3415f9996aaSopenharmony_ci  }
3425f9996aaSopenharmony_ci
3435f9996aaSopenharmony_ci  group(target_name) {
3445f9996aaSopenharmony_ci    deps = [ ":build_hmp" ]
3455f9996aaSopenharmony_ci  }
3465f9996aaSopenharmony_ci}
347