Add cc_genrule

cc_genrule is the same as a normal genrule, but can depend on other cc
modules (like cc_object).

Test: mmma external/minijail
Change-Id: I8df87665c7bdc76ce89c92755c054f967a818e57
diff --git a/genrule/genrule.go b/genrule/genrule.go
index f390f81..479e67a 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -28,8 +28,8 @@
 )
 
 func init() {
-	android.RegisterModuleType("gensrcs", GenSrcsFactory)
-	android.RegisterModuleType("genrule", GenRuleFactory)
+	android.RegisterModuleType("gensrcs", genSrcsFactory)
+	android.RegisterModuleType("genrule", genRuleFactory)
 }
 
 var (
@@ -90,9 +90,13 @@
 	Srcs []string
 }
 
-type generator struct {
+type Module struct {
 	android.ModuleBase
 
+	// For other packages to make their own genrules with extra
+	// properties
+	Extra interface{}
+
 	properties generatorProperties
 
 	tasks taskFunc
@@ -112,21 +116,21 @@
 	out android.WritablePaths
 }
 
-func (g *generator) GeneratedSourceFiles() android.Paths {
+func (g *Module) GeneratedSourceFiles() android.Paths {
 	return g.outputFiles
 }
 
-func (g *generator) Srcs() android.Paths {
+func (g *Module) Srcs() android.Paths {
 	return g.outputFiles
 }
 
-func (g *generator) GeneratedHeaderDirs() android.Paths {
+func (g *Module) GeneratedHeaderDirs() android.Paths {
 	return g.exportedIncludeDirs
 }
 
-func (g *generator) DepsMutator(ctx android.BottomUpMutatorContext) {
+func (g *Module) DepsMutator(ctx android.BottomUpMutatorContext) {
 	android.ExtractSourcesDeps(ctx, g.properties.Srcs)
-	if g, ok := ctx.Module().(*generator); ok {
+	if g, ok := ctx.Module().(*Module); ok {
 		if len(g.properties.Tools) > 0 {
 			ctx.AddFarVariationDependencies([]blueprint.Variation{
 				{"arch", ctx.AConfig().BuildOsVariant},
@@ -135,7 +139,7 @@
 	}
 }
 
-func (g *generator) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+func (g *Module) GenerateAndroidBuildActions(ctx android.ModuleContext) {
 	if len(g.properties.Tools) == 0 && len(g.properties.Tool_files) == 0 {
 		ctx.ModuleErrorf("at least one `tools` or `tool_files` is required")
 		return
@@ -275,7 +279,7 @@
 	}
 }
 
-func (g *generator) generateSourceFile(ctx android.ModuleContext, task generateTask) {
+func (g *Module) generateSourceFile(ctx android.ModuleContext, task generateTask) {
 	desc := "generate"
 	if len(task.out) == 1 {
 		desc += " " + task.out[0].Base()
@@ -299,20 +303,18 @@
 	}
 }
 
-func generatorFactory(tasks taskFunc, props ...interface{}) android.Module {
-	module := &generator{
+func generatorFactory(tasks taskFunc, props ...interface{}) *Module {
+	module := &Module{
 		tasks: tasks,
 	}
 
 	module.AddProperties(props...)
 	module.AddProperties(&module.properties)
 
-	android.InitAndroidModule(module)
-
 	return module
 }
 
-func GenSrcsFactory() android.Module {
+func NewGenSrcs() *Module {
 	properties := &genSrcsProperties{}
 
 	tasks := func(ctx android.ModuleContext, srcFiles android.Paths) []generateTask {
@@ -329,12 +331,18 @@
 	return generatorFactory(tasks, properties)
 }
 
+func genSrcsFactory() android.Module {
+	m := NewGenSrcs()
+	android.InitAndroidModule(m)
+	return m
+}
+
 type genSrcsProperties struct {
 	// extension that will be substituted for each output file
 	Output_extension string
 }
 
-func GenRuleFactory() android.Module {
+func NewGenRule() *Module {
 	properties := &genRuleProperties{}
 
 	tasks := func(ctx android.ModuleContext, srcFiles android.Paths) []generateTask {
@@ -353,6 +361,12 @@
 	return generatorFactory(tasks, properties)
 }
 
+func genRuleFactory() android.Module {
+	m := NewGenRule()
+	android.InitAndroidModule(m)
+	return m
+}
+
 type genRuleProperties struct {
 	// names of the output files that will be generated
 	Out []string