Pass output file names into java.Transform* functions

Pass the output file name into the java.Transform* functions.
This consistently puts control of the filename into java.go,
which is often necessary to avoid collisions when the same
rule is used multiple times in a single module.  It also
has the side-effect of removing the poorly named "stem"
parameters.

Test: java_test.go
Change-Id: I7bc1d1f3bfae6f9d2c92870e6df381817817aab4
This commit is contained in:
Colin Cross
2017-10-16 17:09:48 -07:00
parent 1369cdb280
commit e9a275b440
2 changed files with 54 additions and 56 deletions

View File

@@ -135,23 +135,24 @@ type javaBuilderFlags struct {
protoOutFlag string protoOutFlag string
} }
func TransformJavaToClasses(ctx android.ModuleContext, srcFiles, srcFileLists android.Paths, func TransformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath,
flags javaBuilderFlags, deps android.Paths) android.ModuleOutPath { srcFiles, srcFileLists android.Paths,
flags javaBuilderFlags, deps android.Paths) {
return transformJavaToClasses(ctx, srcFiles, srcFileLists, flags, deps, transformJavaToClasses(ctx, outputFile, srcFiles, srcFileLists, flags, deps,
"classes-compiled.jar", "", "javac", javac) "", "javac", javac)
} }
func RunErrorProne(ctx android.ModuleContext, srcFiles, srcFileLists android.Paths, func RunErrorProne(ctx android.ModuleContext, outputFile android.WritablePath,
flags javaBuilderFlags) android.Path { srcFiles, srcFileLists android.Paths,
flags javaBuilderFlags) {
if config.ErrorProneJar == "" { if config.ErrorProneJar == "" {
ctx.ModuleErrorf("cannot build with Error Prone, missing external/error_prone?") ctx.ModuleErrorf("cannot build with Error Prone, missing external/error_prone?")
return nil
} }
return transformJavaToClasses(ctx, srcFiles, srcFileLists, flags, nil, transformJavaToClasses(ctx, outputFile, srcFiles, srcFileLists, flags, nil,
"classes-errorprone.list", "-errorprone", "errorprone", errorprone) "-errorprone", "errorprone", errorprone)
} }
// transformJavaToClasses takes source files and converts them to a jar containing .class files. // transformJavaToClasses takes source files and converts them to a jar containing .class files.
@@ -166,11 +167,10 @@ func RunErrorProne(ctx android.ModuleContext, srcFiles, srcFileLists android.Pat
// be printed at build time. The stem argument provides the file name of the output jar, and // be printed at build time. The stem argument provides the file name of the output jar, and
// suffix will be appended to various intermediate files and directories to avoid collisions when // suffix will be appended to various intermediate files and directories to avoid collisions when
// this function is called twice in the same module directory. // this function is called twice in the same module directory.
func transformJavaToClasses(ctx android.ModuleContext, srcFiles, srcFileLists android.Paths, func transformJavaToClasses(ctx android.ModuleContext, outputFile android.WritablePath,
flags javaBuilderFlags, deps android.Paths, stem, suffix, desc string, srcFiles, srcFileLists android.Paths,
rule blueprint.Rule) android.ModuleOutPath { flags javaBuilderFlags, deps android.Paths,
intermediatesSuffix, desc string, rule blueprint.Rule) {
outputFile := android.PathForModuleOut(ctx, stem)
javacFlags := flags.javacFlags javacFlags := flags.javacFlags
if len(srcFileLists) > 0 { if len(srcFileLists) > 0 {
@@ -200,19 +200,15 @@ func transformJavaToClasses(ctx android.ModuleContext, srcFiles, srcFileLists an
"javacFlags": javacFlags, "javacFlags": javacFlags,
"bootClasspath": bootClasspath, "bootClasspath": bootClasspath,
"classpath": flags.classpath.JavaClasspath(), "classpath": flags.classpath.JavaClasspath(),
"outDir": android.PathForModuleOut(ctx, "classes"+suffix).String(), "outDir": android.PathForModuleOut(ctx, "classes"+intermediatesSuffix).String(),
"annoDir": android.PathForModuleOut(ctx, "anno"+suffix).String(), "annoDir": android.PathForModuleOut(ctx, "anno"+intermediatesSuffix).String(),
"javaVersion": flags.javaVersion, "javaVersion": flags.javaVersion,
}, },
}) })
return outputFile
} }
func TransformResourcesToJar(ctx android.ModuleContext, jarArgs []string, func TransformResourcesToJar(ctx android.ModuleContext, outputFile android.WritablePath,
deps android.Paths) android.Path { jarArgs []string, deps android.Paths) {
outputFile := android.PathForModuleOut(ctx, "res.jar")
ctx.ModuleBuild(pctx, android.ModuleBuildParams{ ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Rule: jar, Rule: jar,
@@ -223,18 +219,10 @@ func TransformResourcesToJar(ctx android.ModuleContext, jarArgs []string,
"jarArgs": strings.Join(jarArgs, " "), "jarArgs": strings.Join(jarArgs, " "),
}, },
}) })
return outputFile
} }
func TransformJarsToJar(ctx android.ModuleContext, stem string, jars android.Paths, func TransformJarsToJar(ctx android.ModuleContext, outputFile android.WritablePath,
manifest android.OptionalPath, stripDirs bool) android.Path { jars android.Paths, manifest android.OptionalPath, stripDirs bool) {
outputFile := android.PathForModuleOut(ctx, stem)
if len(jars) == 1 && !manifest.Valid() {
return jars[0]
}
var deps android.Paths var deps android.Paths
@@ -258,14 +246,11 @@ func TransformJarsToJar(ctx android.ModuleContext, stem string, jars android.Pat
"jarArgs": strings.Join(jarArgs, " "), "jarArgs": strings.Join(jarArgs, " "),
}, },
}) })
return outputFile
} }
func TransformDesugar(ctx android.ModuleContext, classesJar android.Path, func TransformDesugar(ctx android.ModuleContext, outputFile android.WritablePath,
flags javaBuilderFlags) android.Path { classesJar android.Path, flags javaBuilderFlags) {
outputFile := android.PathForModuleOut(ctx, "classes-desugar.jar")
dumpDir := android.PathForModuleOut(ctx, "desugar_dumped_classes") dumpDir := android.PathForModuleOut(ctx, "desugar_dumped_classes")
javaFlags := "" javaFlags := ""
@@ -294,17 +279,14 @@ func TransformDesugar(ctx android.ModuleContext, classesJar android.Path,
"desugarFlags": flags.desugarFlags, "desugarFlags": flags.desugarFlags,
}, },
}) })
return outputFile
} }
// Converts a classes.jar file to classes*.dex, then combines the dex files with any resources // Converts a classes.jar file to classes*.dex, then combines the dex files with any resources
// in the classes.jar file into a dex jar. // in the classes.jar file into a dex jar.
func TransformClassesJarToDexJar(ctx android.ModuleContext, stem string, classesJar android.Path, func TransformClassesJarToDexJar(ctx android.ModuleContext, outputFile android.WritablePath,
flags javaBuilderFlags) android.Path { classesJar android.Path, flags javaBuilderFlags) {
outDir := android.PathForModuleOut(ctx, "dex") outDir := android.PathForModuleOut(ctx, "dex")
outputFile := android.PathForModuleOut(ctx, stem)
ctx.ModuleBuild(pctx, android.ModuleBuildParams{ ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Rule: dx, Rule: dx,
@@ -316,12 +298,10 @@ func TransformClassesJarToDexJar(ctx android.ModuleContext, stem string, classes
"outDir": outDir.String(), "outDir": outDir.String(),
}, },
}) })
return outputFile
} }
func TransformJarJar(ctx android.ModuleContext, classesJar android.Path, rulesFile android.Path) android.ModuleOutPath { func TransformJarJar(ctx android.ModuleContext, outputFile android.WritablePath,
outputFile := android.PathForModuleOut(ctx, "classes-jarjar.jar") classesJar android.Path, rulesFile android.Path) {
ctx.ModuleBuild(pctx, android.ModuleBuildParams{ ctx.ModuleBuild(pctx, android.ModuleBuildParams{
Rule: jarjar, Rule: jarjar,
Description: "jarjar", Description: "jarjar",
@@ -332,8 +312,6 @@ func TransformJarJar(ctx android.ModuleContext, classesJar android.Path, rulesFi
"rulesFile": rulesFile.String(), "rulesFile": rulesFile.String(),
}, },
}) })
return outputFile
} }
type classpath []android.Path type classpath []android.Path

View File

@@ -501,12 +501,14 @@ func (j *Module) compile(ctx android.ModuleContext) {
// a rebuild when error-prone is turned off). // a rebuild when error-prone is turned off).
// TODO(ccross): Once we always compile with javac9 we may be able to conditionally // TODO(ccross): Once we always compile with javac9 we may be able to conditionally
// enable error-prone without affecting the output class files. // enable error-prone without affecting the output class files.
errorprone := RunErrorProne(ctx, srcFiles, srcFileLists, flags) errorprone := android.PathForModuleOut(ctx, "classes-errorprone.list")
RunErrorProne(ctx, errorprone, srcFiles, srcFileLists, flags)
extraJarDeps = append(extraJarDeps, errorprone) extraJarDeps = append(extraJarDeps, errorprone)
} }
// Compile java sources into .class files // Compile java sources into .class files
classes := TransformJavaToClasses(ctx, srcFiles, srcFileLists, flags, extraJarDeps) classes := android.PathForModuleOut(ctx, "classes-compiled.jar")
TransformJavaToClasses(ctx, classes, srcFiles, srcFileLists, flags, extraJarDeps)
if ctx.Failed() { if ctx.Failed() {
return return
} }
@@ -533,7 +535,8 @@ func (j *Module) compile(ctx android.ModuleContext) {
} }
if len(resArgs) > 0 { if len(resArgs) > 0 {
resourceJar := TransformResourcesToJar(ctx, resArgs, resDeps) resourceJar := android.PathForModuleOut(ctx, "res.jar")
TransformResourcesToJar(ctx, resourceJar, resArgs, resDeps)
if ctx.Failed() { if ctx.Failed() {
return return
} }
@@ -548,12 +551,23 @@ func (j *Module) compile(ctx android.ModuleContext) {
// Combine the classes built from sources, any manifests, and any static libraries into // Combine the classes built from sources, any manifests, and any static libraries into
// classes.jar. If there is only one input jar this step will be skipped. // classes.jar. If there is only one input jar this step will be skipped.
outputFile := TransformJarsToJar(ctx, "classes.jar", jars, manifest, false) var outputFile android.Path
if len(jars) == 1 && !manifest.Valid() {
// Optimization: skip the combine step if there is nothing to do
outputFile = jars[0]
} else {
combinedJar := android.PathForModuleOut(ctx, "classes.jar")
TransformJarsToJar(ctx, combinedJar, jars, manifest, false)
outputFile = combinedJar
}
if j.properties.Jarjar_rules != nil { if j.properties.Jarjar_rules != nil {
jarjar_rules := android.PathForModuleSrc(ctx, *j.properties.Jarjar_rules) jarjar_rules := android.PathForModuleSrc(ctx, *j.properties.Jarjar_rules)
// Transform classes.jar into classes-jarjar.jar // Transform classes.jar into classes-jarjar.jar
outputFile = TransformJarJar(ctx, outputFile, jarjar_rules) jarjarFile := android.PathForModuleOut(ctx, "classes-jarjar.jar")
TransformJarJar(ctx, jarjarFile, outputFile, jarjar_rules)
outputFile = jarjarFile
if ctx.Failed() { if ctx.Failed() {
return return
} }
@@ -609,13 +623,17 @@ func (j *Module) compile(ctx android.ModuleContext) {
flags.desugarFlags = strings.Join(desugarFlags, " ") flags.desugarFlags = strings.Join(desugarFlags, " ")
desugarJar := TransformDesugar(ctx, outputFile, flags) desugarJar := android.PathForModuleOut(ctx, "classes-desugar.jar")
TransformDesugar(ctx, desugarJar, outputFile, flags)
outputFile = desugarJar
if ctx.Failed() { if ctx.Failed() {
return return
} }
// Compile classes.jar into classes.dex and then javalib.jar // Compile classes.jar into classes.dex and then javalib.jar
outputFile = TransformClassesJarToDexJar(ctx, "javalib.jar", desugarJar, flags) javalibJar := android.PathForModuleOut(ctx, "javalib.jar")
TransformClassesJarToDexJar(ctx, javalibJar, desugarJar, flags)
outputFile = javalibJar
if ctx.Failed() { if ctx.Failed() {
return return
} }
@@ -790,7 +808,9 @@ func (j *Import) DepsMutator(ctx android.BottomUpMutatorContext) {
func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) { func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
j.classpathFiles = android.PathsForModuleSrc(ctx, j.properties.Jars) j.classpathFiles = android.PathsForModuleSrc(ctx, j.properties.Jars)
j.combinedClasspathFile = TransformJarsToJar(ctx, "classes.jar", j.classpathFiles, android.OptionalPath{}, false) outputFile := android.PathForModuleOut(ctx, "classes.jar")
TransformJarsToJar(ctx, outputFile, j.classpathFiles, android.OptionalPath{}, false)
j.combinedClasspathFile = outputFile
} }
var _ Dependency = (*Import)(nil) var _ Dependency = (*Import)(nil)