androidbp: Improve target conditionals when host_supported

Properties need to be parsed twice to support different conditionals for
target and host modules. Then add 'android' target support that will
just be selected for target modules.

Change-Id: I8970d5a0d132324ac7e2a7fffc2b07e7c0da33c0
diff --git a/androidbp/cmd/androidbp.go b/androidbp/cmd/androidbp.go
index 5a924b1..7889588 100644
--- a/androidbp/cmd/androidbp.go
+++ b/androidbp/cmd/androidbp.go
@@ -96,16 +96,22 @@
 	disabledBuilds map[string]bool, isHostRule bool) (computedProps []string) {
 	for _, target := range props {
 		conditionals := targetScopedPropertyConditionals
+		altConditionals := hostScopedPropertyConditionals
 		if isHostRule {
-			conditionals = hostScopedPropertyConditionals
+			conditionals, altConditionals = altConditionals, conditionals
 		}
 
 		conditional, ok := conditionals[target.Name.Name]
 		if !ok {
-			// not found
-			conditional = fmt.Sprintf(
-				"ifeq(true, true) # ERROR: unsupported conditional host [%s]",
-				target.Name.Name)
+			if _, ok := altConditionals[target.Name.Name]; ok {
+				// This is only for the other build type
+				continue
+			} else {
+				// not found
+				conditional = fmt.Sprintf(
+					"ifeq(true, true) # ERROR: unsupported conditional [%s]",
+					target.Name.Name)
+			}
 		}
 
 		var scopedProps []string
@@ -125,9 +131,13 @@
 		}
 
 		if len(scopedProps) > 0 {
-			computedProps = append(computedProps, conditional)
-			computedProps = append(computedProps, scopedProps...)
-			computedProps = append(computedProps, "endif")
+			if conditional != "" {
+				computedProps = append(computedProps, conditional)
+				computedProps = append(computedProps, scopedProps...)
+				computedProps = append(computedProps, "endif")
+			} else {
+				computedProps = append(computedProps, scopedProps...)
+			}
 		}
 	}
 
@@ -201,14 +211,7 @@
 	fmt.Fprintf(w, "include $(%s)\n\n", moduleRule)
 }
 
-func (w *androidMkWriter) handleModule(module *bpparser.Module) {
-	moduleRule := fmt.Sprintf(module.Type.Name)
-	if translation, ok := moduleTypeToRule[module.Type.Name]; ok {
-		moduleRule = translation
-	}
-
-	isHostRule := strings.Contains(moduleRule, "HOST")
-	hostSupported := false
+func (w *androidMkWriter) parsePropsAndWriteModule(moduleRule string, isHostRule bool, module *bpparser.Module) (hostSupported bool) {
 	standardProps := make([]string, 0, len(module.Properties))
 	disabledBuilds := make(map[string]bool)
 	for _, prop := range module.Properties {
@@ -231,13 +234,25 @@
 
 	// write out target build
 	w.writeModule(moduleRule, standardProps, disabledBuilds, isHostRule)
-	if hostSupported {
+	return
+}
+
+func (w *androidMkWriter) handleModule(module *bpparser.Module) {
+	moduleRule := fmt.Sprintf(module.Type.Name)
+	if translation, ok := moduleTypeToRule[module.Type.Name]; ok {
+		moduleRule = translation
+	}
+
+	isHostRule := strings.Contains(moduleRule, "HOST")
+	hostSupported := w.parsePropsAndWriteModule(moduleRule, isHostRule, module)
+
+	if !isHostRule && hostSupported {
 		hostModuleRule := "NO CORRESPONDING HOST RULE" + moduleRule
 		if trans, ok := targetToHostModuleRule[moduleRule]; ok {
 			hostModuleRule = trans
 		}
-		w.writeModule(hostModuleRule, standardProps,
-			disabledBuilds, true)
+
+		w.parsePropsAndWriteModule(hostModuleRule, true, module)
 	}
 }
 
diff --git a/androidbp/cmd/soong.go b/androidbp/cmd/soong.go
index 95c938e..c40b507 100644
--- a/androidbp/cmd/soong.go
+++ b/androidbp/cmd/soong.go
@@ -106,6 +106,7 @@
 
 // TODO: host target?
 var targetScopedPropertyConditionals = map[string]string{
+	"android":       "",
 	"android32":     "ifneq($(TARGET_IS_64_BIT), true)",
 	"not_android32": "ifeq($(TARGET_IS_64_BIT), true)",
 	"android64":     "ifeq($(TARGET_IS_64_BIT), true)",