Add bp2build arch-specific paths mutator

Adds deps for properties tagged `android:"path"` within arch, multilib,
and target properties.

Test: build/bazel/ci/bp2build.sh
Test: m nothing
Bug: 185217298
Change-Id: I0230da399d2c4e984b837f69523fa09eadba3ff1
This commit is contained in:
Liz Kammer
2021-04-21 18:15:34 -04:00
parent 46b938485a
commit 4562a3b218
8 changed files with 166 additions and 20 deletions

View File

@@ -412,6 +412,54 @@ func (target Target) Variations() []blueprint.Variation {
}
}
func registerBp2buildArchPathDepsMutator(ctx RegisterMutatorsContext) {
ctx.BottomUp("bp2build-arch-pathdeps", bp2buildArchPathDepsMutator).Parallel()
}
// add dependencies for architecture specific properties tagged with `android:"path"`
func bp2buildArchPathDepsMutator(ctx BottomUpMutatorContext) {
var module Module
module = ctx.Module()
m := module.base()
if !m.ArchSpecific() {
return
}
// addPathDepsForProps does not descend into sub structs, so we need to descend into the
// arch-specific properties ourselves
properties := []interface{}{}
for _, archProperties := range m.archProperties {
for _, archProps := range archProperties {
archPropValues := reflect.ValueOf(archProps).Elem()
// there are three "arch" variations, descend into each
for _, variant := range []string{"Arch", "Multilib", "Target"} {
// The properties are an interface, get the value (a pointer) that it points to
archProps := archPropValues.FieldByName(variant).Elem()
if archProps.IsNil() {
continue
}
// And then a pointer to a struct
archProps = archProps.Elem()
for i := 0; i < archProps.NumField(); i += 1 {
f := archProps.Field(i)
// If the value of the field is a struct (as opposed to a pointer to a struct) then step
// into the BlueprintEmbed field.
if f.Kind() == reflect.Struct {
f = f.FieldByName("BlueprintEmbed")
}
if f.IsZero() {
continue
}
props := f.Interface().(interface{})
properties = append(properties, props)
}
}
}
}
addPathDepsForProps(ctx, properties)
}
// osMutator splits an arch-specific module into a variant for each OS that is enabled for the
// module. It uses the HostOrDevice value passed to InitAndroidArchModule and the
// device_supported and host_supported properties to determine which OsTypes are enabled for this
@@ -899,13 +947,17 @@ func filterArchStruct(field reflect.StructField, prefix string) (bool, reflect.S
if string(field.Tag) != `android:"`+strings.Join(values, ",")+`"` {
panic(fmt.Errorf("unexpected tag format %q", field.Tag))
}
// don't delete path tag as it is needed for bp2build
// these tags don't need to be present in the runtime generated struct type.
values = RemoveListFromList(values, []string{"arch_variant", "variant_prepend", "path"})
if len(values) > 0 {
values = RemoveListFromList(values, []string{"arch_variant", "variant_prepend"})
if len(values) > 0 && values[0] != "path" {
panic(fmt.Errorf("unknown tags %q in field %q", values, prefix+field.Name))
} else if len(values) == 1 {
field.Tag = reflect.StructTag(`android:"` + strings.Join(values, ",") + `"`)
} else {
field.Tag = ``
}
field.Tag = ""
return true, field
}
return false, field