Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b3cb38c3 authored by Zi Wang's avatar Zi Wang
Browse files

Add bp2build converter for bpf

Bug: 240163393
Test: m bp2build
Test: bp2build/bpf_conversion_test.go
Change-Id: Ie3bbc64511146b099a766d7e8b56e93cef58ef68
parent c0d3527a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+65 −0
Original line number Diff line number Diff line
// 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"]`,
			}),
		},
	})
}
+36 −0
Original line number Diff line number Diff line
@@ -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)
}