Loading android/mutator.go +23 −0 Original line number Diff line number Diff line Loading @@ -273,6 +273,12 @@ type TopDownMutatorContext interface { // This function can be used to create alias definitions in a directory that is different // from the directory of the visited Soong module. CreateBazelTargetAliasInDir(dir string, name string, actual bazel.Label) // CreateBazelConfigSetting creates a config_setting in <dir>/BUILD.bazel // build/bazel has several static config_setting(s) that are used in Bazel builds. // This function can be used to createa additional config_setting(s) based on the build graph // (e.g. a config_setting specific to an apex variant) CreateBazelConfigSetting(csa bazel.ConfigSettingAttributes, ca CommonAttributes, dir string) } type topDownMutatorContext struct { Loading Loading @@ -738,6 +744,23 @@ func (t *topDownMutatorContext) CreateBazelTargetAliasInDir( mod.base().addBp2buildInfo(info) } func (t *topDownMutatorContext) CreateBazelConfigSetting( csa bazel.ConfigSettingAttributes, ca CommonAttributes, dir string) { mod := t.Module() info := bp2buildInfo{ Dir: dir, BazelProps: bazel.BazelTargetModuleProperties{ Rule_class: "config_setting", }, CommonAttrs: ca, ConstraintAttrs: constraintAttributes{}, Attrs: &csa, } mod.base().addBp2buildInfo(info) } // ApexAvailableTags converts the apex_available property value of an ApexModule // module and returns it as a list of keyed tags. func ApexAvailableTags(mod Module) bazel.StringListAttribute { Loading bazel/configurability.go +6 −4 Original line number Diff line number Diff line Loading @@ -268,9 +268,8 @@ func (ct configurationType) validateConfig(config string) { case productVariables: // do nothing case osAndInApex: if _, ok := osAndInApexMap[config]; !ok { panic(fmt.Errorf("Unknown os+in_apex config: %s", config)) } // do nothing // this axis can contain additional per-apex keys case inApex: if _, ok := inApexMap[config]; !ok { panic(fmt.Errorf("Unknown in_apex config: %s", config)) Loading Loading @@ -299,7 +298,10 @@ func (ca ConfigurationAxis) SelectKey(config string) string { } return fmt.Sprintf("%s:%s", productVariableBazelPackage, config) case osAndInApex: return osAndInApexMap[config] if ret, exists := osAndInApexMap[config]; exists { return ret } return config case inApex: return inApexMap[config] default: Loading bazel/properties.go +11 −0 Original line number Diff line number Diff line Loading @@ -1424,3 +1424,14 @@ func TryVariableSubstitution(s string, productVariable string) (string, bool) { sub := productVariableSubstitutionPattern.ReplaceAllString(s, "$("+productVariable+")") return sub, s != sub } // StringMapAttribute is a map of strings. // The use case for this is storing the flag_values in a config_setting object. // Bazel rules do not support map attributes, and this should NOT be used in Bazel rules. type StringMapAttribute map[string]string // ConfigSettingAttributes stores the keys of a config_setting object. type ConfigSettingAttributes struct { // Each key in Flag_values is a label to a custom string_setting Flag_values StringMapAttribute } bp2build/build_conversion.go +5 −0 Original line number Diff line number Diff line Loading @@ -600,6 +600,11 @@ func prettyPrint(propertyValue reflect.Value, indent int, emitZeroValues bool) ( // TODO(b/164227191): implement pretty print for interfaces. // Interfaces are used for for arch, multilib and target properties. return "", nil case reflect.Map: if v, ok := propertyValue.Interface().(bazel.StringMapAttribute); ok { return starlark_fmt.PrintStringStringDict(v, indent), nil } return "", fmt.Errorf("bp2build expects map of type map[string]string for field: %s", propertyValue) default: return "", fmt.Errorf( "unexpected kind for property struct field: %s", propertyValue.Kind()) Loading bp2build/build_conversion_test.go +33 −0 Original line number Diff line number Diff line Loading @@ -1898,3 +1898,36 @@ func TestGenerateApiBazelTargets(t *testing.T) { Description: "Generating API contribution Bazel targets for custom module", }) } func TestGenerateConfigSetting(t *testing.T) { bp := ` custom { name: "foo", test_config_setting: true, } ` expectedBazelTargets := []string{ MakeBazelTargetNoRestrictions( "config_setting", "foo_config_setting", AttrNameToString{ "flag_values": `{ "//build/bazel/rules/my_string_setting": "foo", }`, }, ), MakeBazelTarget( "custom", "foo", AttrNameToString{}, ), } registerCustomModule := func(ctx android.RegistrationContext) { ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice) } RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{ Blueprint: bp, ExpectedBazelTargets: expectedBazelTargets, Description: "Generating API contribution Bazel targets for custom module", }) } Loading
android/mutator.go +23 −0 Original line number Diff line number Diff line Loading @@ -273,6 +273,12 @@ type TopDownMutatorContext interface { // This function can be used to create alias definitions in a directory that is different // from the directory of the visited Soong module. CreateBazelTargetAliasInDir(dir string, name string, actual bazel.Label) // CreateBazelConfigSetting creates a config_setting in <dir>/BUILD.bazel // build/bazel has several static config_setting(s) that are used in Bazel builds. // This function can be used to createa additional config_setting(s) based on the build graph // (e.g. a config_setting specific to an apex variant) CreateBazelConfigSetting(csa bazel.ConfigSettingAttributes, ca CommonAttributes, dir string) } type topDownMutatorContext struct { Loading Loading @@ -738,6 +744,23 @@ func (t *topDownMutatorContext) CreateBazelTargetAliasInDir( mod.base().addBp2buildInfo(info) } func (t *topDownMutatorContext) CreateBazelConfigSetting( csa bazel.ConfigSettingAttributes, ca CommonAttributes, dir string) { mod := t.Module() info := bp2buildInfo{ Dir: dir, BazelProps: bazel.BazelTargetModuleProperties{ Rule_class: "config_setting", }, CommonAttrs: ca, ConstraintAttrs: constraintAttributes{}, Attrs: &csa, } mod.base().addBp2buildInfo(info) } // ApexAvailableTags converts the apex_available property value of an ApexModule // module and returns it as a list of keyed tags. func ApexAvailableTags(mod Module) bazel.StringListAttribute { Loading
bazel/configurability.go +6 −4 Original line number Diff line number Diff line Loading @@ -268,9 +268,8 @@ func (ct configurationType) validateConfig(config string) { case productVariables: // do nothing case osAndInApex: if _, ok := osAndInApexMap[config]; !ok { panic(fmt.Errorf("Unknown os+in_apex config: %s", config)) } // do nothing // this axis can contain additional per-apex keys case inApex: if _, ok := inApexMap[config]; !ok { panic(fmt.Errorf("Unknown in_apex config: %s", config)) Loading Loading @@ -299,7 +298,10 @@ func (ca ConfigurationAxis) SelectKey(config string) string { } return fmt.Sprintf("%s:%s", productVariableBazelPackage, config) case osAndInApex: return osAndInApexMap[config] if ret, exists := osAndInApexMap[config]; exists { return ret } return config case inApex: return inApexMap[config] default: Loading
bazel/properties.go +11 −0 Original line number Diff line number Diff line Loading @@ -1424,3 +1424,14 @@ func TryVariableSubstitution(s string, productVariable string) (string, bool) { sub := productVariableSubstitutionPattern.ReplaceAllString(s, "$("+productVariable+")") return sub, s != sub } // StringMapAttribute is a map of strings. // The use case for this is storing the flag_values in a config_setting object. // Bazel rules do not support map attributes, and this should NOT be used in Bazel rules. type StringMapAttribute map[string]string // ConfigSettingAttributes stores the keys of a config_setting object. type ConfigSettingAttributes struct { // Each key in Flag_values is a label to a custom string_setting Flag_values StringMapAttribute }
bp2build/build_conversion.go +5 −0 Original line number Diff line number Diff line Loading @@ -600,6 +600,11 @@ func prettyPrint(propertyValue reflect.Value, indent int, emitZeroValues bool) ( // TODO(b/164227191): implement pretty print for interfaces. // Interfaces are used for for arch, multilib and target properties. return "", nil case reflect.Map: if v, ok := propertyValue.Interface().(bazel.StringMapAttribute); ok { return starlark_fmt.PrintStringStringDict(v, indent), nil } return "", fmt.Errorf("bp2build expects map of type map[string]string for field: %s", propertyValue) default: return "", fmt.Errorf( "unexpected kind for property struct field: %s", propertyValue.Kind()) Loading
bp2build/build_conversion_test.go +33 −0 Original line number Diff line number Diff line Loading @@ -1898,3 +1898,36 @@ func TestGenerateApiBazelTargets(t *testing.T) { Description: "Generating API contribution Bazel targets for custom module", }) } func TestGenerateConfigSetting(t *testing.T) { bp := ` custom { name: "foo", test_config_setting: true, } ` expectedBazelTargets := []string{ MakeBazelTargetNoRestrictions( "config_setting", "foo_config_setting", AttrNameToString{ "flag_values": `{ "//build/bazel/rules/my_string_setting": "foo", }`, }, ), MakeBazelTarget( "custom", "foo", AttrNameToString{}, ), } registerCustomModule := func(ctx android.RegistrationContext) { ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice) } RunBp2BuildTestCase(t, registerCustomModule, Bp2buildTestCase{ Blueprint: bp, ExpectedBazelTargets: expectedBazelTargets, Description: "Generating API contribution Bazel targets for custom module", }) }