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/build_var.gni")
165f9996aaSopenharmony_ciimport("//build/ohos_var.gni")
175f9996aaSopenharmony_ci
185f9996aaSopenharmony_ci# sa info config file template
195f9996aaSopenharmony_ci# support for configuring multiple files.
205f9996aaSopenharmony_citemplate("ohos_sa_profile") {
215f9996aaSopenharmony_ci  assert(defined(invoker.sources))
225f9996aaSopenharmony_ci  assert(defined(invoker.subsystem_name) || defined(invoker.part_name))
235f9996aaSopenharmony_ci
245f9996aaSopenharmony_ci  if (defined(invoker.part_name)) {
255f9996aaSopenharmony_ci    part_name = invoker.part_name
265f9996aaSopenharmony_ci  } else {
275f9996aaSopenharmony_ci    part_name = invoker.subsystem_name
285f9996aaSopenharmony_ci  }
295f9996aaSopenharmony_ci
305f9996aaSopenharmony_ci  inputs_output_dir = "${root_out_dir}/sa_profile/inputs"
315f9996aaSopenharmony_ci
325f9996aaSopenharmony_ci  copy("${target_name}_copy") {
335f9996aaSopenharmony_ci    deps = []
345f9996aaSopenharmony_ci    if (defined(invoker.deps)) {
355f9996aaSopenharmony_ci      deps += invoker.deps
365f9996aaSopenharmony_ci    }
375f9996aaSopenharmony_ci    sources = invoker.sources
385f9996aaSopenharmony_ci    outputs = [ "${target_out_dir}/profiles/{{source_file_part}}" ]
395f9996aaSopenharmony_ci  }
405f9996aaSopenharmony_ci
415f9996aaSopenharmony_ci  action_with_pydeps(target_name) {
425f9996aaSopenharmony_ci    deps = [ ":${target_name}_copy" ]
435f9996aaSopenharmony_ci    _output_dir = "${inputs_output_dir}/${part_name}"
445f9996aaSopenharmony_ci    _output_info_file = "${_output_dir}/${target_name}_info.json"
455f9996aaSopenharmony_ci    sources = get_target_outputs(":${target_name}_copy")
465f9996aaSopenharmony_ci    outputs = [ _output_info_file ]
475f9996aaSopenharmony_ci    script = "//build/ohos/sa_profile/sa_profile.py"
485f9996aaSopenharmony_ci    args = [ "--sa-input-files" ]
495f9996aaSopenharmony_ci    args += rebase_path(sources, root_build_dir)
505f9996aaSopenharmony_ci    args += [
515f9996aaSopenharmony_ci      "--target-label",
525f9996aaSopenharmony_ci      get_label_info(":${target_name}", "label_with_toolchain"),
535f9996aaSopenharmony_ci      "--output-module-info-file",
545f9996aaSopenharmony_ci      rebase_path(_output_info_file, root_build_dir),
555f9996aaSopenharmony_ci      "--part-name",
565f9996aaSopenharmony_ci      part_name,
575f9996aaSopenharmony_ci    ]
585f9996aaSopenharmony_ci    sa_install_info = {
595f9996aaSopenharmony_ci      label = get_label_info(":$target_name", "label_with_toolchain")
605f9996aaSopenharmony_ci      install_info_file = rebase_path(_output_info_file, root_build_dir)
615f9996aaSopenharmony_ci      part_name = part_name
625f9996aaSopenharmony_ci      toolchain = current_toolchain
635f9996aaSopenharmony_ci      type = "sa"
645f9996aaSopenharmony_ci    }
655f9996aaSopenharmony_ci    metadata = {
665f9996aaSopenharmony_ci      sa_install_info = [ sa_install_info ]
675f9996aaSopenharmony_ci    }
685f9996aaSopenharmony_ci  }
695f9996aaSopenharmony_ci
705f9996aaSopenharmony_ci  sources_output = []
715f9996aaSopenharmony_ci  foreach(source, invoker.sources) {
725f9996aaSopenharmony_ci    sources_output +=
735f9996aaSopenharmony_ci        [ rebase_path("${target_out_dir}/profiles/${source}", root_build_dir) ]
745f9996aaSopenharmony_ci  }
755f9996aaSopenharmony_ci  module_label = get_label_info(":${target_name}", "label_with_toolchain")
765f9996aaSopenharmony_ci  target_deps_data = {
775f9996aaSopenharmony_ci    label = module_label
785f9996aaSopenharmony_ci    type = "etc"
795f9996aaSopenharmony_ci    prebuilt = true
805f9996aaSopenharmony_ci    output_path = sources_output
815f9996aaSopenharmony_ci  }
825f9996aaSopenharmony_ci  write_file("${target_out_dir}/${target_name}_deps_data.json",
835f9996aaSopenharmony_ci             target_deps_data,
845f9996aaSopenharmony_ci             "json")
855f9996aaSopenharmony_ci}
865f9996aaSopenharmony_ci
875f9996aaSopenharmony_ci# merge sa profile insall files and generate sa profile install info
885f9996aaSopenharmony_citemplate("ohos_sa_install_info") {
895f9996aaSopenharmony_ci  assert(defined(invoker.system_install_info_file))
905f9996aaSopenharmony_ci  assert(defined(invoker.sa_install_info_file))
915f9996aaSopenharmony_ci  assert(defined(invoker.current_platform))
925f9996aaSopenharmony_ci  assert(defined(invoker.current_platform_dir))
935f9996aaSopenharmony_ci
945f9996aaSopenharmony_ci  forward_variables_from(invoker,
955f9996aaSopenharmony_ci                         [
965f9996aaSopenharmony_ci                           "current_platform",
975f9996aaSopenharmony_ci                           "current_platform_dir",
985f9996aaSopenharmony_ci                           "system_install_info_file",
995f9996aaSopenharmony_ci                           "sa_install_info_file",
1005f9996aaSopenharmony_ci                           "merged_sa_profile_dir",
1015f9996aaSopenharmony_ci                           "merged_sa_profile_zipfile",
1025f9996aaSopenharmony_ci                         ])
1035f9996aaSopenharmony_ci
1045f9996aaSopenharmony_ci  _deps = []
1055f9996aaSopenharmony_ci  if (defined(invoker.deps)) {
1065f9996aaSopenharmony_ci    _deps += invoker.deps
1075f9996aaSopenharmony_ci  }
1085f9996aaSopenharmony_ci  _sa_info_out_dir = "${current_platform_dir}/sa_profile"
1095f9996aaSopenharmony_ci  binary_output_dir = "${_sa_info_out_dir}/binaries"
1105f9996aaSopenharmony_ci
1115f9996aaSopenharmony_ci  sa_profile_install_dir = "profile"
1125f9996aaSopenharmony_ci
1135f9996aaSopenharmony_ci  archive_info_file_name = "sa_modules_info.json"
1145f9996aaSopenharmony_ci  sa_profile_archive_dir = "//${dist_dir_name}/sa_profiles"
1155f9996aaSopenharmony_ci  sa_profile_archive_info_file =
1165f9996aaSopenharmony_ci      "${sa_profile_archive_dir}/${archive_info_file_name}"
1175f9996aaSopenharmony_ci
1185f9996aaSopenharmony_ci  src_sa_install_info_file = "${_sa_info_out_dir}/src_sa_install_info.json"
1195f9996aaSopenharmony_ci
1205f9996aaSopenharmony_ci  action_with_pydeps("sa_profile_src_${current_platform}") {
1215f9996aaSopenharmony_ci    deps = [ "//build/ohos/sa_profile:src_sa_infos_process" ]
1225f9996aaSopenharmony_ci    deps += _deps
1235f9996aaSopenharmony_ci    script = "//build/ohos/sa_profile/sa_profile_source.py"
1245f9996aaSopenharmony_ci    src_sa_infos_file = "${product_output_dir}/src_sa_infos.json"
1255f9996aaSopenharmony_ci    sources = [
1265f9996aaSopenharmony_ci      src_sa_infos_file,
1275f9996aaSopenharmony_ci      system_install_info_file,
1285f9996aaSopenharmony_ci    ]
1295f9996aaSopenharmony_ci    outputs = [ src_sa_install_info_file ]
1305f9996aaSopenharmony_ci    args = [
1315f9996aaSopenharmony_ci      "--src-sa-info-file",
1325f9996aaSopenharmony_ci      rebase_path(src_sa_infos_file, root_build_dir),
1335f9996aaSopenharmony_ci      "--system-install-info-file",
1345f9996aaSopenharmony_ci      rebase_path(system_install_info_file, root_build_dir),
1355f9996aaSopenharmony_ci      "--src-sa-install-info-file",
1365f9996aaSopenharmony_ci      rebase_path(src_sa_install_info_file, root_build_dir),
1375f9996aaSopenharmony_ci    ]
1385f9996aaSopenharmony_ci  }
1395f9996aaSopenharmony_ci
1405f9996aaSopenharmony_ci  _sa_profile_binary_target = "sa_profile_binary_${current_platform}"
1415f9996aaSopenharmony_ci  _binary_sa_output = "${_sa_info_out_dir}/${_sa_profile_binary_target}.zip"
1425f9996aaSopenharmony_ci  action_with_pydeps(_sa_profile_binary_target) {
1435f9996aaSopenharmony_ci    deps = _deps
1445f9996aaSopenharmony_ci    deps += [ ":sa_profile_src_${current_platform}" ]
1455f9996aaSopenharmony_ci    script = "//build/ohos/sa_profile/sa_profile_binary.py"
1465f9996aaSopenharmony_ci    inputs = [ system_install_info_file ]
1475f9996aaSopenharmony_ci    outputs = [ _binary_sa_output ]
1485f9996aaSopenharmony_ci    depfile = "$target_gen_dir/$target_name.d"
1495f9996aaSopenharmony_ci    args = [
1505f9996aaSopenharmony_ci      "--system-install-info-file",
1515f9996aaSopenharmony_ci      rebase_path(system_install_info_file, root_build_dir),
1525f9996aaSopenharmony_ci      "--sa-output-dir",
1535f9996aaSopenharmony_ci      rebase_path(binary_output_dir, root_build_dir),
1545f9996aaSopenharmony_ci      "--sa-output-zipfile",
1555f9996aaSopenharmony_ci      rebase_path(_binary_sa_output, root_build_dir),
1565f9996aaSopenharmony_ci      "--depfile",
1575f9996aaSopenharmony_ci      rebase_path(depfile, root_build_dir),
1585f9996aaSopenharmony_ci    ]
1595f9996aaSopenharmony_ci
1605f9996aaSopenharmony_ci    # Check if sa archive info file exists
1615f9996aaSopenharmony_ci    _file_exists_script = "//build/ohos/file_exists.py"
1625f9996aaSopenharmony_ci    _process_args = [
1635f9996aaSopenharmony_ci      "--filename",
1645f9996aaSopenharmony_ci      rebase_path(sa_profile_archive_info_file, root_build_dir),
1655f9996aaSopenharmony_ci    ]
1665f9996aaSopenharmony_ci    _result = exec_script(_file_exists_script, _process_args, "string")
1675f9996aaSopenharmony_ci    if (_result == "True") {
1685f9996aaSopenharmony_ci      inputs += [ sa_profile_archive_info_file ]
1695f9996aaSopenharmony_ci      args += [
1705f9996aaSopenharmony_ci        "--sa-profile-archive-info-file",
1715f9996aaSopenharmony_ci        rebase_path(sa_profile_archive_info_file, root_build_dir),
1725f9996aaSopenharmony_ci      ]
1735f9996aaSopenharmony_ci    }
1745f9996aaSopenharmony_ci  }
1755f9996aaSopenharmony_ci
1765f9996aaSopenharmony_ci  action_with_pydeps(target_name) {
1775f9996aaSopenharmony_ci    deps = [
1785f9996aaSopenharmony_ci      ":sa_profile_binary_${current_platform}",
1795f9996aaSopenharmony_ci      ":sa_profile_src_${current_platform}",
1805f9996aaSopenharmony_ci    ]
1815f9996aaSopenharmony_ci    script = "//build/ohos/sa_profile/sa_profile_merge.py"
1825f9996aaSopenharmony_ci    sources = [
1835f9996aaSopenharmony_ci      _binary_sa_output,
1845f9996aaSopenharmony_ci      src_sa_install_info_file,
1855f9996aaSopenharmony_ci    ]
1865f9996aaSopenharmony_ci    outputs = [
1875f9996aaSopenharmony_ci      sa_install_info_file,
1885f9996aaSopenharmony_ci      merged_sa_profile_zipfile,
1895f9996aaSopenharmony_ci    ]
1905f9996aaSopenharmony_ci    depfile = "$target_gen_dir/$target_name.d"
1915f9996aaSopenharmony_ci    args = [
1925f9996aaSopenharmony_ci      "--src-sa-install-info-file",
1935f9996aaSopenharmony_ci      rebase_path(src_sa_install_info_file, root_build_dir),
1945f9996aaSopenharmony_ci      "--no-src-sa-install-info-file",
1955f9996aaSopenharmony_ci      rebase_path(_binary_sa_output, root_build_dir),
1965f9996aaSopenharmony_ci      "--sa-output-dir",
1975f9996aaSopenharmony_ci      rebase_path(merged_sa_profile_dir, root_build_dir),
1985f9996aaSopenharmony_ci      "--merged-sa-profile",
1995f9996aaSopenharmony_ci      rebase_path(merged_sa_profile_zipfile, root_build_dir),
2005f9996aaSopenharmony_ci      "--sa-install-info-file",
2015f9996aaSopenharmony_ci      rebase_path(sa_install_info_file, root_build_dir),
2025f9996aaSopenharmony_ci      "--sa-info-install-dest-dir",
2035f9996aaSopenharmony_ci      "${system_base_dir}/${sa_profile_install_dir}",
2045f9996aaSopenharmony_ci      "--target-cpu",
2055f9996aaSopenharmony_ci      target_cpu,
2065f9996aaSopenharmony_ci      "--depfile",
2075f9996aaSopenharmony_ci      rebase_path(depfile, root_build_dir),
2085f9996aaSopenharmony_ci    ]
2095f9996aaSopenharmony_ci  }
2105f9996aaSopenharmony_ci}
2115f9996aaSopenharmony_ci
2125f9996aaSopenharmony_citemplate("ohos_sa_info_archive") {
2135f9996aaSopenharmony_ci  archive_info_file_name = "sa_modules_info.json"
2145f9996aaSopenharmony_ci  _deps = [ "//build/ohos/sa_profile:src_sa_infos_process" ]
2155f9996aaSopenharmony_ci  sa_profile_src_infos_file = "${product_output_dir}/src_sa_infos.json"
2165f9996aaSopenharmony_ci
2175f9996aaSopenharmony_ci  action_with_pydeps(target_name) {
2185f9996aaSopenharmony_ci    deps = _deps
2195f9996aaSopenharmony_ci    if (defined(invoker.deps)) {
2205f9996aaSopenharmony_ci      deps += invoker.deps
2215f9996aaSopenharmony_ci    }
2225f9996aaSopenharmony_ci    inputs = [ sa_profile_src_infos_file ]
2235f9996aaSopenharmony_ci    depfile = "$target_gen_dir/$target_name.d"
2245f9996aaSopenharmony_ci    sa_archive_output_dir = "${dist_build_out_dir}/sa_profiles"
2255f9996aaSopenharmony_ci    sa_archive_info_file = "${sa_archive_output_dir}/${archive_info_file_name}"
2265f9996aaSopenharmony_ci    outputs = [
2275f9996aaSopenharmony_ci      sa_archive_info_file,
2285f9996aaSopenharmony_ci      sa_archive_output_dir,
2295f9996aaSopenharmony_ci    ]
2305f9996aaSopenharmony_ci    script = "//build/ohos/sa_profile/sa_profile_archive.py"
2315f9996aaSopenharmony_ci    args = [
2325f9996aaSopenharmony_ci      "--src-sa-install-info-file",
2335f9996aaSopenharmony_ci      rebase_path(sa_profile_src_infos_file, root_build_dir),
2345f9996aaSopenharmony_ci      "--sa-archive-output-dir",
2355f9996aaSopenharmony_ci      rebase_path(sa_archive_output_dir, root_build_dir),
2365f9996aaSopenharmony_ci      "--sa-archive-info-file",
2375f9996aaSopenharmony_ci      rebase_path(sa_archive_info_file, root_build_dir),
2385f9996aaSopenharmony_ci      "--depfile",
2395f9996aaSopenharmony_ci      rebase_path(depfile, root_build_dir),
2405f9996aaSopenharmony_ci    ]
2415f9996aaSopenharmony_ci  }
2425f9996aaSopenharmony_ci}
243