Merge "Handle already existing targets of different name" into main
This commit is contained in:
commit
68a3d9b33e
9 changed files with 86 additions and 79 deletions
|
@ -604,13 +604,6 @@ func registerBp2buildConversionMutator(ctx RegisterMutatorsContext) {
|
|||
}
|
||||
|
||||
func bp2buildConversionMutator(ctx TopDownMutatorContext) {
|
||||
if ctx.Config().HasBazelBuildTargetInSource(ctx) {
|
||||
// Defer to the BUILD target. Generating an additional target would
|
||||
// cause a BUILD file conflict.
|
||||
ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_DEFINED_IN_BUILD_FILE, "")
|
||||
return
|
||||
}
|
||||
|
||||
bModule, ok := ctx.Module().(Bazelable)
|
||||
if !ok {
|
||||
ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_TYPE_UNSUPPORTED, "")
|
||||
|
@ -634,11 +627,24 @@ func bp2buildConversionMutator(ctx TopDownMutatorContext) {
|
|||
ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_UNSUPPORTED, "")
|
||||
return
|
||||
}
|
||||
if ctx.Module().base().GetUnconvertedReason() != nil {
|
||||
return
|
||||
}
|
||||
|
||||
bModule.ConvertWithBp2build(ctx)
|
||||
|
||||
if !ctx.Module().base().IsConvertedByBp2build() && ctx.Module().base().GetUnconvertedReason() == nil {
|
||||
if len(ctx.Module().base().Bp2buildTargets()) == 0 && ctx.Module().base().GetUnconvertedReason() == nil {
|
||||
panic(fmt.Errorf("illegal bp2build invariant: module '%s' was neither converted nor marked unconvertible", ctx.ModuleName()))
|
||||
}
|
||||
|
||||
for _, targetInfo := range ctx.Module().base().Bp2buildTargets() {
|
||||
if ctx.Config().HasBazelBuildTargetInSource(targetInfo.TargetPackage(), targetInfo.TargetName()) {
|
||||
// Defer to the BUILD target. Generating an additional target would
|
||||
// cause a BUILD file conflict.
|
||||
ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_DEFINED_IN_BUILD_FILE, targetInfo.TargetName())
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func registerApiBp2buildConversionMutator(ctx RegisterMutatorsContext) {
|
||||
|
|
|
@ -2022,10 +2022,9 @@ func (c *config) LogMixedBuild(ctx BaseModuleContext, useBazel bool) {
|
|||
}
|
||||
}
|
||||
|
||||
func (c *config) HasBazelBuildTargetInSource(ctx BaseModuleContext) bool {
|
||||
moduleName := ctx.Module().Name()
|
||||
for _, buildTarget := range c.bazelTargetsByDir[ctx.ModuleDir()] {
|
||||
if moduleName == buildTarget {
|
||||
func (c *config) HasBazelBuildTargetInSource(dir string, target string) bool {
|
||||
for _, existingTarget := range c.bazelTargetsByDir[dir] {
|
||||
if target == existingTarget {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
|
|
@ -565,8 +565,8 @@ type Module interface {
|
|||
AddProperties(props ...interface{})
|
||||
GetProperties() []interface{}
|
||||
|
||||
// IsConvertedByBp2build returns whether this module was converted via bp2build
|
||||
IsConvertedByBp2build() bool
|
||||
// If this module should not have bazel BUILD definitions generated by bp2build,
|
||||
// GetUnconvertedReason returns a reason this is the case.
|
||||
GetUnconvertedReason() *UnconvertedReason
|
||||
|
||||
// Bp2buildTargets returns the target(s) generated for Bazel via bp2build for this module
|
||||
|
@ -1639,35 +1639,16 @@ func (b bp2buildInfo) BazelAttributes() []interface{} {
|
|||
}
|
||||
|
||||
func (m *ModuleBase) addBp2buildInfo(info bp2buildInfo) {
|
||||
reason := m.commonProperties.BazelConversionStatus.UnconvertedReason
|
||||
if reason != nil {
|
||||
panic(fmt.Errorf("bp2build: internal error trying to convert module '%s' marked unconvertible. Reason type %d: %s",
|
||||
m.Name(),
|
||||
reason.ReasonType,
|
||||
reason.Detail))
|
||||
}
|
||||
m.commonProperties.BazelConversionStatus.Bp2buildInfo = append(m.commonProperties.BazelConversionStatus.Bp2buildInfo, info)
|
||||
}
|
||||
|
||||
func (m *ModuleBase) setBp2buildUnconvertible(reasonType bp2build_metrics_proto.UnconvertedReasonType, detail string) {
|
||||
if len(m.commonProperties.BazelConversionStatus.Bp2buildInfo) > 0 {
|
||||
fmt.Println(m.commonProperties.BazelConversionStatus.Bp2buildInfo)
|
||||
panic(fmt.Errorf("bp2build: internal error trying to mark converted module '%s' as unconvertible. Reason type %d: %s",
|
||||
m.Name(),
|
||||
reasonType,
|
||||
detail))
|
||||
}
|
||||
m.commonProperties.BazelConversionStatus.UnconvertedReason = &UnconvertedReason{
|
||||
ReasonType: int(reasonType),
|
||||
Detail: detail,
|
||||
}
|
||||
}
|
||||
|
||||
// IsConvertedByBp2build returns whether this module was converted via bp2build.
|
||||
func (m *ModuleBase) IsConvertedByBp2build() bool {
|
||||
return len(m.commonProperties.BazelConversionStatus.Bp2buildInfo) > 0
|
||||
}
|
||||
|
||||
func (m *ModuleBase) GetUnconvertedReason() *UnconvertedReason {
|
||||
return m.commonProperties.BazelConversionStatus.UnconvertedReason
|
||||
}
|
||||
|
|
|
@ -110,7 +110,7 @@ func TestConvertAndroidLibraryImport(t *testing.T) {
|
|||
"import.aar": "",
|
||||
"dep.aar": "",
|
||||
},
|
||||
StubbedBuildDefinitions: []string{"static_lib_dep", "prebuilt_static_import_dep"},
|
||||
StubbedBuildDefinitions: []string{"static_lib_dep", "static_import_dep", "static_import_dep-neverlink"},
|
||||
// Bazel's aar_import can only export *_import targets, so we expect
|
||||
// only "static_import_dep" in exports, but both "static_lib_dep" and
|
||||
// "static_import_dep" in deps
|
||||
|
@ -125,6 +125,7 @@ android_library_import {
|
|||
// TODO: b/301007952 - This dep is needed because android_library_import must have aars set.
|
||||
android_library_import {
|
||||
name: "static_import_dep",
|
||||
aars: ["import.aar"],
|
||||
}
|
||||
`,
|
||||
ExpectedBazelTargets: []string{
|
||||
|
|
|
@ -112,7 +112,7 @@ filegroup {
|
|||
}
|
||||
|
||||
cc_binary { name: "cc_binary_1"}
|
||||
sh_binary { name: "sh_binary_2"}
|
||||
sh_binary { name: "sh_binary_2", src: "foo.sh"}
|
||||
|
||||
apex {
|
||||
name: "com.android.apogee",
|
||||
|
@ -609,7 +609,7 @@ filegroup {
|
|||
}
|
||||
|
||||
cc_binary { name: "cc_binary_1" }
|
||||
sh_binary { name: "sh_binary_2" }
|
||||
sh_binary { name: "sh_binary_2", src: "foo.sh"}
|
||||
|
||||
apex {
|
||||
name: "com.android.apogee",
|
||||
|
@ -736,7 +736,7 @@ filegroup {
|
|||
}
|
||||
|
||||
cc_binary { name: "cc_binary_1"}
|
||||
sh_binary { name: "sh_binary_2"}
|
||||
sh_binary { name: "sh_binary_2", src: "foo.sh"}
|
||||
|
||||
apex_test {
|
||||
name: "com.android.apogee",
|
||||
|
|
|
@ -713,27 +713,32 @@ func GenerateBazelTargets(ctx *CodegenContext, generateFilegroups bool) (convers
|
|||
|
||||
switch ctx.Mode() {
|
||||
case Bp2Build:
|
||||
// There are two main ways of converting a Soong module to Bazel:
|
||||
// 1) Manually handcrafting a Bazel target and associating the module with its label
|
||||
// 2) Automatically generating with bp2build converters
|
||||
//
|
||||
// bp2build converters are used for the majority of modules.
|
||||
if b, ok := m.(android.Bazelable); ok && b.HasHandcraftedLabel() {
|
||||
if aModule, ok := m.(android.Module); ok && aModule.IsConvertedByBp2build() {
|
||||
panic(fmt.Errorf("module %q [%s] [%s] was both converted with bp2build and has a handcrafted label", bpCtx.ModuleName(m), moduleType, dir))
|
||||
if aModule, ok := m.(android.Module); ok {
|
||||
reason := aModule.GetUnconvertedReason()
|
||||
if reason != nil {
|
||||
// If this module was force-enabled, cause an error.
|
||||
if _, ok := ctx.Config().BazelModulesForceEnabledByFlag()[m.Name()]; ok && m.Name() != "" {
|
||||
err := fmt.Errorf("Force Enabled Module %s not converted", m.Name())
|
||||
errs = append(errs, err)
|
||||
}
|
||||
|
||||
// Log the module isn't to be converted by bp2build.
|
||||
// TODO: b/291598248 - Log handcrafted modules differently than other unconverted modules.
|
||||
metrics.AddUnconvertedModule(m, moduleType, dir, *reason)
|
||||
return
|
||||
}
|
||||
if len(aModule.Bp2buildTargets()) == 0 {
|
||||
panic(fmt.Errorf("illegal bp2build invariant: module '%s' was neither converted nor marked unconvertible", aModule.Name()))
|
||||
}
|
||||
// Handle modules converted to handcrafted targets.
|
||||
//
|
||||
// Since these modules are associated with some handcrafted
|
||||
// target in a BUILD file, we don't autoconvert them.
|
||||
|
||||
// Log the module.
|
||||
metrics.AddUnconvertedModule(m, moduleType, dir,
|
||||
android.UnconvertedReason{
|
||||
ReasonType: int(bp2build_metrics_proto.UnconvertedReasonType_DEFINED_IN_BUILD_FILE),
|
||||
})
|
||||
} else if aModule, ok := m.(android.Module); ok && aModule.IsConvertedByBp2build() {
|
||||
// Handle modules converted to generated targets.
|
||||
targets, targetErrs = generateBazelTargets(bpCtx, aModule)
|
||||
errs = append(errs, targetErrs...)
|
||||
for _, t := range targets {
|
||||
// A module can potentially generate more than 1 Bazel
|
||||
// target, each of a different rule class.
|
||||
metrics.IncrementRuleClassCount(t.ruleClass)
|
||||
}
|
||||
|
||||
// Log the module.
|
||||
metrics.AddConvertedModule(aModule, moduleType, dir)
|
||||
|
@ -761,24 +766,6 @@ func GenerateBazelTargets(ctx *CodegenContext, generateFilegroups bool) (convers
|
|||
return
|
||||
}
|
||||
}
|
||||
targets, targetErrs = generateBazelTargets(bpCtx, aModule)
|
||||
errs = append(errs, targetErrs...)
|
||||
for _, t := range targets {
|
||||
// A module can potentially generate more than 1 Bazel
|
||||
// target, each of a different rule class.
|
||||
metrics.IncrementRuleClassCount(t.ruleClass)
|
||||
}
|
||||
} else if _, ok := ctx.Config().BazelModulesForceEnabledByFlag()[m.Name()]; ok && m.Name() != "" {
|
||||
err := fmt.Errorf("Force Enabled Module %s not converted", m.Name())
|
||||
errs = append(errs, err)
|
||||
} else if aModule, ok := m.(android.Module); ok {
|
||||
reason := aModule.GetUnconvertedReason()
|
||||
if reason == nil {
|
||||
panic(fmt.Errorf("module '%s' was neither converted nor marked unconvertible with bp2build", aModule.Name()))
|
||||
} else {
|
||||
metrics.AddUnconvertedModule(m, moduleType, dir, *reason)
|
||||
}
|
||||
return
|
||||
} else if glib, ok := m.(*bootstrap.GoPackage); ok {
|
||||
targets, targetErrs = generateBazelTargetsGoPackage(bpCtx, glib, nameToGoLibMap)
|
||||
errs = append(errs, targetErrs...)
|
||||
|
|
|
@ -1994,6 +1994,41 @@ func TestAlreadyPresentBuildTarget(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestAlreadyPresentOneToManyBuildTarget(t *testing.T) {
|
||||
bp := `
|
||||
custom {
|
||||
name: "foo",
|
||||
one_to_many_prop: true,
|
||||
}
|
||||
custom {
|
||||
name: "bar",
|
||||
}
|
||||
`
|
||||
alreadyPresentBuildFile :=
|
||||
MakeBazelTarget(
|
||||
"custom",
|
||||
// one_to_many_prop ensures that foo generates "foo_proto_library_deps".
|
||||
"foo_proto_library_deps",
|
||||
AttrNameToString{},
|
||||
)
|
||||
expectedBazelTargets := []string{
|
||||
MakeBazelTarget(
|
||||
"custom",
|
||||
"bar",
|
||||
AttrNameToString{},
|
||||
),
|
||||
}
|
||||
registerCustomModule := func(ctx android.RegistrationContext) {
|
||||
ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice)
|
||||
}
|
||||
RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{
|
||||
AlreadyExistingBuildContents: alreadyPresentBuildFile,
|
||||
Blueprint: bp,
|
||||
ExpectedBazelTargets: expectedBazelTargets,
|
||||
Description: "Not duplicating work for an already-present BUILD target (different generated name)",
|
||||
})
|
||||
}
|
||||
|
||||
// Verifies that if a module is defined in pkg1/Android.bp, that a target present
|
||||
// in pkg2/BUILD.bazel does not result in the module being labeled "already defined
|
||||
// in a BUILD file".
|
||||
|
|
|
@ -1595,7 +1595,7 @@ func TestCcLibrarySdkVariantUsesStubs(t *testing.T) {
|
|||
Description: "cc_library_shared stubs",
|
||||
ModuleTypeUnderTest: "cc_library_shared",
|
||||
ModuleTypeUnderTestFactory: cc.LibrarySharedFactory,
|
||||
StubbedBuildDefinitions: []string{"libNoStubs", "libHasApexStubs", "libHasApexAndNdkStubs"},
|
||||
StubbedBuildDefinitions: []string{"libNoStubs", "libHasApexStubs", "libHasApexAndNdkStubs", "libHasApexAndNdkStubs.ndk_stub_libs"},
|
||||
Blueprint: soongCcLibrarySharedPreamble + `
|
||||
cc_library_shared {
|
||||
name: "libUsesSdk",
|
||||
|
@ -1621,9 +1621,7 @@ cc_library_shared {
|
|||
}
|
||||
ndk_library {
|
||||
name: "libHasApexAndNdkStubs",
|
||||
// TODO: b/301321658 - Stub this once existing-build-file handling can deal with
|
||||
// modules that generate targets of a different name.
|
||||
bazel_module: { bp2build_available: false },
|
||||
first_version: "28",
|
||||
}
|
||||
`,
|
||||
ExpectedBazelTargets: []string{
|
||||
|
|
|
@ -114,7 +114,7 @@ func TestJavaBinaryHostLibs(t *testing.T) {
|
|||
runJavaBinaryHostTestCase(t, Bp2buildTestCase{
|
||||
Description: "java_binary_host with srcs, libs.",
|
||||
Filesystem: testFs,
|
||||
StubbedBuildDefinitions: []string{"prebuilt_java-lib-dep-1"},
|
||||
StubbedBuildDefinitions: []string{"java-lib-dep-1", "java-lib-dep-1-neverlink"},
|
||||
Blueprint: `java_binary_host {
|
||||
name: "java-binary-host-libs",
|
||||
libs: ["java-lib-dep-1"],
|
||||
|
|
Loading…
Reference in a new issue