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/components/ets_frontend/es2abc_config.gni")
155f9996aaSopenharmony_ciimport("//build/config/python.gni")
165f9996aaSopenharmony_ciimport("//build/ohos/notice/notice.gni")
175f9996aaSopenharmony_ciimport("//build/templates/common/collect_target.gni")
185f9996aaSopenharmony_ciimport("//build/templates/metadata/module_info.gni")
195f9996aaSopenharmony_ci
205f9996aaSopenharmony_ci# Generate .abc files from .ts files
215f9996aaSopenharmony_ci#
225f9996aaSopenharmony_ci# Variables
235f9996aaSopenharmony_ci#   sources: Paths to .ts file to compile
245f9996aaSopenharmony_ci#
255f9996aaSopenharmony_ci# Example
265f9996aaSopenharmony_ci#   ohos_abc("foo_abc") {
275f9996aaSopenharmony_ci#     sources = [ "example.ts" ]
285f9996aaSopenharmony_ci#     subsystem_name = "example"
295f9996aaSopenharmony_ci#     part_name = "example"
305f9996aaSopenharmony_ci#   }
315f9996aaSopenharmony_citemplate("ohos_abc") {
325f9996aaSopenharmony_ci  assert(defined(invoker.subsystem_name), "subsystem_name is required")
335f9996aaSopenharmony_ci  assert(defined(invoker.part_name), "part_name is required")
345f9996aaSopenharmony_ci
355f9996aaSopenharmony_ci  _test_target = defined(invoker.testonly) && invoker.testonly
365f9996aaSopenharmony_ci  subsystem_name = invoker.subsystem_name
375f9996aaSopenharmony_ci  part_name = invoker.part_name
385f9996aaSopenharmony_ci
395f9996aaSopenharmony_ci  if (is_use_check_deps && !_test_target) {
405f9996aaSopenharmony_ci    _check_target = "${target_name}__check"
415f9996aaSopenharmony_ci    target_path = get_label_info(":${target_name}", "label_no_toolchain")
425f9996aaSopenharmony_ci    check_target(_check_target) {
435f9996aaSopenharmony_ci      module_deps = []
445f9996aaSopenharmony_ci      if (defined(invoker.deps)) {
455f9996aaSopenharmony_ci        module_deps += invoker.deps
465f9996aaSopenharmony_ci      }
475f9996aaSopenharmony_ci      if (defined(invoker.public_deps)) {
485f9996aaSopenharmony_ci        module_deps += invoker.public_deps
495f9996aaSopenharmony_ci      }
505f9996aaSopenharmony_ci      if (defined(invoker.external_deps)) {
515f9996aaSopenharmony_ci        module_ex_deps = invoker.external_deps
525f9996aaSopenharmony_ci      }
535f9996aaSopenharmony_ci    }
545f9996aaSopenharmony_ci  }
555f9996aaSopenharmony_ci
565f9996aaSopenharmony_ci  if (is_standard_system) {
575f9996aaSopenharmony_ci    output_dir = "${root_out_dir}/${subsystem_name}/${part_name}"
585f9996aaSopenharmony_ci  } else {
595f9996aaSopenharmony_ci    output_dir = "${root_out_dir}"
605f9996aaSopenharmony_ci  }
615f9996aaSopenharmony_ci
625f9996aaSopenharmony_ci  target_label = get_label_info(":${target_name}", "label_with_toolchain")
635f9996aaSopenharmony_ci  target_toolchain = get_label_info(target_label, "toolchain")
645f9996aaSopenharmony_ci
655f9996aaSopenharmony_ci  if (target_toolchain == "${current_toolchain}") {
665f9996aaSopenharmony_ci    ohos_abc_target = target_name
675f9996aaSopenharmony_ci    module_info_target = "${target_name}_info"
685f9996aaSopenharmony_ci    generate_module_info(module_info_target) {
695f9996aaSopenharmony_ci      forward_variables_from(invoker, [ "testonly" ])
705f9996aaSopenharmony_ci      module_name = ohos_abc_target
715f9996aaSopenharmony_ci      if (!defined(invoker.module_type)) {
725f9996aaSopenharmony_ci        module_type = "unknown"
735f9996aaSopenharmony_ci      } else {
745f9996aaSopenharmony_ci        module_type = invoker.module_type
755f9996aaSopenharmony_ci      }
765f9996aaSopenharmony_ci      module_source_dir = "$root_out_dir"
775f9996aaSopenharmony_ci      if (defined(output_dir)) {
785f9996aaSopenharmony_ci        module_source_dir = output_dir
795f9996aaSopenharmony_ci      }
805f9996aaSopenharmony_ci
815f9996aaSopenharmony_ci      if (defined(invoker.symlink_target_name)) {
825f9996aaSopenharmony_ci        symlink_target_name = invoker.symlink_target_name
835f9996aaSopenharmony_ci      }
845f9996aaSopenharmony_ci
855f9996aaSopenharmony_ci      module_install_name = "${ohos_abc_target}.abc"
865f9996aaSopenharmony_ci      if (defined(invoker.output_name)) {
875f9996aaSopenharmony_ci        module_install_name = "${invoker.output_name}.abc"
885f9996aaSopenharmony_ci      }
895f9996aaSopenharmony_ci
905f9996aaSopenharmony_ci      module_install_images = [ "system" ]
915f9996aaSopenharmony_ci      if (defined(invoker.install_images)) {
925f9996aaSopenharmony_ci        module_install_images = []
935f9996aaSopenharmony_ci        module_install_images += invoker.install_images
945f9996aaSopenharmony_ci      }
955f9996aaSopenharmony_ci
965f9996aaSopenharmony_ci      module_install_dir = "etc/abc"
975f9996aaSopenharmony_ci      if (defined(invoker.module_install_dir)) {
985f9996aaSopenharmony_ci        module_install_dir = invoker.module_install_dir
995f9996aaSopenharmony_ci      }
1005f9996aaSopenharmony_ci
1015f9996aaSopenharmony_ci      install_enable = true
1025f9996aaSopenharmony_ci      if (defined(invoker.install_enable)) {
1035f9996aaSopenharmony_ci        install_enable = invoker.install_enable
1045f9996aaSopenharmony_ci      }
1055f9996aaSopenharmony_ci
1065f9996aaSopenharmony_ci      if (defined(invoker.relative_install_dir)) {
1075f9996aaSopenharmony_ci        relative_install_dir = invoker.relative_install_dir
1085f9996aaSopenharmony_ci      }
1095f9996aaSopenharmony_ci
1105f9996aaSopenharmony_ci      notice = "$target_out_dir/$ohos_abc_target.notice.txt"
1115f9996aaSopenharmony_ci    }
1125f9996aaSopenharmony_ci  }
1135f9996aaSopenharmony_ci
1145f9996aaSopenharmony_ci  if (!_test_target) {
1155f9996aaSopenharmony_ci    module_label = get_label_info(":${target_name}", "label_with_toolchain")
1165f9996aaSopenharmony_ci    _collect_target = "${target_name}__collect"
1175f9996aaSopenharmony_ci    collect_module_target(_collect_target) {
1185f9996aaSopenharmony_ci      forward_variables_from(invoker, [ "install_images" ])
1195f9996aaSopenharmony_ci    }
1205f9996aaSopenharmony_ci
1215f9996aaSopenharmony_ci    _notice_target = "${target_name}__notice"
1225f9996aaSopenharmony_ci    ohos_abc_target = target_name
1235f9996aaSopenharmony_ci    collect_notice(_notice_target) {
1245f9996aaSopenharmony_ci      forward_variables_from(invoker, [ "testonly" ])
1255f9996aaSopenharmony_ci      if (defined(invoker.license_as_sources)) {
1265f9996aaSopenharmony_ci        license_as_sources = invoker.license_as_sources
1275f9996aaSopenharmony_ci      }
1285f9996aaSopenharmony_ci      if (defined(invoker.license_file)) {
1295f9996aaSopenharmony_ci        license_file = invoker.license_file
1305f9996aaSopenharmony_ci      }
1315f9996aaSopenharmony_ci      module_name = ohos_abc_target
1325f9996aaSopenharmony_ci      module_source_dir = get_label_info(":${ohos_abc_target}", "dir")
1335f9996aaSopenharmony_ci    }
1345f9996aaSopenharmony_ci  }
1355f9996aaSopenharmony_ci
1365f9996aaSopenharmony_ci  action_with_pydeps(target_name) {
1375f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "testonly" ])
1385f9996aaSopenharmony_ci    if (!defined(deps)) {
1395f9996aaSopenharmony_ci      deps = []
1405f9996aaSopenharmony_ci    }
1415f9996aaSopenharmony_ci    if (defined(invoker.deps)) {
1425f9996aaSopenharmony_ci      deps += invoker.deps
1435f9996aaSopenharmony_ci    }
1445f9996aaSopenharmony_ci    deps += es2abc_build_deps
1455f9996aaSopenharmony_ci    if (is_use_check_deps && !_test_target) {
1465f9996aaSopenharmony_ci      deps += [ ":$_check_target" ]
1475f9996aaSopenharmony_ci    }
1485f9996aaSopenharmony_ci    if (target_toolchain == "${current_toolchain}") {
1495f9996aaSopenharmony_ci      deps += [ ":$module_info_target" ]
1505f9996aaSopenharmony_ci    }
1515f9996aaSopenharmony_ci    if (!_test_target) {
1525f9996aaSopenharmony_ci      deps += [
1535f9996aaSopenharmony_ci        ":${_collect_target}",
1545f9996aaSopenharmony_ci        ":${_notice_target}",
1555f9996aaSopenharmony_ci      ]
1565f9996aaSopenharmony_ci    }
1575f9996aaSopenharmony_ci
1585f9996aaSopenharmony_ci    if (defined(invoker.output_name)) {
1595f9996aaSopenharmony_ci      output_file = "${output_dir}/${invoker.output_name}.abc"
1605f9996aaSopenharmony_ci    } else {
1615f9996aaSopenharmony_ci      output_file = "${output_dir}/${target_name}.abc"
1625f9996aaSopenharmony_ci    }
1635f9996aaSopenharmony_ci    script = "//build/scripts/ohos_abc.py"
1645f9996aaSopenharmony_ci    sources = invoker.sources
1655f9996aaSopenharmony_ci    args = [
1665f9996aaSopenharmony_ci      "--outputs",
1675f9996aaSopenharmony_ci      rebase_path(output_file),
1685f9996aaSopenharmony_ci      "--es2abc",
1695f9996aaSopenharmony_ci      rebase_path(es2abc_build_path),
1705f9996aaSopenharmony_ci      "--sources",
1715f9996aaSopenharmony_ci    ]
1725f9996aaSopenharmony_ci    args += rebase_path(sources, root_build_dir)
1735f9996aaSopenharmony_ci    if (defined(invoker.merge_abc) && invoker.merge_abc) {
1745f9996aaSopenharmony_ci      args += [ "--merge-abc" ]
1755f9996aaSopenharmony_ci    }
1765f9996aaSopenharmony_ci    if (defined(invoker.disable_module) && invoker.disable_module) {
1775f9996aaSopenharmony_ci      args += [ "--module" ]
1785f9996aaSopenharmony_ci    }
1795f9996aaSopenharmony_ci    outputs = [ output_file ]
1805f9996aaSopenharmony_ci
1815f9996aaSopenharmony_ci    install_module_info = {
1825f9996aaSopenharmony_ci      module_def = target_label
1835f9996aaSopenharmony_ci      module_info_file =
1845f9996aaSopenharmony_ci          rebase_path(get_label_info(module_def, "target_out_dir"),
1855f9996aaSopenharmony_ci                      root_build_dir) + "/${target_name}_module_info.json"
1865f9996aaSopenharmony_ci      toolchain = current_toolchain
1875f9996aaSopenharmony_ci      toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
1885f9996aaSopenharmony_ci      subsystem_name = subsystem_name
1895f9996aaSopenharmony_ci      part_name = part_name
1905f9996aaSopenharmony_ci    }
1915f9996aaSopenharmony_ci    metadata = {
1925f9996aaSopenharmony_ci      install_modules = [ install_module_info ]
1935f9996aaSopenharmony_ci    }
1945f9996aaSopenharmony_ci  }
1955f9996aaSopenharmony_ci}
196