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. |