diff --git a/android/package_ctx.go b/android/package_ctx.go index 530440392..2bc98aaf9 100644 --- a/android/package_ctx.go +++ b/android/package_ctx.go @@ -75,6 +75,22 @@ func (p AndroidPackageContext) SourcePathVariable(name, path string) blueprint.V }) } +// SourcePathVariableWithEnvOverride returns a Variable whose value is the source directory +// appended with the supplied path, or the value of the given environment variable if it is set. +// The environment variable is not required to point to a path inside the source tree. +// It may only be called during a Go package's initialization - either from the init() function or +// as part of a package-scoped variable's initialization. +func (p AndroidPackageContext) SourcePathVariableWithEnvOverride(name, path, env string) blueprint.Variable { + return p.VariableFunc(name, func(config interface{}) (string, error) { + ctx := &configErrorWrapper{p, config.(Config), []error{}} + p := safePathForSource(ctx, path) + if len(ctx.errors) > 0 { + return "", ctx.errors[0] + } + return config.(Config).GetenvWithDefault(env, p.String()), nil + }) +} + // HostBinVariable returns a Variable whose value is the path to a host tool // in the bin directory for host targets. It may only be called during a Go // package's initialization - either from the init() function or as part of a diff --git a/java/builder.go b/java/builder.go index 2e41a6047..017f64f8b 100644 --- a/java/builder.go +++ b/java/builder.go @@ -19,13 +19,11 @@ package java // functions. import ( - "path/filepath" "strings" "android/soong/android" "github.com/google/blueprint" - _ "github.com/google/blueprint/bootstrap" ) var ( @@ -39,36 +37,37 @@ var ( // read from directly using @) javac = pctx.AndroidGomaStaticRule("javac", blueprint.RuleParams{ - Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` + - `${JavacWrapper}$javacCmd ` + - `-encoding UTF-8 $javacFlags $bootClasspath $classpath ` + - `-extdirs "" -d $outDir @$out.rsp || ( rm -rf "$outDir"; exit 41 ) && ` + + Command: `rm -rf "$outDir" "$annoDir" && mkdir -p "$outDir" "$annoDir" && ` + + `${config.JavacWrapper}${config.JavacCmd} ${config.CommonJdkFlags} ` + + `$javacFlags $bootClasspath $classpath ` + + `-source $javaVersion -target $javaVersion ` + + `-d $outDir -s $annoDir @$out.rsp || ( rm -rf "$outDir"; exit 41 ) && ` + `find $outDir -name "*.class" > $out`, Rspfile: "$out.rsp", RspfileContent: "$in", }, - "javacCmd", "javacFlags", "bootClasspath", "classpath", "outDir") + "javacFlags", "bootClasspath", "classpath", "outDir", "annoDir", "javaVersion") jar = pctx.AndroidStaticRule("jar", blueprint.RuleParams{ - Command: `$jarCmd -o $out $jarArgs`, - CommandDeps: []string{"$jarCmd"}, + Command: `${config.SoongZipCmd} -o $out -d $jarArgs`, + CommandDeps: []string{"${config.SoongZipCmd}"}, }, "jarCmd", "jarArgs") dx = pctx.AndroidStaticRule("dx", blueprint.RuleParams{ Command: `rm -rf "$outDir" && mkdir -p "$outDir" && ` + - `$dxCmd --dex --output=$outDir $dxFlags $in || ( rm -rf "$outDir"; exit 41 ) && ` + - `find "$outDir" -name "classes*.dex" > $out`, - CommandDeps: []string{"$dxCmd"}, + `${config.DxCmd} --dex --output=$outDir $dxFlags $in || ( rm -rf "$outDir"; exit 41 ) && ` + + `find "$outDir" -name "classes*.dex" | sort > $out`, + CommandDeps: []string{"${config.DxCmd}"}, }, "outDir", "dxFlags") jarjar = pctx.AndroidStaticRule("jarjar", blueprint.RuleParams{ - Command: "java -jar $jarjarCmd process $rulesFile $in $out", - CommandDeps: []string{"$jarjarCmd", "$rulesFile"}, + Command: "${config.JavaCmd} -jar ${config.JarjarCmd} process $rulesFile $in $out", + CommandDeps: []string{"${config.JavaCmd}", "${config.JarjarCmd}", "$rulesFile"}, }, "rulesFile") @@ -83,19 +82,7 @@ var ( ) func init() { - pctx.Import("github.com/google/blueprint/bootstrap") - pctx.StaticVariable("commonJdkFlags", "-source 1.7 -target 1.7 -Xmaxerrs 9999999") - pctx.StaticVariable("javacCmd", "javac -J-Xmx1024M $commonJdkFlags") - pctx.StaticVariable("jarCmd", filepath.Join("${bootstrap.ToolDir}", "soong_zip")) - pctx.HostBinToolVariable("dxCmd", "dx") - pctx.HostJavaToolVariable("jarjarCmd", "jarjar.jar") - - pctx.VariableFunc("JavacWrapper", func(config interface{}) (string, error) { - if override := config.(android.Config).Getenv("JAVAC_WRAPPER"); override != "" { - return override + " ", nil - } - return "", nil - }) + pctx.Import("android/soong/java/config") } type javaBuilderFlags struct { @@ -104,6 +91,7 @@ type javaBuilderFlags struct { bootClasspath string classpath string aidlFlags string + javaVersion string } type jarSpec struct { @@ -118,6 +106,7 @@ func TransformJavaToClasses(ctx android.ModuleContext, srcFiles android.Paths, s flags javaBuilderFlags, deps android.Paths) jarSpec { classDir := android.PathForModuleOut(ctx, "classes") + annoDir := android.PathForModuleOut(ctx, "anno") classFileList := android.PathForModuleOut(ctx, "classes.list") javacFlags := flags.javacFlags + android.JoinWithPrefix(srcFileLists.Strings(), "@") @@ -135,6 +124,8 @@ func TransformJavaToClasses(ctx android.ModuleContext, srcFiles android.Paths, s "bootClasspath": flags.bootClasspath, "classpath": flags.classpath, "outDir": classDir.String(), + "annoDir": annoDir.String(), + "javaVersion": flags.javaVersion, }, }) diff --git a/java/config/config.go b/java/config/config.go index 848d09d12..44651cb4c 100644 --- a/java/config/config.go +++ b/java/config/config.go @@ -14,10 +14,53 @@ package config -import "android/soong/android" +import ( + "path/filepath" + "strings" + + _ "github.com/google/blueprint/bootstrap" + + "android/soong/android" +) var ( + pctx = android.NewPackageContext("android/soong/java/config") + DefaultLibraries = []string{"core-oj", "core-libart", "ext", "framework", "okhttp"} ) -var pctx = android.NewPackageContext("android/soong/java/config") +func init() { + pctx.Import("github.com/google/blueprint/bootstrap") + + pctx.StaticVariable("CommonJdkFlags", strings.Join([]string{ + `-J-Xmx2048M`, + `-Xmaxerrs 9999999`, + `-encoding UTF-8`, + `-sourcepath ""`, + `-g`, + }, " ")) + + pctx.StaticVariable("DefaultJavaVersion", "1.8") + + pctx.VariableConfigMethod("hostPrebuiltTag", android.Config.PrebuiltOS) + + pctx.SourcePathVariableWithEnvOverride("JavaHome", + "prebuilts/jdk/jdk8/${hostPrebuiltTag}", "OVERRIDE_ANDROID_JAVA_HOME") + pctx.SourcePathVariable("JavaToolchain", "${JavaHome}/bin") + pctx.SourcePathVariableWithEnvOverride("JavacCmd", + "${JavaToolchain}/javac", "ALTERNATE_JAVAC") + pctx.SourcePathVariable("JavaCmd", "${JavaToolchain}/java") + pctx.SourcePathVariable("JarCmd", "${JavaToolchain}/jar") + pctx.SourcePathVariable("JavadocCmd", "${JavaToolchain}/javadoc") + + pctx.StaticVariable("SoongZipCmd", filepath.Join("${bootstrap.ToolDir}", "soong_zip")) + pctx.HostBinToolVariable("DxCmd", "dx") + pctx.HostJavaToolVariable("JarjarCmd", "jarjar.jar") + + pctx.VariableFunc("JavacWrapper", func(config interface{}) (string, error) { + if override := config.(android.Config).Getenv("JAVAC_WRAPPER"); override != "" { + return override + " ", nil + } + return "", nil + }) +} diff --git a/java/config/makevars.go b/java/config/makevars.go index 670245432..ec0d9397a 100644 --- a/java/config/makevars.go +++ b/java/config/makevars.go @@ -26,4 +26,14 @@ func init() { func makeVarsProvider(ctx android.MakeVarsContext) { ctx.Strict("TARGET_DEFAULT_JAVA_LIBRARIES", strings.Join(DefaultLibraries, " ")) + + ctx.Strict("DEFAULT_JAVA_LANGUAGE_VERSION", "${DefaultJavaVersion}") + + ctx.Strict("ANDROID_JAVA_HOME", "${JavaHome}") + ctx.Strict("ANDROID_JAVA_TOOLCHAIN", "${JavaToolchain}") + ctx.Strict("JAVA", "${JavaCmd}") + ctx.Strict("JAVAC", "${JavacCmd}") + ctx.Strict("JAR", "${JarCmd}") + ctx.Strict("JAVADOC", "${JavadocCmd}") + ctx.Strict("COMMON_JDK_FLAGS", "${CommonJdkFlags}") } diff --git a/java/java.go b/java/java.go index 37d959bc6..4c614e5df 100644 --- a/java/java.go +++ b/java/java.go @@ -92,6 +92,9 @@ type CompilerProperties struct { // if not blank, run jarjar using the specified rules file Jarjar_rules *string + + // If not blank, set the java version passed to javac as -source and -target + Java_version *string } type CompilerDeviceProperties struct { @@ -285,6 +288,13 @@ func (j *Module) compile(ctx android.ModuleContext) { var flags javaBuilderFlags javacFlags := j.properties.Javacflags + + if j.properties.Java_version != nil { + flags.javaVersion = *j.properties.Java_version + } else { + flags.javaVersion = "${config.DefaultJavaVersion}" + } + if len(javacFlags) > 0 { ctx.Variable(pctx, "javacFlags", strings.Join(javacFlags, " ")) flags.javacFlags = "$javacFlags"