diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index f2b05dd18..971719eac 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -589,6 +589,7 @@ var ( "ndk_headers", "ndk_library", "sysprop_library", + "bpf", } // Add the names of modules that bp2build should never convert, if it is diff --git a/bp2build/bpf_conversion_test.go b/bp2build/bpf_conversion_test.go new file mode 100644 index 000000000..1259f9e35 --- /dev/null +++ b/bp2build/bpf_conversion_test.go @@ -0,0 +1,65 @@ +// Copyright 2022 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package bp2build + +import ( + "android/soong/android" + "android/soong/bpf" + + "testing" +) + +func runBpfTestCase(t *testing.T, tc Bp2buildTestCase) { + t.Helper() + (&tc).ModuleTypeUnderTest = "bpf" + (&tc).ModuleTypeUnderTestFactory = bpf.BpfFactory + RunBp2BuildTestCase(t, registerBpfModuleTypes, tc) +} + +func registerBpfModuleTypes(ctx android.RegistrationContext) {} + +func TestBpfSupportedAttrs(t *testing.T) { + runBpfTestCase(t, Bp2buildTestCase{ + Description: "Bpf module only converts supported attributes", + Filesystem: map[string]string{}, + Blueprint: ` +bpf { + name: "bpfTestOut.o", + srcs: ["bpfTestSrcOne.c", + "bpfTestSrcTwo.c"], + btf: true, + cflags: ["-bpfCflagOne", + "-bpfCflagTwo"], + include_dirs: ["ia/ib/ic"], + sub_dir: "sa/ab", +} +`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("bpf", "bpfTestOut.o", AttrNameToString{ + "absolute_includes": `["ia/ib/ic"]`, + "btf": `True`, + "copts": `[ + "-bpfCflagOne", + "-bpfCflagTwo", + ]`, + "srcs": `[ + "bpfTestSrcOne.c", + "bpfTestSrcTwo.c", + ]`, + "target_compatible_with": `["//build/bazel/platforms/os:android"]`, + }), + }, + }) +} diff --git a/bpf/bpf.go b/bpf/bpf.go index e89cc4ec8..dbbce505e 100644 --- a/bpf/bpf.go +++ b/bpf/bpf.go @@ -21,6 +21,7 @@ import ( "strings" "android/soong/android" + "android/soong/bazel" "github.com/google/blueprint" "github.com/google/blueprint/proptools" @@ -93,6 +94,7 @@ type BpfProperties struct { type bpf struct { android.ModuleBase + android.BazelModuleBase properties BpfProperties @@ -260,5 +262,39 @@ func BpfFactory() android.Module { module.AddProperties(&module.properties) android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibCommon) + android.InitBazelModule(module) return module } + +type bazelBpfAttributes struct { + Srcs bazel.LabelListAttribute + Copts bazel.StringListAttribute + Absolute_includes bazel.StringListAttribute + Btf *bool + // TODO(b/249528391): Add support for sub_dir +} + +// bpf bp2build converter +func (b *bpf) ConvertWithBp2build(ctx android.TopDownMutatorContext) { + if ctx.ModuleType() != "bpf" { + return + } + + srcs := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrc(ctx, b.properties.Srcs)) + copts := bazel.MakeStringListAttribute(b.properties.Cflags) + absolute_includes := bazel.MakeStringListAttribute(b.properties.Include_dirs) + btf := b.properties.Btf + + attrs := bazelBpfAttributes{ + Srcs: srcs, + Copts: copts, + Absolute_includes: absolute_includes, + Btf: btf, + } + props := bazel.BazelTargetModuleProperties{ + Rule_class: "bpf", + Bzl_load_location: "//build/bazel/rules/bpf:bpf.bzl", + } + + ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: b.Name()}, &attrs) +}