Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9e2a5a7d authored by Liz Kammer's avatar Liz Kammer
Browse files

Don't panic for unhandled product vars

Instead, we return an error. This allows us to access some product
variable information earlier when it will not be used as an attribute
without panicing

Test: m nothing
Change-Id: Id094b2b9e1364a8d174d99b3824fa149fb235b3e
parent 9a97a8f6
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1458,7 +1458,10 @@ func addCompatibilityConstraintForCompileMultilib(ctx *topDownMutatorContext, en
// Returns a list of the constraint_value targets who enable this override.
func productVariableConfigEnableAttribute(ctx *topDownMutatorContext) bazel.LabelListAttribute {
	result := bazel.LabelListAttribute{}
	productVariableProps := ProductVariableProperties(ctx, ctx.Module())
	productVariableProps, errs := ProductVariableProperties(ctx, ctx.Module())
	for _, err := range errs {
		ctx.ModuleErrorf("ProductVariableProperties error: %s", err)
	}
	if productConfigProps, exists := productVariableProps["Enabled"]; exists {
		for productConfigProp, prop := range productConfigProps {
			flag, ok := prop.(*bool)
+11 −6
Original line number Diff line number Diff line
@@ -669,7 +669,8 @@ type ProductConfigProperties map[string]map[ProductConfigOrSoongConfigProperty]i

// ProductVariableProperties returns a ProductConfigProperties containing only the properties which
// have been set for the given module.
func ProductVariableProperties(ctx ArchVariantContext, module Module) ProductConfigProperties {
func ProductVariableProperties(ctx ArchVariantContext, module Module) (ProductConfigProperties, []error) {
	var errs []error
	moduleBase := module.base()

	productConfigProperties := ProductConfigProperties{}
@@ -693,12 +694,15 @@ func ProductVariableProperties(ctx ArchVariantContext, module Module) ProductCon
		for namespace, namespacedVariableProps := range m.namespacedVariableProps() {
			for _, namespacedVariableProp := range namespacedVariableProps {
				variableValues := reflect.ValueOf(namespacedVariableProp).Elem().FieldByName(soongconfig.SoongConfigProperty)
				productConfigProperties.AddSoongConfigProperties(namespace, variableValues)
				err := productConfigProperties.AddSoongConfigProperties(namespace, variableValues)
				if err != nil {
					errs = append(errs, err)
				}
			}
		}
	}

	return productConfigProperties
	return productConfigProperties, errs
}

func (p *ProductConfigProperties) AddProductConfigProperty(
@@ -820,7 +824,7 @@ func (productConfigProperties *ProductConfigProperties) AddProductConfigProperti

}

func (productConfigProperties *ProductConfigProperties) AddSoongConfigProperties(namespace string, soongConfigVariablesStruct reflect.Value) {
func (productConfigProperties *ProductConfigProperties) AddSoongConfigProperties(namespace string, soongConfigVariablesStruct reflect.Value) error {
	//
	// Example of soong_config_variables:
	//
@@ -917,7 +921,7 @@ func (productConfigProperties *ProductConfigProperties) AddSoongConfigProperties
					if propertyName == "Target" {
						productConfigProperties.AddSoongConfigPropertiesFromTargetStruct(namespace, variableName, proptools.PropertyNameForField(propertyOrValueName), field.Field(k))
					} else if propertyName == "Arch" || propertyName == "Multilib" {
						panic("Arch/Multilib are not currently supported in soong config variable structs")
						return fmt.Errorf("Arch/Multilib are not currently supported in soong config variable structs")
					} else {
						productConfigProperties.AddSoongConfigProperty(propertyName, namespace, variableName, proptools.PropertyNameForField(propertyOrValueName), "", field.Field(k).Interface())
					}
@@ -928,13 +932,14 @@ func (productConfigProperties *ProductConfigProperties) AddSoongConfigProperties
				if propertyOrValueName == "Target" {
					productConfigProperties.AddSoongConfigPropertiesFromTargetStruct(namespace, variableName, "", propertyOrStruct)
				} else if propertyOrValueName == "Arch" || propertyOrValueName == "Multilib" {
					panic("Arch/Multilib are not currently supported in soong config variable structs")
					return fmt.Errorf("Arch/Multilib are not currently supported in soong config variable structs")
				} else {
					productConfigProperties.AddSoongConfigProperty(propertyOrValueName, namespace, variableName, "", "", propertyOrStruct.Interface())
				}
			}
		}
	}
	return nil
}

func (productConfigProperties *ProductConfigProperties) AddSoongConfigPropertiesFromTargetStruct(namespace, soongConfigVariableName string, soongConfigVariableValue string, targetStruct reflect.Value) {
+4 −1
Original line number Diff line number Diff line
@@ -3298,7 +3298,10 @@ func convertWithBp2build(a *apexBundle, ctx android.TopDownMutatorContext) (baze
		cannedFsConfigAttribute.SetValue(android.BazelLabelForModuleSrcSingle(ctx, *a.properties.Canned_fs_config))
	}

	productVariableProps := android.ProductVariableProperties(ctx, a)
	productVariableProps, errs := android.ProductVariableProperties(ctx, a)
	for _, err := range errs {
		ctx.ModuleErrorf("ProductVariableProperties error: %s", err)
	}
	// TODO(b/219503907) this would need to be set to a.MinSdkVersionValue(ctx) but
	// given it's coming via config, we probably don't want to put it in here.
	var minSdkVersion bazel.StringAttribute
+4 −1
Original line number Diff line number Diff line
@@ -517,7 +517,10 @@ func (m *customModule) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
			}
		}
	}
	productVariableProps := android.ProductVariableProperties(ctx, ctx.Module())
	productVariableProps, errs := android.ProductVariableProperties(ctx, ctx.Module())
	for _, err := range errs {
		ctx.ModuleErrorf("ProductVariableProperties error: %s", err)
	}
	if props, ok := productVariableProps["String_literal_prop"]; ok {
		for c, p := range props {
			if val, ok := p.(*string); ok {
+4 −1
Original line number Diff line number Diff line
@@ -944,7 +944,10 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)
		nativeCoverage = BoolPtr(false)
	}

	productVariableProps := android.ProductVariableProperties(ctx, ctx.Module())
	productVariableProps, errs := android.ProductVariableProperties(ctx, ctx.Module())
	for _, err := range errs {
		ctx.ModuleErrorf("ProductVariableProperties error: %s", err)
	}

	(&compilerAttrs).convertProductVariables(ctx, productVariableProps)
	(&linkerAttrs).convertProductVariables(ctx, productVariableProps)
Loading