blob: c41dc8c30bce7410fa9f26792565dfb871a6db01 [file] [log] [blame]
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.compile.JavaCompile
import java.util.jar.JarFile
@SuppressWarnings("GroovyUnusedDeclaration")
class ShadowsPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.apply plugin: 'idea'
project.extensions.create("shadows", ShadowsPluginExtension)
project.dependencies {
annotationProcessor project.project(":processor")
}
def compileJavaTask = project.tasks["compileJava"]
// write generated Java into its own dir... see https://github.com/gradle/gradle/issues/4956
def generatedSrcRelPath = 'build/generated/src/apt/main'
def generatedSrcDir = project.file(generatedSrcRelPath)
project.sourceSets.main.java { srcDir generatedSrcRelPath }
project.mkdir(generatedSrcDir)
compileJavaTask.options.annotationProcessorGeneratedSourcesDirectory = generatedSrcDir
compileJavaTask.outputs.dir(generatedSrcDir)
compileJavaTask.doFirst {
options.compilerArgs.add("-Aorg.robolectric.annotation.processing.jsonDocsEnabled=true")
options.compilerArgs.add("-Aorg.robolectric.annotation.processing.jsonDocsDir=${project.buildDir}/docs/json")
options.compilerArgs.add("-Aorg.robolectric.annotation.processing.shadowPackage=${project.shadows.packageName}")
options.compilerArgs.add("-Aorg.robolectric.annotation.processing.sdkCheckMode=${project.shadows.sdkCheckMode}")
}
// include generated sources in javadoc jar
project.tasks['javadoc'].source(generatedSrcDir)
// verify that we have the apt-generated files in our javadoc and sources jars
project.tasks['javadocJar'].doLast { task ->
def shadowPackageNameDir = project.shadows.packageName.replaceAll(/\./, '/')
checkForFile(task.archivePath, "${shadowPackageNameDir}/Shadows.html")
}
project.tasks['sourcesJar'].doLast { task ->
def shadowPackageNameDir = project.shadows.packageName.replaceAll(/\./, '/')
checkForFile(task.archivePath, "${shadowPackageNameDir}/Shadows.java")
}
project.rootProject.configAnnotationProcessing += project
/* Prevents sporadic compilation error:
* 'Bad service configuration file, or exception thrown while constructing
* Processor object: javax.annotation.processing.Processor: Error reading
* configuration file'
*
* See https://discuss.gradle.org/t/gradle-not-compiles-with-solder-tooling-jar/7583/20
*/
project.tasks.withType(JavaCompile) { options.fork = true }
}
static class ShadowsPluginExtension {
String packageName
String sdkCheckMode = "WARN"
}
private static void checkForFile(jar, String name) {
def files = new JarFile(jar).entries().collect { it.name }.toSet()
if (!files.contains(name)) {
throw new RuntimeException("Missing file ${name} in ${jar}")
}
}
}