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 = "" 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 = "" 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