Add defaults support to genrule.

Bug: 119635195
Test: genrule_test.go
Change-Id: I8aeff18760b031491012dd4864985b4ed01dbf3a
diff --git a/genrule/genrule.go b/genrule/genrule.go
index b70c075..77bc196 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -28,6 +28,8 @@
 )
 
 func init() {
+	android.RegisterModuleType("genrule_defaults", defaultsFactory)
+
 	android.RegisterModuleType("gensrcs", GenSrcsFactory)
 	android.RegisterModuleType("genrule", GenRuleFactory)
 }
@@ -95,6 +97,7 @@
 
 type Module struct {
 	android.ModuleBase
+	android.DefaultableModuleBase
 
 	// For other packages to make their own genrules with extra
 	// properties
@@ -502,6 +505,7 @@
 func GenRuleFactory() android.Module {
 	m := NewGenRule()
 	android.InitAndroidModule(m)
+	android.InitDefaultableModule(m)
 	return m
 }
 
@@ -512,3 +516,35 @@
 
 var Bool = proptools.Bool
 var String = proptools.String
+
+//
+// Defaults
+//
+type Defaults struct {
+	android.ModuleBase
+	android.DefaultsModuleBase
+}
+
+func (*Defaults) GenerateAndroidBuildActions(ctx android.ModuleContext) {
+}
+
+func (d *Defaults) DepsMutator(ctx android.BottomUpMutatorContext) {
+}
+
+func defaultsFactory() android.Module {
+	return DefaultsFactory()
+}
+
+func DefaultsFactory(props ...interface{}) android.Module {
+	module := &Defaults{}
+
+	module.AddProperties(props...)
+	module.AddProperties(
+		&generatorProperties{},
+		&genRuleProperties{},
+	)
+
+	android.InitDefaultsModule(module)
+
+	return module
+}
diff --git a/genrule/genrule_test.go b/genrule/genrule_test.go
index a99fa18..70b9090 100644
--- a/genrule/genrule_test.go
+++ b/genrule/genrule_test.go
@@ -21,6 +21,7 @@
 	"testing"
 
 	"android/soong/android"
+	"reflect"
 )
 
 var buildDir string
@@ -54,7 +55,9 @@
 	ctx := android.NewTestArchContext()
 	ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory))
 	ctx.RegisterModuleType("genrule", android.ModuleFactoryAdaptor(GenRuleFactory))
+	ctx.RegisterModuleType("genrule_defaults", android.ModuleFactoryAdaptor(defaultsFactory))
 	ctx.RegisterModuleType("tool", android.ModuleFactoryAdaptor(toolFactory))
+	ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
 	ctx.Register()
 
 	bp += `
@@ -465,6 +468,46 @@
 
 }
 
+func TestGenruleDefaults(t *testing.T) {
+	config := android.TestArchConfig(buildDir, nil)
+	bp := `
+				genrule_defaults {
+					name: "gen_defaults1",
+					cmd: "cp $(in) $(out)",
+				}
+
+				genrule_defaults {
+					name: "gen_defaults2",
+					srcs: ["in1"],
+				}
+
+				genrule {
+					name: "gen",
+					out: ["out"],
+					defaults: ["gen_defaults1", "gen_defaults2"],
+				}
+			`
+	ctx := testContext(config, bp, nil)
+	_, errs := ctx.ParseFileList(".", []string{"Android.bp"})
+	if errs == nil {
+		_, errs = ctx.PrepareBuildActions(config)
+	}
+	if errs != nil {
+		t.Fatal(errs)
+	}
+	gen := ctx.ModuleForTests("gen", "").Module().(*Module)
+
+	expectedCmd := "'cp ${in} __SBOX_OUT_FILES__'"
+	if gen.rawCommand != expectedCmd {
+		t.Errorf("Expected cmd: %q, actual: %q", expectedCmd, gen.rawCommand)
+	}
+
+	expectedSrcs := []string{"in1"}
+	if !reflect.DeepEqual(expectedSrcs, gen.properties.Srcs) {
+		t.Errorf("Expected srcs: %q, actual: %q", expectedSrcs, gen.properties.Srcs)
+	}
+}
+
 type testTool struct {
 	android.ModuleBase
 	outputFile android.Path