xref: /aosp_15_r20/build/bazel/rules/bpf/bpf.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 The Android Open Source Project
2*7594170eSAndroid Build Coastguard Worker#
3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*7594170eSAndroid Build Coastguard Worker#
7*7594170eSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*7594170eSAndroid Build Coastguard Worker#
9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*7594170eSAndroid Build Coastguard Worker# limitations under the License.
14*7594170eSAndroid Build Coastguard Worker
15*7594170eSAndroid Build Coastguard Workerload("@bazel_skylib//lib:paths.bzl", "paths")
16*7594170eSAndroid Build Coastguard Workerload("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
17*7594170eSAndroid Build Coastguard Worker
18*7594170eSAndroid Build Coastguard Workerdef _get_clang_cmd_output(ctx):
19*7594170eSAndroid Build Coastguard Worker    copts = [
20*7594170eSAndroid Build Coastguard Worker        "--target=bpf",
21*7594170eSAndroid Build Coastguard Worker        "-nostdlibinc",
22*7594170eSAndroid Build Coastguard Worker        "-no-canonical-prefixes",
23*7594170eSAndroid Build Coastguard Worker        "-O2",
24*7594170eSAndroid Build Coastguard Worker    ]
25*7594170eSAndroid Build Coastguard Worker    copts.extend(ctx.attr.copts)
26*7594170eSAndroid Build Coastguard Worker    if ctx.attr.btf:
27*7594170eSAndroid Build Coastguard Worker        copts.append("-g")
28*7594170eSAndroid Build Coastguard Worker
29*7594170eSAndroid Build Coastguard Worker    includes = [
30*7594170eSAndroid Build Coastguard Worker        "packages/modules/Connectivity/staticlibs/native/bpf_headers/include/bpf",
31*7594170eSAndroid Build Coastguard Worker        # TODO(b/149785767): only give access to specific file with AID_* constants
32*7594170eSAndroid Build Coastguard Worker        "system/core/libcutils/include",
33*7594170eSAndroid Build Coastguard Worker        "external/musl/src/env",
34*7594170eSAndroid Build Coastguard Worker        ctx.label.package,
35*7594170eSAndroid Build Coastguard Worker    ]
36*7594170eSAndroid Build Coastguard Worker    includes.extend(ctx.attr.absolute_includes)
37*7594170eSAndroid Build Coastguard Worker
38*7594170eSAndroid Build Coastguard Worker    system_includes = [
39*7594170eSAndroid Build Coastguard Worker        "bionic/libc/include",
40*7594170eSAndroid Build Coastguard Worker        "bionic/libc/kernel/uapi",
41*7594170eSAndroid Build Coastguard Worker        # The architecture doesn't matter here, but asm/types.h is included by linux/types.h.
42*7594170eSAndroid Build Coastguard Worker        "bionic/libc/kernel/uapi/asm-arm64",
43*7594170eSAndroid Build Coastguard Worker        "bionic/libc/kernel/android/uapi",
44*7594170eSAndroid Build Coastguard Worker    ]
45*7594170eSAndroid Build Coastguard Worker
46*7594170eSAndroid Build Coastguard Worker    toolchain = find_cpp_toolchain(ctx)
47*7594170eSAndroid Build Coastguard Worker    extra_features = [
48*7594170eSAndroid Build Coastguard Worker        "dependency_file",
49*7594170eSAndroid Build Coastguard Worker        "bpf_compiler_flags",
50*7594170eSAndroid Build Coastguard Worker    ]
51*7594170eSAndroid Build Coastguard Worker    extra_disabled_features = [
52*7594170eSAndroid Build Coastguard Worker        "sdk_version_flag",
53*7594170eSAndroid Build Coastguard Worker        "pie",
54*7594170eSAndroid Build Coastguard Worker        "non_external_compiler_flags",
55*7594170eSAndroid Build Coastguard Worker        "common_compiler_flags",
56*7594170eSAndroid Build Coastguard Worker        "asm_compiler_flags",
57*7594170eSAndroid Build Coastguard Worker        "cpp_compiler_flags",
58*7594170eSAndroid Build Coastguard Worker        "c_compiler_flags",
59*7594170eSAndroid Build Coastguard Worker        "external_compiler_flags",
60*7594170eSAndroid Build Coastguard Worker        "arm_isa_arm",
61*7594170eSAndroid Build Coastguard Worker        "arm_isa_thumb",
62*7594170eSAndroid Build Coastguard Worker        "no_override_clang_global_copts",
63*7594170eSAndroid Build Coastguard Worker    ]
64*7594170eSAndroid Build Coastguard Worker    feature_configuration = cc_common.configure_features(
65*7594170eSAndroid Build Coastguard Worker        ctx = ctx,
66*7594170eSAndroid Build Coastguard Worker        cc_toolchain = toolchain,
67*7594170eSAndroid Build Coastguard Worker        requested_features = ctx.features + extra_features,
68*7594170eSAndroid Build Coastguard Worker        unsupported_features = ctx.disabled_features + extra_disabled_features,
69*7594170eSAndroid Build Coastguard Worker    )
70*7594170eSAndroid Build Coastguard Worker
71*7594170eSAndroid Build Coastguard Worker    compilation_context = []
72*7594170eSAndroid Build Coastguard Worker    dir_name = ctx.label.name
73*7594170eSAndroid Build Coastguard Worker    if ctx.attr.btf:
74*7594170eSAndroid Build Coastguard Worker        # If btf is true, intermediate dir ("unstripped") is added when
75*7594170eSAndroid Build Coastguard Worker        # clang command is executed, because ctx.actions.run used in stripped
76*7594170eSAndroid Build Coastguard Worker        # command does not allow the same input and output names.
77*7594170eSAndroid Build Coastguard Worker        # "unstripped" will be removed when strip command is executed.
78*7594170eSAndroid Build Coastguard Worker        dir_name = paths.join("unstripped", dir_name)
79*7594170eSAndroid Build Coastguard Worker    (compilation_context, compilation_outputs) = cc_common.compile(
80*7594170eSAndroid Build Coastguard Worker        name = dir_name,
81*7594170eSAndroid Build Coastguard Worker        actions = ctx.actions,
82*7594170eSAndroid Build Coastguard Worker        feature_configuration = feature_configuration,
83*7594170eSAndroid Build Coastguard Worker        cc_toolchain = toolchain,
84*7594170eSAndroid Build Coastguard Worker        srcs = ctx.files.srcs,
85*7594170eSAndroid Build Coastguard Worker        system_includes = system_includes,
86*7594170eSAndroid Build Coastguard Worker        includes = includes,
87*7594170eSAndroid Build Coastguard Worker        user_compile_flags = copts,
88*7594170eSAndroid Build Coastguard Worker        compilation_contexts = compilation_context,
89*7594170eSAndroid Build Coastguard Worker    )
90*7594170eSAndroid Build Coastguard Worker
91*7594170eSAndroid Build Coastguard Worker    return compilation_outputs.objects
92*7594170eSAndroid Build Coastguard Worker
93*7594170eSAndroid Build Coastguard Workerdef _declare_stripped_cmd_output_file(ctx, src):
94*7594170eSAndroid Build Coastguard Worker    file_path = paths.join("_objs", src.basename, src.basename)
95*7594170eSAndroid Build Coastguard Worker    return ctx.actions.declare_file(file_path)
96*7594170eSAndroid Build Coastguard Worker
97*7594170eSAndroid Build Coastguard Workerdef _get_stripped_cmd_output(ctx, srcs):
98*7594170eSAndroid Build Coastguard Worker    out_files = [_declare_stripped_cmd_output_file(ctx, src) for src in srcs]
99*7594170eSAndroid Build Coastguard Worker
100*7594170eSAndroid Build Coastguard Worker    args = ctx.actions.args()
101*7594170eSAndroid Build Coastguard Worker    args.add("--strip-unneeded")
102*7594170eSAndroid Build Coastguard Worker    args.add("--remove-section=.rel.BTF")
103*7594170eSAndroid Build Coastguard Worker    args.add("--remove-section=.rel.BTF.ext")
104*7594170eSAndroid Build Coastguard Worker    args.add("--remove-section=.BTF.ext")
105*7594170eSAndroid Build Coastguard Worker
106*7594170eSAndroid Build Coastguard Worker    for in_file, out_file in zip(srcs, out_files):
107*7594170eSAndroid Build Coastguard Worker        ctx.actions.run(
108*7594170eSAndroid Build Coastguard Worker            inputs = [in_file],
109*7594170eSAndroid Build Coastguard Worker            outputs = [out_file],
110*7594170eSAndroid Build Coastguard Worker            executable = ctx.executable._strip,
111*7594170eSAndroid Build Coastguard Worker            arguments = [args] + [in_file.path, "-o", out_file.path],
112*7594170eSAndroid Build Coastguard Worker        )
113*7594170eSAndroid Build Coastguard Worker
114*7594170eSAndroid Build Coastguard Worker    return out_files
115*7594170eSAndroid Build Coastguard Worker
116*7594170eSAndroid Build Coastguard Workerdef _bpf_impl(ctx):
117*7594170eSAndroid Build Coastguard Worker    for src in ctx.files.srcs:
118*7594170eSAndroid Build Coastguard Worker        if "_" in src.basename:
119*7594170eSAndroid Build Coastguard Worker            fail("Invalid character '_' in source name")
120*7594170eSAndroid Build Coastguard Worker
121*7594170eSAndroid Build Coastguard Worker    clang_outfiles = _get_clang_cmd_output(ctx)
122*7594170eSAndroid Build Coastguard Worker
123*7594170eSAndroid Build Coastguard Worker    if not ctx.attr.btf:
124*7594170eSAndroid Build Coastguard Worker        return [DefaultInfo(files = depset(clang_outfiles))]
125*7594170eSAndroid Build Coastguard Worker    else:
126*7594170eSAndroid Build Coastguard Worker        stripped_outfiles = _get_stripped_cmd_output(ctx, clang_outfiles)
127*7594170eSAndroid Build Coastguard Worker        return [DefaultInfo(files = depset(stripped_outfiles))]
128*7594170eSAndroid Build Coastguard Worker
129*7594170eSAndroid Build Coastguard Workerbpf = rule(
130*7594170eSAndroid Build Coastguard Worker    implementation = _bpf_impl,
131*7594170eSAndroid Build Coastguard Worker    attrs = {
132*7594170eSAndroid Build Coastguard Worker        "srcs": attr.label_list(
133*7594170eSAndroid Build Coastguard Worker            mandatory = True,
134*7594170eSAndroid Build Coastguard Worker            allow_files = True,
135*7594170eSAndroid Build Coastguard Worker        ),
136*7594170eSAndroid Build Coastguard Worker        "copts": attr.string_list(),
137*7594170eSAndroid Build Coastguard Worker        "absolute_includes": attr.string_list(),
138*7594170eSAndroid Build Coastguard Worker        "btf": attr.bool(
139*7594170eSAndroid Build Coastguard Worker            default = True,
140*7594170eSAndroid Build Coastguard Worker            doc = "if set to true, generate BTF debug info for maps & programs",
141*7594170eSAndroid Build Coastguard Worker        ),
142*7594170eSAndroid Build Coastguard Worker        "_strip": attr.label(
143*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
144*7594170eSAndroid Build Coastguard Worker            executable = True,
145*7594170eSAndroid Build Coastguard Worker            default = "//prebuilts/clang/host/linux-x86:llvm-strip",
146*7594170eSAndroid Build Coastguard Worker            allow_files = True,
147*7594170eSAndroid Build Coastguard Worker        ),
148*7594170eSAndroid Build Coastguard Worker    },
149*7594170eSAndroid Build Coastguard Worker    toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
150*7594170eSAndroid Build Coastguard Worker    fragments = ["cpp"],
151*7594170eSAndroid Build Coastguard Worker)
152