Check that a product variable is set

Store product variables in pointers so that we can only apply the
properties if the product variable was set to a value.  Also only apply
bool properties if they are true, adn rearrange the code to do the
cheapest checks first.

Remove device_uses_logd, it doesn't exist any more.

Change-Id: Icf42408f57bd611746f8d985bfceb50c7f95ea59
diff --git a/common/variable.go b/common/variable.go
index b1116ea..0118a6a 100644
--- a/common/variable.go
+++ b/common/variable.go
@@ -31,10 +31,6 @@
 
 type variableProperties struct {
 	Product_variables struct {
-		Device_uses_logd struct {
-			Cflags []string
-			Srcs   []string
-		}
 		Device_uses_dlmalloc struct {
 			Cflags []string
 			Srcs   []string
@@ -54,16 +50,18 @@
 var zeroProductVariables variableProperties
 
 type productVariables struct {
-	Device_uses_logd     bool
-	Device_uses_jemalloc bool
-	Device_uses_dlmalloc bool
-	Dlmalloc_alignment   int
+	Device_uses_jemalloc *bool `json:",omitempty"`
+	Device_uses_dlmalloc *bool `json:",omitempty"`
+	Dlmalloc_alignment   *int  `json:",omitempty"`
+}
+
+func boolPtr(v bool) *bool {
+	return &v
 }
 
 func (productVariables) DefaultConfig() jsonConfigurable {
 	v := productVariables{
-		Device_uses_logd:     true,
-		Device_uses_jemalloc: true,
+		Device_uses_jemalloc: boolPtr(true),
 	}
 	return v
 }
@@ -83,18 +81,28 @@
 	for i := 0; i < variableValues.NumField(); i++ {
 		variableValue := variableValues.Field(i)
 		zeroValue := zeroValues.Field(i)
-		if reflect.DeepEqual(variableValue, zeroValue) {
-			continue
-		}
-
 		name := variableValues.Type().Field(i).Name
 		property := "product_variables." + proptools.PropertyNameForField(name)
 
+		// Check that the variable was set for the product
 		val := reflect.ValueOf(mctx.Config().(Config).ProductVariables).FieldByName(name)
-
-		if mctx.ContainsProperty(property) && val.IsValid() {
-			a.setVariableProperties(mctx, property, variableValue, val.Interface())
+		if !val.IsValid() || val.Kind() != reflect.Ptr || val.IsNil() {
+			continue
 		}
+
+		val = val.Elem()
+
+		// For bools, check that the value is true
+		if val.Kind() == reflect.Bool && val.Bool() == false {
+			continue
+		}
+
+		// Check if any properties were set for the module
+		if reflect.DeepEqual(variableValue.Interface(), zeroValue.Interface()) {
+			continue
+		}
+
+		a.setVariableProperties(mctx, property, variableValue, val.Interface())
 	}
 }