15f9996aaSopenharmony_ci# Copyright (c) 2021 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/kits/kits_check.gni")
165f9996aaSopenharmony_ciimport("//build/ohos_var.gni")
175f9996aaSopenharmony_ci
185f9996aaSopenharmony_ci# Defines subsystem_sdk
195f9996aaSopenharmony_ci#
205f9996aaSopenharmony_ci# example:
215f9996aaSopenharmony_ci#
225f9996aaSopenharmony_ci# subsystem_sdk("examples_sdk") {
235f9996aaSopenharmony_ci#   sdk_libs = [
245f9996aaSopenharmony_ci#     {
255f9996aaSopenharmony_ci#       type = "so"
265f9996aaSopenharmony_ci#       name = "interfaces/innerkits/{module_name}:{module_name}"
275f9996aaSopenharmony_ci#       header = {
285f9996aaSopenharmony_ci#         header_files = [
295f9996aaSopenharmony_ci#           "calculator.h",
305f9996aaSopenharmony_ci#           "abc/a.h",
315f9996aaSopenharmony_ci#           "abc/xyz/b.h"
325f9996aaSopenharmony_ci#         ]
335f9996aaSopenharmony_ci#         header_base = "interfaces/innerkits/{module_name}/include/"
345f9996aaSopenharmony_ci#       }
355f9996aaSopenharmony_ci#     },
365f9996aaSopenharmony_ci#     {
375f9996aaSopenharmony_ci#       type = "jar"
385f9996aaSopenharmony_ci#       name = "interfaces/innerkits/{module_name}:{module_name}"
395f9996aaSopenharmony_ci#       header = {
405f9996aaSopenharmony_ci#         header_files = []
415f9996aaSopenharmony_ci#       }
425f9996aaSopenharmony_ci#     },
435f9996aaSopenharmony_ci#   ]
445f9996aaSopenharmony_ci#   subsystem_name = "subsystem_examples"
455f9996aaSopenharmony_ci# }
465f9996aaSopenharmony_ci
475f9996aaSopenharmony_cideclare_args() {
485f9996aaSopenharmony_ci  check_innerkits_path = ""
495f9996aaSopenharmony_ci}
505f9996aaSopenharmony_ci
515f9996aaSopenharmony_citemplate("_ohos_subsystem_sdk") {
525f9996aaSopenharmony_ci  assert(defined(invoker.sdk_libs), "sdk_libs is required.")
535f9996aaSopenharmony_ci  assert(invoker.variant != "")
545f9996aaSopenharmony_ci  assert(invoker.origin_name != "")
555f9996aaSopenharmony_ci
565f9996aaSopenharmony_ci  part_name = "build_framework"
575f9996aaSopenharmony_ci  if (defined(invoker.part_name)) {
585f9996aaSopenharmony_ci    part_name = invoker.part_name
595f9996aaSopenharmony_ci  }
605f9996aaSopenharmony_ci  if (defined(invoker.subsystem_name)) {
615f9996aaSopenharmony_ci    subsystem_name = invoker.subsystem_name
625f9996aaSopenharmony_ci  } else {
635f9996aaSopenharmony_ci    subsystem_name = part_name
645f9996aaSopenharmony_ci  }
655f9996aaSopenharmony_ci
665f9996aaSopenharmony_ci  sdk_manifest = []
675f9996aaSopenharmony_ci  _deps = []
685f9996aaSopenharmony_ci  _libs_deps = []
695f9996aaSopenharmony_ci  if (invoker.sdk_libs != [] && check_innerkits_path != "") {
705f9996aaSopenharmony_ci    allow_list_info = read_file(rebase_path(check_innerkits_path), "json")
715f9996aaSopenharmony_ci  }
725f9996aaSopenharmony_ci  foreach(sdk_lib, invoker.sdk_libs) {
735f9996aaSopenharmony_ci    no_toolchain_deps_label = get_label_info(sdk_lib.name, "label_no_toolchain")
745f9996aaSopenharmony_ci    if (check_innerkits_path == "" ||
755f9996aaSopenharmony_ci        filter_include(allow_list_info.allow_list_name,
765f9996aaSopenharmony_ci                       [ no_toolchain_deps_label ]) != []) {
775f9996aaSopenharmony_ci      lib_label = get_label_info(sdk_lib.name, "label_with_toolchain")
785f9996aaSopenharmony_ci      _libs_deps += [ lib_label ]
795f9996aaSopenharmony_ci
805f9996aaSopenharmony_ci      lib_type = "so"
815f9996aaSopenharmony_ci      if (defined(sdk_lib.type)) {
825f9996aaSopenharmony_ci        lib_type = sdk_lib.type
835f9996aaSopenharmony_ci      }
845f9996aaSopenharmony_ci
855f9996aaSopenharmony_ci      module_out_dir = get_label_info(lib_label, "target_out_dir")
865f9996aaSopenharmony_ci      module_name = get_label_info(lib_label, "name")
875f9996aaSopenharmony_ci      module_info_file = "${module_out_dir}/${module_name}_module_info.json"
885f9996aaSopenharmony_ci
895f9996aaSopenharmony_ci      lib_header_files = []
905f9996aaSopenharmony_ci      lib_header_base = "interfaces/innerkits/${module_name}/include/"
915f9996aaSopenharmony_ci
925f9996aaSopenharmony_ci      if (defined(sdk_lib.headers)) {
935f9996aaSopenharmony_ci        if (defined(sdk_lib.header_base)) {
945f9996aaSopenharmony_ci          lib_header_base = sdk_lib.header_base
955f9996aaSopenharmony_ci        }
965f9996aaSopenharmony_ci        foreach(file, sdk_lib.headers) {
975f9996aaSopenharmony_ci          lib_header_files += [ string_replace(file, lib_header_base, "") ]
985f9996aaSopenharmony_ci        }
995f9996aaSopenharmony_ci      } else if (defined(sdk_lib.header)) {
1005f9996aaSopenharmony_ci        header = {
1015f9996aaSopenharmony_ci        }
1025f9996aaSopenharmony_ci        header = sdk_lib.header
1035f9996aaSopenharmony_ci        if (defined(header.header_base)) {
1045f9996aaSopenharmony_ci          lib_header_base = header.header_base
1055f9996aaSopenharmony_ci        }
1065f9996aaSopenharmony_ci        lib_header_files = header.header_files
1075f9996aaSopenharmony_ci      }
1085f9996aaSopenharmony_ci
1095f9996aaSopenharmony_ci      lib_prebuilt_enable = false
1105f9996aaSopenharmony_ci      lib_prebuilt_source = ""
1115f9996aaSopenharmony_ci      if (defined(sdk_lib.prebuilt_source)) {
1125f9996aaSopenharmony_ci        lib_prebuilt_enable = true
1135f9996aaSopenharmony_ci        lib_prebuilt_source = sdk_lib.prebuilt_source
1145f9996aaSopenharmony_ci      }
1155f9996aaSopenharmony_ci
1165f9996aaSopenharmony_ci      sdk_manifest += [
1175f9996aaSopenharmony_ci        {
1185f9996aaSopenharmony_ci          label = lib_label
1195f9996aaSopenharmony_ci          name = module_name
1205f9996aaSopenharmony_ci          type = lib_type
1215f9996aaSopenharmony_ci          header_files = lib_header_files
1225f9996aaSopenharmony_ci          header_base = rebase_path(lib_header_base, "$root_build_dir")
1235f9996aaSopenharmony_ci          source_info = rebase_path(module_info_file, "$root_build_dir")
1245f9996aaSopenharmony_ci          prebuilt_enable = lib_prebuilt_enable
1255f9996aaSopenharmony_ci          prebuilt_source = lib_prebuilt_source
1265f9996aaSopenharmony_ci          subsystem_name = subsystem_name
1275f9996aaSopenharmony_ci          part_name = part_name
1285f9996aaSopenharmony_ci          origin_name = invoker.origin_name
1295f9996aaSopenharmony_ci          current_toolchain = current_toolchain
1305f9996aaSopenharmony_ci          current_toolchain_dir = rebase_path(root_out_dir, root_build_dir)
1315f9996aaSopenharmony_ci        },
1325f9996aaSopenharmony_ci      ]
1335f9996aaSopenharmony_ci    }
1345f9996aaSopenharmony_ci  }
1355f9996aaSopenharmony_ci  _deps += _libs_deps
1365f9996aaSopenharmony_ci
1375f9996aaSopenharmony_ci  if (_deps != []) {
1385f9996aaSopenharmony_ci    not_needed([ "no_toolchain_deps_label" ])
1395f9996aaSopenharmony_ci
1405f9996aaSopenharmony_ci    subsystem_sdk_desc_file =
1415f9996aaSopenharmony_ci        "${target_out_dir}/${subsystem_name}_sdk_desc.json"
1425f9996aaSopenharmony_ci    write_file(subsystem_sdk_desc_file, sdk_manifest, "json")
1435f9996aaSopenharmony_ci
1445f9996aaSopenharmony_ci    if (check_innersdk_interface && !gen_innersdk_interface_signature) {
1455f9996aaSopenharmony_ci      kits_check_remove("${part_name}_innerkit_remove_check_so") {
1465f9996aaSopenharmony_ci        subsystem_name = part_name
1475f9996aaSopenharmony_ci        if (invoker.variant != "phone") {
1485f9996aaSopenharmony_ci          subsystem_name = invoker.origin_name
1495f9996aaSopenharmony_ci        }
1505f9996aaSopenharmony_ci        sign_file_root_dir = "//interface/innersdk/native"
1515f9996aaSopenharmony_ci        sdk_libs_name = []
1525f9996aaSopenharmony_ci        foreach(_sdk_lib, sdk_manifest) {
1535f9996aaSopenharmony_ci          if (_sdk_lib.type == "so") {
1545f9996aaSopenharmony_ci            sdk_libs_name += [ _sdk_lib.name ]
1555f9996aaSopenharmony_ci          }
1565f9996aaSopenharmony_ci        }
1575f9996aaSopenharmony_ci        output_file = "${target_gen_dir}/innerkit_remove_check_so"
1585f9996aaSopenharmony_ci        sdk_type = "so"
1595f9996aaSopenharmony_ci      }
1605f9996aaSopenharmony_ci      _deps += [ ":${part_name}_innerkit_remove_check_so" ]
1615f9996aaSopenharmony_ci    }
1625f9996aaSopenharmony_ci
1635f9996aaSopenharmony_ci    # gen sdk install modules
1645f9996aaSopenharmony_ci    sdk_install_moudles_file =
1655f9996aaSopenharmony_ci        "${target_gen_dir}/${subsystem_name}_sdk_install_modules.json"
1665f9996aaSopenharmony_ci    generated_file("${subsystem_name}_sdk_info") {
1675f9996aaSopenharmony_ci      outputs = [ sdk_install_moudles_file ]
1685f9996aaSopenharmony_ci      data_keys = [ "install_modules" ]
1695f9996aaSopenharmony_ci      output_conversion = "json"
1705f9996aaSopenharmony_ci      deps = _libs_deps
1715f9996aaSopenharmony_ci    }
1725f9996aaSopenharmony_ci
1735f9996aaSopenharmony_ci    sdk_out_dir = "${root_build_dir}/${innersdk_build_out_dir}/"
1745f9996aaSopenharmony_ci    sdk_build_file = "${sdk_out_dir}/${subsystem_name}/BUILD.gn"
1755f9996aaSopenharmony_ci    sdk_info_file = "${sdk_out_dir}/${subsystem_name}/sdk_info.json"
1765f9996aaSopenharmony_ci
1775f9996aaSopenharmony_ci    action_with_pydeps(target_name) {
1785f9996aaSopenharmony_ci      deps = _deps
1795f9996aaSopenharmony_ci      deps += [ ":${subsystem_name}_sdk_info" ]
1805f9996aaSopenharmony_ci      script = "//build/scripts/gen_sdk_build_file.py"
1815f9996aaSopenharmony_ci      sources = [ subsystem_sdk_desc_file ]
1825f9996aaSopenharmony_ci      outputs = [
1835f9996aaSopenharmony_ci        sdk_build_file,
1845f9996aaSopenharmony_ci        sdk_info_file,
1855f9996aaSopenharmony_ci      ]
1865f9996aaSopenharmony_ci      args = [
1875f9996aaSopenharmony_ci        "--input-file",
1885f9996aaSopenharmony_ci        rebase_path(subsystem_sdk_desc_file, root_build_dir),
1895f9996aaSopenharmony_ci        "--sdk-out-dir",
1905f9996aaSopenharmony_ci        rebase_path("${sdk_out_dir}/${subsystem_name}", root_build_dir),
1915f9996aaSopenharmony_ci        "--output-build-file",
1925f9996aaSopenharmony_ci        rebase_path(sdk_build_file, root_build_dir),
1935f9996aaSopenharmony_ci        "--sdk-info-file",
1945f9996aaSopenharmony_ci        rebase_path(sdk_info_file, root_build_dir),
1955f9996aaSopenharmony_ci      ]
1965f9996aaSopenharmony_ci
1975f9996aaSopenharmony_ci      if (check_innersdk_interface && !gen_innersdk_interface_signature) {
1985f9996aaSopenharmony_ci        innersdk_interface_checkfile_dir = "//interface/innersdk/native"
1995f9996aaSopenharmony_ci        args += [
2005f9996aaSopenharmony_ci          "--signature-file-check-dir",
2015f9996aaSopenharmony_ci          rebase_path(innersdk_interface_checkfile_dir, root_build_dir),
2025f9996aaSopenharmony_ci        ]
2035f9996aaSopenharmony_ci      } else if (gen_innersdk_interface_signature) {
2045f9996aaSopenharmony_ci        args += [
2055f9996aaSopenharmony_ci          "--generate-sig",
2065f9996aaSopenharmony_ci          "--signature-file-gen-dir",
2075f9996aaSopenharmony_ci          rebase_path(
2085f9996aaSopenharmony_ci              "${root_build_dir}/innersdk_interface/native/${subsystem_name}",
2095f9996aaSopenharmony_ci              root_build_dir),
2105f9996aaSopenharmony_ci        ]
2115f9996aaSopenharmony_ci      }
2125f9996aaSopenharmony_ci    }
2135f9996aaSopenharmony_ci  } else {
2145f9996aaSopenharmony_ci    group(target_name) {
2155f9996aaSopenharmony_ci      not_needed(invoker, "*")
2165f9996aaSopenharmony_ci      not_needed([
2175f9996aaSopenharmony_ci                   "subsystem_name",
2185f9996aaSopenharmony_ci                   "sdk_manifest",
2195f9996aaSopenharmony_ci                 ])
2205f9996aaSopenharmony_ci    }
2215f9996aaSopenharmony_ci  }
2225f9996aaSopenharmony_ci}
2235f9996aaSopenharmony_ci
2245f9996aaSopenharmony_citemplate("ohos_inner_kits") {
2255f9996aaSopenharmony_ci  _ohos_subsystem_sdk(target_name) {
2265f9996aaSopenharmony_ci    part_name = invoker.part_name
2275f9996aaSopenharmony_ci    sdk_libs = invoker.sdk_libs
2285f9996aaSopenharmony_ci    variant = invoker.variant
2295f9996aaSopenharmony_ci    origin_name = invoker.origin_name
2305f9996aaSopenharmony_ci  }
2315f9996aaSopenharmony_ci}
232