diff options
Diffstat (limited to 'java/java.go')
-rw-r--r-- | java/java.go | 91 |
1 files changed, 59 insertions, 32 deletions
diff --git a/java/java.go b/java/java.go index b76c2a4ed..b4ed20765 100644 --- a/java/java.go +++ b/java/java.go @@ -99,6 +99,12 @@ type CompilerProperties struct { // If set to false, don't allow this module to be installed. Defaults to true. Installable *bool + + // List of modules to use as annotation processors + Annotation_processors []string + + // List of classes to pass to javac to use as annotation processors + Annotation_processor_classes []string } type CompilerDeviceProperties struct { @@ -162,11 +168,12 @@ type dependencyTag struct { } var ( - staticLibTag = dependencyTag{name: "staticlib"} - libTag = dependencyTag{name: "javalib"} - bootClasspathTag = dependencyTag{name: "bootclasspath"} - frameworkResTag = dependencyTag{name: "framework-res"} - sdkDependencyTag = dependencyTag{name: "sdk"} + staticLibTag = dependencyTag{name: "staticlib"} + libTag = dependencyTag{name: "javalib"} + bootClasspathTag = dependencyTag{name: "bootclasspath"} + frameworkResTag = dependencyTag{name: "framework-res"} + sdkDependencyTag = dependencyTag{name: "sdk"} + annotationProcessorTag = dependencyTag{name: "annotation processor"} ) func (j *Module) deps(ctx android.BottomUpMutatorContext) { @@ -195,6 +202,7 @@ func (j *Module) deps(ctx android.BottomUpMutatorContext) { } ctx.AddDependency(ctx.Module(), libTag, j.properties.Libs...) ctx.AddDependency(ctx.Module(), staticLibTag, j.properties.Static_libs...) + ctx.AddDependency(ctx.Module(), annotationProcessorTag, j.properties.Annotation_processors...) android.ExtractSourcesDeps(ctx, j.properties.Srcs) } @@ -221,9 +229,18 @@ func (j *Module) aidlFlags(ctx android.ModuleContext, aidlPreprocess android.Opt return flags } -func (j *Module) collectDeps(ctx android.ModuleContext) (classpath, bootClasspath, staticJars, - aidlIncludeDirs, srcFileLists android.Paths, aidlPreprocess android.OptionalPath) { +type deps struct { + classpath android.Paths + bootClasspath android.Paths + staticJars android.Paths + aidlIncludeDirs android.Paths + srcFileLists android.Paths + annotationProcessors android.Paths + aidlPreprocess android.OptionalPath +} +func (j *Module) collectDeps(ctx android.ModuleContext) deps { + var deps deps ctx.VisitDirectDeps(func(module blueprint.Module) { otherName := ctx.OtherModuleName(module) tag := ctx.OtherModuleDependencyTag(module) @@ -240,50 +257,60 @@ func (j *Module) collectDeps(ctx android.ModuleContext) (classpath, bootClasspat switch tag { case bootClasspathTag: - bootClasspath = append(bootClasspath, dep.ClasspathFiles()...) + deps.bootClasspath = append(deps.bootClasspath, dep.ClasspathFiles()...) case libTag: - classpath = append(classpath, dep.ClasspathFiles()...) + deps.classpath = append(deps.classpath, dep.ClasspathFiles()...) case staticLibTag: - classpath = append(classpath, dep.ClasspathFiles()...) - staticJars = append(staticJars, dep.ClasspathFiles()...) + deps.classpath = append(deps.classpath, dep.ClasspathFiles()...) + deps.staticJars = append(deps.staticJars, dep.ClasspathFiles()...) + case annotationProcessorTag: + deps.annotationProcessors = append(deps.annotationProcessors, dep.ClasspathFiles()...) case frameworkResTag: if ctx.ModuleName() == "framework" { // framework.jar has a one-off dependency on the R.java and Manifest.java files // generated by framework-res.apk - srcFileLists = append(srcFileLists, module.(*AndroidApp).aaptJavaFileList) + deps.srcFileLists = append(deps.srcFileLists, module.(*AndroidApp).aaptJavaFileList) } case sdkDependencyTag: sdkDep := module.(sdkDependency) - bootClasspath = append(bootClasspath, sdkDep.ClasspathFiles()...) + deps.bootClasspath = append(deps.bootClasspath, sdkDep.ClasspathFiles()...) if sdkDep.AidlPreprocessed().Valid() { - if aidlPreprocess.Valid() { + if deps.aidlPreprocess.Valid() { ctx.ModuleErrorf("multiple dependencies with preprocessed aidls:\n %q\n %q", - aidlPreprocess, sdkDep.AidlPreprocessed()) + deps.aidlPreprocess, sdkDep.AidlPreprocessed()) } else { - aidlPreprocess = sdkDep.AidlPreprocessed() + deps.aidlPreprocess = sdkDep.AidlPreprocessed() } } default: panic(fmt.Errorf("unknown dependency %q for %q", otherName, ctx.ModuleName())) } - aidlIncludeDirs = append(aidlIncludeDirs, dep.AidlIncludeDirs()...) + deps.aidlIncludeDirs = append(deps.aidlIncludeDirs, dep.AidlIncludeDirs()...) }) - return + return deps } func (j *Module) compile(ctx android.ModuleContext) { j.exportAidlIncludeDirs = android.PathsForModuleSrc(ctx, j.deviceProperties.Export_aidl_include_dirs) - classpath, bootClasspath, staticJars, aidlIncludeDirs, srcFileLists, - aidlPreprocess := j.collectDeps(ctx) + deps := j.collectDeps(ctx) var flags javaBuilderFlags javacFlags := j.properties.Javacflags + if len(deps.annotationProcessors) > 0 { + javacFlags = append(javacFlags, + "-processorpath "+strings.Join(deps.annotationProcessors.Strings(), ":")) + } + + for _, c := range j.properties.Annotation_processor_classes { + javacFlags = append(javacFlags, "-processor "+c) + } + if j.properties.Java_version != nil { flags.javaVersion = *j.properties.Java_version } else { @@ -295,25 +322,25 @@ func (j *Module) compile(ctx android.ModuleContext) { flags.javacFlags = "$javacFlags" } - aidlFlags := j.aidlFlags(ctx, aidlPreprocess, aidlIncludeDirs) + aidlFlags := j.aidlFlags(ctx, deps.aidlPreprocess, deps.aidlIncludeDirs) if len(aidlFlags) > 0 { ctx.Variable(pctx, "aidlFlags", strings.Join(aidlFlags, " ")) flags.aidlFlags = "$aidlFlags" } - var deps android.Paths + var extraDeps android.Paths - if len(bootClasspath) > 0 { - flags.bootClasspath = "-bootclasspath " + strings.Join(bootClasspath.Strings(), ":") - deps = append(deps, bootClasspath...) + if len(deps.bootClasspath) > 0 { + flags.bootClasspath = "-bootclasspath " + strings.Join(deps.bootClasspath.Strings(), ":") + extraDeps = append(extraDeps, deps.bootClasspath...) } else if ctx.Device() { // Explicitly clear the bootclasspath for device builds flags.bootClasspath = `-bootclasspath ""` } - if len(classpath) > 0 { - flags.classpath = "-classpath " + strings.Join(classpath.Strings(), ":") - deps = append(deps, classpath...) + if len(deps.classpath) > 0 { + flags.classpath = "-classpath " + strings.Join(deps.classpath.Strings(), ":") + extraDeps = append(extraDeps, deps.classpath...) } srcFiles := ctx.ExpandSources(j.properties.Srcs, j.properties.Exclude_srcs) @@ -326,7 +353,7 @@ func (j *Module) compile(ctx android.ModuleContext) { } }) - srcFileLists = append(srcFileLists, j.ExtraSrcLists...) + deps.srcFileLists = append(deps.srcFileLists, j.ExtraSrcLists...) var extraJarDeps android.Paths @@ -334,7 +361,7 @@ func (j *Module) compile(ctx android.ModuleContext) { if len(srcFiles) > 0 { // Compile java sources into .class files - classes := TransformJavaToClasses(ctx, srcFiles, srcFileLists, flags, deps) + classes := TransformJavaToClasses(ctx, srcFiles, deps.srcFileLists, flags, extraDeps) if ctx.Failed() { return } @@ -346,7 +373,7 @@ func (j *Module) compile(ctx android.ModuleContext) { // the jar command so the two compiles can run in parallel. // TODO(ccross): Once we always compile with javac9 we may be able to conditionally // enable error-prone without affecting the output class files. - errorprone := RunErrorProne(ctx, srcFiles, srcFileLists, flags, deps) + errorprone := RunErrorProne(ctx, srcFiles, deps.srcFileLists, flags, extraDeps) extraJarDeps = append(extraJarDeps, errorprone) } @@ -366,7 +393,7 @@ func (j *Module) compile(ctx android.ModuleContext) { jars = append(jars, resourceJar) } - jars = append(jars, staticJars...) + jars = append(jars, deps.staticJars...) // Combine the classes built from sources, any manifests, and any static libraries into // classes-combined.jar. If there is only one input jar this step will be skipped. |