diff options
Diffstat (limited to 'golang')
| -rw-r--r-- | golang/Android.bp | 1 | ||||
| -rw-r--r-- | golang/golang.go | 20 | ||||
| -rw-r--r-- | golang/plugin_test.go | 54 |
3 files changed, 72 insertions, 3 deletions
diff --git a/golang/Android.bp b/golang/Android.bp index 3eae94fa2..d3bbd51ea 100644 --- a/golang/Android.bp +++ b/golang/Android.bp @@ -17,6 +17,7 @@ bootstrap_go_package { ], testSrcs: [ "golang_test.go", + "plugin_test.go", ], pluginFor: ["soong_build"], } diff --git a/golang/golang.go b/golang/golang.go index 9e0744aaf..282ac7805 100644 --- a/golang/golang.go +++ b/golang/golang.go @@ -38,10 +38,17 @@ func RegisterGoModuleTypes(ctx android.RegistrationContext) { ctx.RegisterModuleType("blueprint_go_binary", goBinaryModuleFactory) } +// wrapGoPackage is used to increase the depth of the blueprint.ModuleBase struct embedded in bootstrap.GoPackage +// so that the Go selector rules will choose the blueprint.ModuleBase in android.ModuleBase instead of throwing +// an ambiguous method error. +type wrapGoPackage struct { + bootstrap.GoPackage +} + // A GoPackage is a module for building Go packages. type GoPackage struct { android.ModuleBase - bootstrap.GoPackage + wrapGoPackage } func goPackageModuleFactory() android.Module { @@ -63,10 +70,17 @@ func (g *GoPackage) GenerateAndroidBuildActions(ctx android.ModuleContext) { g.GoPackage.GenerateBuildActions(ctx.BlueprintModuleContext()) } +// wrapGoBinary is used to increase the depth of the blueprint.ModuleBase struct embedded in bootstrap.GoBinary +// so that the Go selector rules will choose the blueprint.ModuleBase in android.ModuleBase instead of throwing +// an ambiguous method error. +type wrapGoBinary struct { + bootstrap.GoBinary +} + // A GoBinary is a module for building executable binaries from Go sources. type GoBinary struct { android.ModuleBase - bootstrap.GoBinary + wrapGoBinary outputFile android.Path } @@ -114,7 +128,7 @@ func (g *GoBinary) GenerateAndroidBuildActions(ctx android.ModuleContext) { func usedByBootstrap(name string) bool { switch name { - case "loadplugins", "soong_build": + case "gob_gen", "loadplugins", "soong_build": return true default: return false diff --git a/golang/plugin_test.go b/golang/plugin_test.go new file mode 100644 index 000000000..54a91face --- /dev/null +++ b/golang/plugin_test.go @@ -0,0 +1,54 @@ +// Copyright 2025 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 golang + +import ( + "testing" + + "android/soong/android" + "github.com/google/blueprint/bootstrap" +) + +func TestPluginAllowList(t *testing.T) { + bp := ` + bootstrap_go_package { + name: "bad_plugin", + pkgPath: "test/bad", + pluginFor: ["soong_build"], + } + + bootstrap_go_package { + name: "soong-llvm", + pkgPath: "test/llvm", + pluginFor: ["soong_build"], + } + + blueprint_go_binary { + name: "soong_build", + } + ` + + android.GroupFixturePreparers( + android.PrepareForTestWithArchMutator, + android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) { + RegisterGoModuleTypes(ctx) + ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { + ctx.BottomUpBlueprint("bootstrap_deps", bootstrap.BootstrapDeps).UsesReverseDependencies() + }) + android.RegisterPluginSingletonBuildComponents(ctx) + }), + ).ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(`New plugins are not supported; however \["bad_plugin"\] were found.`)). + RunTestWithBp(t, bp) +} |
