Merge "Generate build timing metrics to proto format file"
diff --git a/android/module.go b/android/module.go
index dc0c856..d2f84ce 100644
--- a/android/module.go
+++ b/android/module.go
@@ -190,6 +190,7 @@
GetProperties() []interface{}
BuildParamsForTests() []BuildParams
+ VariablesForTests() map[string]string
}
type nameProperties struct {
@@ -473,6 +474,7 @@
// For tests
buildParams []BuildParams
+ variables map[string]string
prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool
}
@@ -489,6 +491,10 @@
return a.buildParams
}
+func (a *ModuleBase) VariablesForTests() map[string]string {
+ return a.variables
+}
+
func (a *ModuleBase) Prefer32(prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool) {
a.prefer32 = prefer32
}
@@ -781,6 +787,7 @@
installDeps: a.computeInstallDeps(blueprintCtx),
installFiles: a.installFiles,
missingDeps: blueprintCtx.GetMissingDependencies(),
+ variables: make(map[string]string),
}
desc := "//" + ctx.ModuleDir() + ":" + ctx.ModuleName() + " "
@@ -842,6 +849,7 @@
}
a.buildParams = ctx.buildParams
+ a.variables = ctx.variables
}
type androidBaseContextImpl struct {
@@ -864,6 +872,7 @@
// For tests
buildParams []BuildParams
+ variables map[string]string
}
func (a *androidModuleContext) ninjaError(desc string, outputs []string, err error) {
@@ -928,6 +937,10 @@
}
func (a *androidModuleContext) Variable(pctx PackageContext, name, value string) {
+ if a.config.captureBuild {
+ a.variables[name] = value
+ }
+
a.ModuleContext.Variable(pctx.PackageContext, name, value)
}
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
diff --git a/java/java.go b/java/java.go
index 71967a8..c02ccd3 100644
--- a/java/java.go
+++ b/java/java.go
@@ -1011,8 +1011,15 @@
}
if j.properties.Patch_module != nil && flags.javaVersion == "1.9" {
- patchClasspath := ".:" + flags.classpath.FormJavaClassPath("")
- javacFlags = append(javacFlags, "--patch-module="+String(j.properties.Patch_module)+"="+patchClasspath)
+ // Manually specify build directory in case it is not under the repo root.
+ // (javac doesn't seem to expand into symbolc links when searching for patch-module targets, so
+ // just adding a symlink under the root doesn't help.)
+ patchPaths := ".:" + ctx.Config().BuildDir()
+ classPath := flags.classpath.FormJavaClassPath("")
+ if classPath != "" {
+ patchPaths += ":" + classPath
+ }
+ javacFlags = append(javacFlags, "--patch-module="+String(j.properties.Patch_module)+"="+patchPaths)
}
// systemModules
diff --git a/java/java_test.go b/java/java_test.go
index 4d4b836..2a54f69 100644
--- a/java/java_test.go
+++ b/java/java_test.go
@@ -1185,3 +1185,65 @@
}
}
}
+
+// TODO(jungjw): Consider making this more robust by ignoring path order.
+func checkPatchModuleFlag(t *testing.T, ctx *android.TestContext, moduleName string, expected string) {
+ variables := ctx.ModuleForTests(moduleName, "android_common").Module().VariablesForTests()
+ flags := strings.Split(variables["javacFlags"], " ")
+ got := ""
+ for _, flag := range flags {
+ keyEnd := strings.Index(flag, "=")
+ if keyEnd > -1 && flag[:keyEnd] == "--patch-module" {
+ got = flag[keyEnd+1:]
+ break
+ }
+ }
+ if expected != got {
+ t.Errorf("Unexpected patch-module flag for module %q - expected %q, but got %q", moduleName, expected, got)
+ }
+}
+
+func TestPatchModule(t *testing.T) {
+ bp := `
+ java_library {
+ name: "foo",
+ srcs: ["a.java"],
+ }
+
+ java_library {
+ name: "bar",
+ srcs: ["b.java"],
+ no_standard_libs: true,
+ system_modules: "none",
+ patch_module: "java.base",
+ }
+
+ java_library {
+ name: "baz",
+ srcs: ["c.java"],
+ patch_module: "java.base",
+ }
+ `
+
+ t.Run("1.8", func(t *testing.T) {
+ // Test default javac 1.8
+ ctx := testJava(t, bp)
+
+ checkPatchModuleFlag(t, ctx, "foo", "")
+ checkPatchModuleFlag(t, ctx, "bar", "")
+ checkPatchModuleFlag(t, ctx, "baz", "")
+ })
+
+ t.Run("1.9", func(t *testing.T) {
+ // Test again with javac 1.9
+ config := testConfig(map[string]string{"EXPERIMENTAL_USE_OPENJDK9": "true"})
+ ctx := testContext(config, bp, nil)
+ run(t, ctx, config)
+
+ checkPatchModuleFlag(t, ctx, "foo", "")
+ expected := "java.base=.:" + buildDir
+ checkPatchModuleFlag(t, ctx, "bar", expected)
+ expected = "java.base=" + strings.Join([]string{".", buildDir, moduleToPath("ext"), moduleToPath("framework")}, ":")
+ checkPatchModuleFlag(t, ctx, "baz", expected)
+ })
+}