blob: 0f79ab0571fc7a6cf440e796a5e0de18d975b03c [file] [log] [blame]
import org.gradle.plugins.ide.idea.model.IdeaModel
import org.robolectric.gradle.SpotlessPlugin
buildscript {
apply from: 'dependencies.gradle'
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
dependencies {
gradle
classpath libs.android.gradle
classpath libs.error.prone.gradle
classpath libs.aggregate.javadocs.gradle
classpath libs.kotlin.gradle
classpath libs.spotless.gradle
classpath libs.detekt.gradle
classpath libs.roborazzi.gradle
}
}
allprojects {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
group = "org.robolectric"
version = thisVersion
}
apply plugin: 'idea'
// apply SpotlessPlugin
apply plugin: SpotlessPlugin
project.ext.configAnnotationProcessing = []
project.afterEvaluate {
def ideaProject = rootProject.extensions.getByType(IdeaModel).project
ideaProject.ipr.withXml { provider ->
def compilerConfiguration = provider.asNode().component.find { it.'@name' == 'CompilerConfiguration' }
// prevent compiler from complaining about duplicate classes...
def excludeFromCompile = compilerConfiguration.appendNode 'excludeFromCompile'
configAnnotationProcessing.each { Project subProject ->
def buildDirectory = subProject.layout.buildDirectory.get().asFile
excludeFromCompile.appendNode('directory',
[url: "file://$buildDirectory/classes/java/main/generated", includeSubdirectories: "true"])
}
// replace existing annotationProcessing tag with a new one...
compilerConfiguration.annotationProcessing.replaceNode {
annotationProcessing {
configAnnotationProcessing.each { Project subProject ->
profile(name: "${subProject.name}_main", enabled: "true") {
module(name: "${subProject.name}_main")
option(name: "org.robolectric.annotation.processing.shadowPackage",
value: subProject.shadows.packageName)
processor(name: "org.robolectric.annotation.processing.RobolectricProcessor")
processorPath(useClasspath: "false") {
project.project(":processor")
.configurations.named("runtime")
.configure { runtimeConfiguration ->
runtimeConfiguration.allArtifacts.each { artifact ->
entry(name: artifact.file)
}
runtimeConfiguration.files.each { file ->
entry(name: file)
}
}
}
}
}
}
}
}
}
apply plugin: 'nebula-aggregate-javadocs'
rootProject.gradle.projectsEvaluated {
rootProject.tasks.named("aggregateJavadocs").configure {
it.failOnError = false
}
}
gradle.projectsEvaluated {
def headerHtml = "<ul class=\"navList\" style=\"font-size: 1.5em;\"><li>Robolectric $thisVersion |" +
" <a href=\"/\" target=\"_top\">" +
"<img src=\"http://robolectric.org/images/logo-with-bubbles-down.png\"" +
" style=\"max-height: 18pt; vertical-align: sub;\"/></a></li></ul>"
project.allprojects { p ->
p.tasks.withType(Javadoc) {
options {
noTimestamp = true
links = [
"https://docs.oracle.com/javase/8/docs/api/",
"https://developer.android.com/reference/",
]
// Set javadoc source to JDK 8 to avoid unnamed module problem
// when running aggregateJavadoc with OpenJDK 13+.
source("8")
header = headerHtml
footer = headerHtml
// bottom = "<link rel=\"stylesheet\" href=\"http://robolectric.org/assets/css/main.css\">"
version = thisVersion
}
}
}
}
gradle.projectsEvaluated {
tasks.register('aggregateJsondocs', Copy) {
project.subprojects.findAll { it.plugins.hasPlugin(ShadowsPlugin) }.each { subproject ->
dependsOn subproject.tasks.named("compileJava")
from subproject.layout.buildDirectory.dir("docs/json")
}
into layout.buildDirectory.dir("docs/json")
}
}
tasks.register('aggregateDocs') {
dependsOn ':aggregateJavadocs'
dependsOn ':aggregateJsondocs'
}
tasks.register('prefetchSdks') {
AndroidSdk.ALL_SDKS.each { androidSdk ->
doLast {
println("Prefetching ${androidSdk.coordinates}...")
// prefetch into maven local repo...
def mvnCommand = "mvn -q dependency:get -DrepoUrl=http://maven.google.com \
-DgroupId=${androidSdk.groupId} -DartifactId=${androidSdk.artifactId} \
-Dversion=${androidSdk.version}"
shellExec(mvnCommand)
// prefetch into gradle local cache...
def config = configurations.create("sdk${androidSdk.apiLevel}")
dependencies.add("sdk${androidSdk.apiLevel}", androidSdk.coordinates)
// causes dependencies to be resolved:
config.files
}
}
}
tasks.register('prefetchInstrumentedSdks') {
AndroidSdk.ALL_SDKS.each { androidSdk ->
doLast {
println("Prefetching ${androidSdk.preinstrumentedCoordinates}...")
// prefetch into maven local repo...
def mvnCommand = "mvn -q dependency:get -DrepoUrl=http://maven.google.com \
-DgroupId=${androidSdk.groupId} -DartifactId=${androidSdk.preinstrumentedArtifactId} \
-Dversion=${androidSdk.preinstrumentedVersion}"
shellExec(mvnCommand)
// prefetch into gradle local cache...
def config = configurations.create("sdk${androidSdk.apiLevel}")
dependencies.add("sdk${androidSdk.apiLevel}", androidSdk.preinstrumentedCoordinates)
// causes dependencies to be resolved:
config.files
}
}
}
private void shellExec(String mvnCommand) {
def process = mvnCommand.execute()
def out = new StringBuffer()
def err = new StringBuffer()
process.consumeProcessOutput(out, err)
process.waitFor()
if (out.size() > 0) println out
if (err.size() > 0) println err
if (process.exitValue() != 0) System.exit(1)
}
tasks.register('prefetchDependencies') {
doLast {
allprojects.each { p ->
p.configurations.each { config ->
// causes dependencies to be resolved:
if (config.isCanBeResolved()) {
try {
config.files
} catch (ResolveException e) {
// ignore resolution issues for integration tests and test app, sigh
if (!p.path.startsWith(":integration_tests:")
&& !p.path.startsWith(":testapp")) {
throw e
}
}
}
}
}
}
}
// for use of external initialization scripts...
project.ext.allSdks = AndroidSdk.ALL_SDKS