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