diff --git a/bpf/bpf.go b/bpf/bpf.go index dbbce505e..60a410d7f 100644 --- a/bpf/bpf.go +++ b/bpf/bpf.go @@ -22,6 +22,7 @@ import ( "android/soong/android" "android/soong/bazel" + "android/soong/bazel/cquery" "github.com/google/blueprint" "github.com/google/blueprint/proptools" @@ -239,6 +240,35 @@ func (bpf *bpf) AndroidMk() android.AndroidMkData { } } +var _ android.MixedBuildBuildable = (*bpf)(nil) + +func (bpf *bpf) IsMixedBuildSupported(ctx android.BaseModuleContext) bool { + return true +} + +func (bpf *bpf) QueueBazelCall(ctx android.BaseModuleContext) { + bazelCtx := ctx.Config().BazelContext + bazelCtx.QueueBazelRequest( + bpf.GetBazelLabel(ctx, bpf), + cquery.GetOutputFiles, + android.GetConfigKey(ctx)) +} + +func (bpf *bpf) ProcessBazelQueryResponse(ctx android.ModuleContext) { + bazelCtx := ctx.Config().BazelContext + objPaths, err := bazelCtx.GetOutputFiles(bpf.GetBazelLabel(ctx, bpf), android.GetConfigKey(ctx)) + if err != nil { + ctx.ModuleErrorf(err.Error()) + return + } + + bazelOuts := android.Paths{} + for _, p := range objPaths { + bazelOuts = append(bazelOuts, android.PathForBazelOut(ctx, p)) + } + bpf.objs = bazelOuts +} + // Implements OutputFileFileProducer interface so that the obj output can be used in the data property // of other modules. func (bpf *bpf) OutputFiles(tag string) (android.Paths, error) { diff --git a/bpf/bpf_test.go b/bpf/bpf_test.go index 6e3909680..a2010ff2f 100644 --- a/bpf/bpf_test.go +++ b/bpf/bpf_test.go @@ -71,3 +71,26 @@ func TestBpfSourceName(t *testing.T) { `\QAndroid.bp:2:3: module "bpf_invalid_name.o" variant "android_common": invalid character '_' in source name\E`)). RunTestWithBp(t, bp) } + +func TestBpfWithBazel(t *testing.T) { + bp := ` + bpf { + name: "bpf.o", + srcs: ["bpf.c"], + bazel_module: { label: "//bpf" }, + } + ` + + result := android.GroupFixturePreparers( + prepareForBpfTest, android.FixtureModifyConfig(func(config android.Config) { + config.BazelContext = android.MockBazelContext{ + OutputBaseDir: "outputbase", + LabelToOutputFiles: map[string][]string{ + "//bpf": []string{"bpf.o"}}} + })).RunTestWithBp(t, bp) + + output := result.Module("bpf.o", "android_common").(*bpf) + + expectedOutputFiles := []string{"outputbase/execroot/__main__/bpf.o"} + android.AssertDeepEquals(t, "output files", expectedOutputFiles, output.objs.Strings()) +}