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/clang/clang.gni")
155f9996aaSopenharmony_ciimport("//build/config/python.gni")
165f9996aaSopenharmony_ciimport("//build/ohos/kernel/kernel.gni")
175f9996aaSopenharmony_ciimport("//build/ohos/notice/notice.gni")
185f9996aaSopenharmony_ciimport("//build/templates/bpf/ohos_bpf_config.gni")
195f9996aaSopenharmony_ciimport("//build/templates/common/collect_target.gni")
205f9996aaSopenharmony_ciimport("//build/templates/metadata/module_info.gni")
215f9996aaSopenharmony_ci
225f9996aaSopenharmony_ci# Generate .o files from .c files
235f9996aaSopenharmony_ci#
245f9996aaSopenharmony_ci# Variables
255f9996aaSopenharmony_ci#   sources: Paths to .c file to compile, one bpf target can only handle
265f9996aaSopenharmony_ci#     one .c source file.
275f9996aaSopenharmony_ci#
285f9996aaSopenharmony_ci# Example
295f9996aaSopenharmony_ci#   ohos_bpf("foo_bpf") {
305f9996aaSopenharmony_ci#     sources = [
315f9996aaSopenharmony_ci#       "xxx.c",
325f9996aaSopenharmony_ci#     ]
335f9996aaSopenharmony_ci#     subsystem_name = "xxx"
345f9996aaSopenharmony_ci#     part_name = "xxx"
355f9996aaSopenharmony_ci#   }
365f9996aaSopenharmony_citemplate("ohos_bpf") {
375f9996aaSopenharmony_ci  forward_variables_from(invoker, [ "testonly" ])
385f9996aaSopenharmony_ci  assert(defined(invoker.sources), "sources are necessary")
395f9996aaSopenharmony_ci
405f9996aaSopenharmony_ci  subsystem_name = invoker.subsystem_name
415f9996aaSopenharmony_ci  part_name = invoker.part_name
425f9996aaSopenharmony_ci  assert(subsystem_name != "")
435f9996aaSopenharmony_ci  assert(part_name != "")
445f9996aaSopenharmony_ci  _clang = "${clang_base_path}/bin/clang"
455f9996aaSopenharmony_ci  _base_dir =
465f9996aaSopenharmony_ci      get_label_info("//build/templates/bpf:gen_bpf_uapi", "target_out_dir")
475f9996aaSopenharmony_ci  _include_dirs = [
485f9996aaSopenharmony_ci    "${_base_dir}/${bpf_inc_out_dir}/usr/include",
495f9996aaSopenharmony_ci    "${_base_dir}/${bpf_inc_out_dir}",
505f9996aaSopenharmony_ci  ]
515f9996aaSopenharmony_ci  if (defined(invoker.include_dirs)) {
525f9996aaSopenharmony_ci    _include_dirs += invoker.include_dirs
535f9996aaSopenharmony_ci  }
545f9996aaSopenharmony_ci  _src_name = get_path_info(invoker.sources, "name")
555f9996aaSopenharmony_ci  _output_file = "${target_out_dir}/${_src_name[0]}.o"
565f9996aaSopenharmony_ci
575f9996aaSopenharmony_ci  ohos_module_name = target_name
585f9996aaSopenharmony_ci  _module_info_target = "${target_name}_info"
595f9996aaSopenharmony_ci  generate_module_info(_module_info_target) {
605f9996aaSopenharmony_ci    forward_variables_from(invoker,
615f9996aaSopenharmony_ci                           [
625f9996aaSopenharmony_ci                             "module_install_dir",
635f9996aaSopenharmony_ci                             "relative_install_dir",
645f9996aaSopenharmony_ci                             "module_source_dir",
655f9996aaSopenharmony_ci                             "module_install_name",
665f9996aaSopenharmony_ci                             "module_type",
675f9996aaSopenharmony_ci                             "install_enable",
685f9996aaSopenharmony_ci                           ])
695f9996aaSopenharmony_ci    module_name = ohos_module_name
705f9996aaSopenharmony_ci    if (!defined(module_type)) {
715f9996aaSopenharmony_ci      module_type = "unknown"
725f9996aaSopenharmony_ci    }
735f9996aaSopenharmony_ci
745f9996aaSopenharmony_ci    if (!defined(module_source_dir)) {
755f9996aaSopenharmony_ci      module_source_dir = "${target_out_dir}"
765f9996aaSopenharmony_ci    }
775f9996aaSopenharmony_ci
785f9996aaSopenharmony_ci    module_install_images = [ "system" ]
795f9996aaSopenharmony_ci    if (defined(invoker.install_images)) {
805f9996aaSopenharmony_ci      module_install_images = []
815f9996aaSopenharmony_ci      module_install_images += invoker.install_images
825f9996aaSopenharmony_ci    }
835f9996aaSopenharmony_ci
845f9996aaSopenharmony_ci    module_install_name = "${_src_name[0]}.o"
855f9996aaSopenharmony_ci    if (defined(invoker.output_name)) {
865f9996aaSopenharmony_ci      module_install_name = invoker.output_name
875f9996aaSopenharmony_ci    }
885f9996aaSopenharmony_ci
895f9996aaSopenharmony_ci    if (defined(invoker.install_enable)) {
905f9996aaSopenharmony_ci      install_enable = invoker.install_enable
915f9996aaSopenharmony_ci    }
925f9996aaSopenharmony_ci
935f9996aaSopenharmony_ci    module_install_dir = "etc/bpf"
945f9996aaSopenharmony_ci    if (defined(invoker.module_install_dir)) {
955f9996aaSopenharmony_ci      module_install_dir = invoker.module_install_dir
965f9996aaSopenharmony_ci    }
975f9996aaSopenharmony_ci
985f9996aaSopenharmony_ci    if (defined(invoker.relative_install_dir)) {
995f9996aaSopenharmony_ci      relative_install_dir = invoker.relative_install_dir
1005f9996aaSopenharmony_ci    }
1015f9996aaSopenharmony_ci
1025f9996aaSopenharmony_ci    if (defined(invoker.symlink_target_name)) {
1035f9996aaSopenharmony_ci      symlink_target_name = invoker.symlink_target_name
1045f9996aaSopenharmony_ci    }
1055f9996aaSopenharmony_ci    notice = "$target_out_dir/$ohos_module_name.notice.txt"
1065f9996aaSopenharmony_ci  }
1075f9996aaSopenharmony_ci
1085f9996aaSopenharmony_ci  module_label = get_label_info(":${target_name}", "label_with_toolchain")
1095f9996aaSopenharmony_ci  _collect_target = "${target_name}__collect"
1105f9996aaSopenharmony_ci  collect_module_target(_collect_target) {
1115f9996aaSopenharmony_ci    forward_variables_from(invoker, [ "install_images" ])
1125f9996aaSopenharmony_ci  }
1135f9996aaSopenharmony_ci
1145f9996aaSopenharmony_ci  _notice_target = "${target_name}__notice"
1155f9996aaSopenharmony_ci  _main_target_name = target_name
1165f9996aaSopenharmony_ci  collect_notice(_notice_target) {
1175f9996aaSopenharmony_ci    forward_variables_from(invoker,
1185f9996aaSopenharmony_ci                           [
1195f9996aaSopenharmony_ci                             "testonly",
1205f9996aaSopenharmony_ci                             "license_as_sources",
1215f9996aaSopenharmony_ci                             "license_file",
1225f9996aaSopenharmony_ci                           ])
1235f9996aaSopenharmony_ci
1245f9996aaSopenharmony_ci    module_name = _main_target_name
1255f9996aaSopenharmony_ci    module_source_dir = get_label_info(":${_main_target_name}", "dir")
1265f9996aaSopenharmony_ci  }
1275f9996aaSopenharmony_ci
1285f9996aaSopenharmony_ci  target_label = get_label_info(":${target_name}", "label_with_toolchain")
1295f9996aaSopenharmony_ci  action_with_pydeps(target_name) {
1305f9996aaSopenharmony_ci    script = "//build/scripts/bpf.py"
1315f9996aaSopenharmony_ci    sources = invoker.sources
1325f9996aaSopenharmony_ci    args = [
1335f9996aaSopenharmony_ci      "--clang-path",
1345f9996aaSopenharmony_ci      rebase_path(_clang, root_build_dir),
1355f9996aaSopenharmony_ci      "--output-file",
1365f9996aaSopenharmony_ci      rebase_path(_output_file, root_build_dir),
1375f9996aaSopenharmony_ci      "--include-dirs",
1385f9996aaSopenharmony_ci    ]
1395f9996aaSopenharmony_ci    args += rebase_path(_include_dirs, root_build_dir)
1405f9996aaSopenharmony_ci    args += [ "--input-file" ]
1415f9996aaSopenharmony_ci    args += rebase_path(sources, root_build_dir)
1425f9996aaSopenharmony_ci    if (defined(invoker.defines)) {
1435f9996aaSopenharmony_ci      args += [ "--defines" ]
1445f9996aaSopenharmony_ci      args += invoker.defines
1455f9996aaSopenharmony_ci    }
1465f9996aaSopenharmony_ci    deps = [
1475f9996aaSopenharmony_ci      ":$_module_info_target",
1485f9996aaSopenharmony_ci      ":$_notice_target",
1495f9996aaSopenharmony_ci      ":${_collect_target}",
1505f9996aaSopenharmony_ci      "//build/templates/bpf:gen_bpf_uapi",
1515f9996aaSopenharmony_ci    ]
1525f9996aaSopenharmony_ci    if (defined(invoker.deps)) {
1535f9996aaSopenharmony_ci      deps += invoker.deps
1545f9996aaSopenharmony_ci    }
1555f9996aaSopenharmony_ci    outputs = [ _output_file ]
1565f9996aaSopenharmony_ci
1575f9996aaSopenharmony_ci    install_module_info = {
1585f9996aaSopenharmony_ci      module_def = target_label
1595f9996aaSopenharmony_ci      part_name = part_name
1605f9996aaSopenharmony_ci      module_info_file =
1615f9996aaSopenharmony_ci          rebase_path(get_label_info(module_def, "target_out_dir"),
1625f9996aaSopenharmony_ci                      root_build_dir) + "/${target_name}_module_info.json"
1635f9996aaSopenharmony_ci      subsystem_name = subsystem_name
1645f9996aaSopenharmony_ci      part_name = part_name
1655f9996aaSopenharmony_ci      toolchain = current_toolchain
1665f9996aaSopenharmony_ci      toolchain_out_dir = rebase_path(root_out_dir, root_build_dir)
1675f9996aaSopenharmony_ci    }
1685f9996aaSopenharmony_ci    metadata = {
1695f9996aaSopenharmony_ci      install_modules = [ install_module_info ]
1705f9996aaSopenharmony_ci    }
1715f9996aaSopenharmony_ci  }
1725f9996aaSopenharmony_ci}
173