Merge "Create 'androidmk' rule to automatically run androidbp" into master-soong
diff --git a/common/defs.go b/common/defs.go
index 67b93ff..98464fe 100644
--- a/common/defs.go
+++ b/common/defs.go
@@ -15,7 +15,10 @@
 package common
 
 import (
+	"path/filepath"
+
 	"github.com/google/blueprint"
+	"github.com/google/blueprint/bootstrap"
 )
 
 var (
@@ -24,6 +27,13 @@
 	cpPreserveSymlinks = pctx.VariableConfigMethod("cpPreserveSymlinks",
 		Config.CpPreserveSymlinksFlags)
 
+	androidbpCmd = filepath.Join(bootstrap.BinDir, "androidbp")
+	androidbp    = pctx.StaticRule("androidbp",
+		blueprint.RuleParams{
+			Command:     androidbpCmd + " $in $out",
+			Description: "androidbp $out",
+		})
+
 	// A phony rule that is not the built-in Ninja phony rule.  The built-in
 	// phony rule has special behavior that is sometimes not desired.  See the
 	// Ninja docs for more details.
diff --git a/common/module.go b/common/module.go
index 33c586c..bf3c435 100644
--- a/common/module.go
+++ b/common/module.go
@@ -17,6 +17,8 @@
 import (
 	"path/filepath"
 	"runtime"
+	"sort"
+	"strings"
 
 	"android/soong/glob"
 
@@ -523,12 +525,15 @@
 	checkbuildDeps := []string{}
 
 	dirModules := make(map[string][]string)
+	hasBPFile := make(map[string]bool)
+	bpFiles := []string{}
 
 	ctx.VisitAllModules(func(module blueprint.Module) {
 		if a, ok := module.(AndroidModule); ok {
 			blueprintDir := a.base().blueprintDir
 			installTarget := a.base().installTarget
 			checkbuildTarget := a.base().checkbuildTarget
+			bpFile := ctx.BlueprintFile(module)
 
 			if checkbuildTarget != "" {
 				checkbuildDeps = append(checkbuildDeps, checkbuildTarget)
@@ -538,6 +543,11 @@
 			if installTarget != "" {
 				dirModules[blueprintDir] = append(dirModules[blueprintDir], installTarget)
 			}
+
+			if !hasBPFile[bpFile] {
+				hasBPFile[bpFile] = true
+				bpFiles = append(bpFiles, bpFile)
+			}
 		}
 	})
 
@@ -560,4 +570,43 @@
 			Optional:  true,
 		})
 	}
+
+	// Create Android.bp->mk translation rules
+	androidMks := []string{}
+	srcDir := ctx.Config().(Config).SrcDir()
+	intermediatesDir := filepath.Join(ctx.Config().(Config).IntermediatesDir(), "androidmk")
+	sort.Strings(bpFiles)
+	for _, origBp := range bpFiles {
+		bpFile := filepath.Join(srcDir, origBp)
+		mkFile := filepath.Join(srcDir, filepath.Dir(origBp), "Android.mk")
+
+		files, err := Glob(ctx, intermediatesDir, mkFile, nil)
+		if err != nil {
+			ctx.Errorf("glob: %s", err.Error())
+			continue
+		}
+
+		// Existing Android.mk file, use that instead
+		if len(files) > 0 {
+			continue
+		}
+
+		transMk := filepath.Join("androidmk", "Android_"+strings.Replace(filepath.Dir(origBp), "/", "_", -1)+".mk")
+		ctx.Build(pctx, blueprint.BuildParams{
+			Rule:      androidbp,
+			Outputs:   []string{transMk},
+			Inputs:    []string{bpFile},
+			Implicits: []string{androidbpCmd},
+			Optional:  true,
+		})
+
+		androidMks = append(androidMks, transMk)
+	}
+
+	ctx.Build(pctx, blueprint.BuildParams{
+		Rule:      blueprint.Phony,
+		Outputs:   []string{"androidmk"},
+		Implicits: androidMks,
+		Optional:  true,
+	})
 }