Add logtags source file support

Add support for converting logtags files to source files.  Each
.logtags file is converted to a .java file, but only after all
.logtags files have been combined into a merged text file by
the logtagsSingleton.

Change-Id: I375d82874029bd26a7c528e46add2a638ba123f9
diff --git a/java/gen.go b/java/gen.go
index 0b84d44..dd86f66 100644
--- a/java/gen.go
+++ b/java/gen.go
@@ -32,7 +32,13 @@
 	pctx.VariableFunc("aidlCmd", func(c interface{}) (string, error) {
 		return c.(common.Config).HostBinTool("aidl")
 	})
+	pctx.StaticVariable("logtagsCmd", "${srcDir}/build/tools/java-event-log-tags.py")
+	pctx.StaticVariable("mergeLogtagsCmd", "${srcDir}/build/tools/merge-event-log-tags.py")
 	pctx.VariableConfigMethod("srcDir", common.Config.SrcDir)
+
+	pctx.VariableFunc("allLogtagsFile", func(c interface{}) (string, error) {
+		return filepath.Join(c.(common.Config).IntermediatesDir(), "all-event-log-tags.txt"), nil
+	})
 }
 
 var (
@@ -42,6 +48,18 @@
 			Description: "aidl $out",
 		},
 		"depFile", "aidlFlags")
+
+	logtags = pctx.StaticRule("logtags",
+		blueprint.RuleParams{
+			Command:     "$logtagsCmd -o $out $in $allLogtagsFile",
+			Description: "logtags $out",
+		})
+
+	mergeLogtags = pctx.StaticRule("mergeLogtags",
+		blueprint.RuleParams{
+			Command:     "$mergeLogtagsCmd -o $out $in",
+			Description: "merge logtags $out",
+		})
 )
 
 func genAidl(ctx common.AndroidModuleContext, aidlFile, aidlFlags string) string {
@@ -64,7 +82,22 @@
 	return javaFile
 }
 
-func genSources(ctx common.AndroidModuleContext, srcFiles []string,
+func genLogtags(ctx common.AndroidModuleContext, logtagsFile string) string {
+	javaFile := strings.TrimPrefix(logtagsFile, common.ModuleSrcDir(ctx))
+	javaFile = filepath.Join(common.ModuleGenDir(ctx), javaFile)
+	javaFile = pathtools.ReplaceExtension(javaFile, "java")
+
+	ctx.Build(pctx, blueprint.BuildParams{
+		Rule:      logtags,
+		Outputs:   []string{javaFile},
+		Inputs:    []string{logtagsFile},
+		Implicits: []string{"$logtagsCmd"},
+	})
+
+	return javaFile
+}
+
+func (j *javaBase) genSources(ctx common.AndroidModuleContext, srcFiles []string,
 	flags javaBuilderFlags) []string {
 
 	for i, srcFile := range srcFiles {
@@ -72,8 +105,37 @@
 		case ".aidl":
 			javaFile := genAidl(ctx, srcFile, flags.aidlFlags)
 			srcFiles[i] = javaFile
+		case ".logtags":
+			j.logtagsSrcs = append(j.logtagsSrcs, srcFile)
+			javaFile := genLogtags(ctx, srcFile)
+			srcFiles[i] = javaFile
 		}
 	}
 
 	return srcFiles
 }
+
+func LogtagsSingleton() blueprint.Singleton {
+	return &logtagsSingleton{}
+}
+
+type logtagsProducer interface {
+	logtags() []string
+}
+
+type logtagsSingleton struct{}
+
+func (l *logtagsSingleton) GenerateBuildActions(ctx blueprint.SingletonContext) {
+	var allLogtags []string
+	ctx.VisitAllModules(func(module blueprint.Module) {
+		if logtags, ok := module.(logtagsProducer); ok {
+			allLogtags = append(allLogtags, logtags.logtags()...)
+		}
+	})
+
+	ctx.Build(pctx, blueprint.BuildParams{
+		Rule:    mergeLogtags,
+		Outputs: []string{"$allLogtagsFile"},
+		Inputs:  allLogtags,
+	})
+}