15f9996aaSopenharmony_ci# Copyright (c) 2022 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_ci
165f9996aaSopenharmony_ci# Generate .ts or .cpp files from .idl files.
175f9996aaSopenharmony_ci#
185f9996aaSopenharmony_ci# Variables
195f9996aaSopenharmony_ci#   sources: Paths to .idl file to compile, one idl target can only handle
205f9996aaSopenharmony_ci#     one idl source file.
215f9996aaSopenharmony_ci#   gen_type: Only support ts and cpp type currently
225f9996aaSopenharmony_ci#       "ts": generate ts interface files
235f9996aaSopenharmony_ci#       "cpp": generate cpp interface files
245f9996aaSopenharmony_ci#
255f9996aaSopenharmony_ci# Example
265f9996aaSopenharmony_ci#   ohos_idl("foo_idl") {
275f9996aaSopenharmony_ci#       gen_type = "cpp"
285f9996aaSopenharmony_ci#       sources = [
295f9996aaSopenharmony_ci#         "cpp/bar/FooBarServiceCallback.idl",
305f9996aaSopenharmony_ci#       ]
315f9996aaSopenharmony_ci#   }
325f9996aaSopenharmony_citemplate("ohos_idl") {
335f9996aaSopenharmony_ci  forward_variables_from(invoker, [ "testonly" ])
345f9996aaSopenharmony_ci  assert(defined(invoker.sources), "sources are necessary")
355f9996aaSopenharmony_ci  _idl_target = "//foundation/ability/idl_tool:idl($host_toolchain)"
365f9996aaSopenharmony_ci  _idl_module_info_target =
375f9996aaSopenharmony_ci      get_label_info("$_idl_target", "label_no_toolchain") +
385f9996aaSopenharmony_ci      "_info($host_toolchain)"
395f9996aaSopenharmony_ci  _idl_module_info =
405f9996aaSopenharmony_ci      get_label_info("$_idl_module_info_target", "target_out_dir") + "/" +
415f9996aaSopenharmony_ci      get_label_info("$_idl_target", "name") + "_module_info.json"
425f9996aaSopenharmony_ci  _rebased_idl_module_info = rebase_path("$_idl_module_info", root_build_dir)
435f9996aaSopenharmony_ci
445f9996aaSopenharmony_ci  _libcxx_target = "//build/common/musl:musl-libcxx.so($host_toolchain)"
455f9996aaSopenharmony_ci  _libcxx_module_info_target =
465f9996aaSopenharmony_ci      get_label_info("$_libcxx_target", "label_no_toolchain") +
475f9996aaSopenharmony_ci      "_info($host_toolchain)"
485f9996aaSopenharmony_ci  _libcxx_module_info =
495f9996aaSopenharmony_ci      get_label_info("$_libcxx_module_info_target", "target_out_dir") + "/" +
505f9996aaSopenharmony_ci      get_label_info("$_libcxx_target", "name") + "_module_info.json"
515f9996aaSopenharmony_ci  _rebased_libcxx_module_info =
525f9996aaSopenharmony_ci      rebase_path("$_libcxx_module_info", root_build_dir)
535f9996aaSopenharmony_ci  forward_variables_from(invoker, [ "gen_type" ])
545f9996aaSopenharmony_ci  assert(defined(gen_type),
555f9996aaSopenharmony_ci         "need define gen_type to point which type files should be generated")
565f9996aaSopenharmony_ci
575f9996aaSopenharmony_ci  if (gen_type == "cpp") {
585f9996aaSopenharmony_ci    _idl_include_target_name = "${target_name}__inculde"
595f9996aaSopenharmony_ci    config(_idl_include_target_name) {
605f9996aaSopenharmony_ci      include_dirs = [ target_gen_dir ]
615f9996aaSopenharmony_ci    }
625f9996aaSopenharmony_ci  }
635f9996aaSopenharmony_ci
645f9996aaSopenharmony_ci  action_with_pydeps(target_name) {
655f9996aaSopenharmony_ci    script = "//build/scripts/idl.py"
665f9996aaSopenharmony_ci    sources = invoker.sources
675f9996aaSopenharmony_ci    args = [
685f9996aaSopenharmony_ci      "--idl-path",
695f9996aaSopenharmony_ci      "@FileArg($_rebased_idl_module_info:source)",
705f9996aaSopenharmony_ci      "--libcxx-path",
715f9996aaSopenharmony_ci      "@FileArg($_rebased_libcxx_module_info:source)",
725f9996aaSopenharmony_ci    ]
735f9996aaSopenharmony_ci    deps = [
745f9996aaSopenharmony_ci      "${_idl_module_info_target}",
755f9996aaSopenharmony_ci      "${_idl_target}",
765f9996aaSopenharmony_ci      "${_libcxx_module_info_target}",
775f9996aaSopenharmony_ci      "${_libcxx_target}",
785f9996aaSopenharmony_ci    ]
795f9996aaSopenharmony_ci    if (defined(invoker.deps)) {
805f9996aaSopenharmony_ci      deps += invoker.deps
815f9996aaSopenharmony_ci    }
825f9996aaSopenharmony_ci    _output_archive = "${target_gen_dir}/${target_name}.zip"
835f9996aaSopenharmony_ci    if (gen_type == "cpp") {
845f9996aaSopenharmony_ci      public_configs = [ ":$_idl_include_target_name" ]
855f9996aaSopenharmony_ci    }
865f9996aaSopenharmony_ci    args += [
875f9996aaSopenharmony_ci      "--gen-type",
885f9996aaSopenharmony_ci      gen_type,
895f9996aaSopenharmony_ci      "--output-archive-path",
905f9996aaSopenharmony_ci      rebase_path(_output_archive, root_build_dir),
915f9996aaSopenharmony_ci      "--generated-src-directory",
925f9996aaSopenharmony_ci      rebase_path(target_gen_dir + "/$target_name", root_build_dir),
935f9996aaSopenharmony_ci    ]
945f9996aaSopenharmony_ci    args += rebase_path(sources, root_build_dir)
955f9996aaSopenharmony_ci    outputs = [ _output_archive ]
965f9996aaSopenharmony_ci  }
975f9996aaSopenharmony_ci}
98