1import org.gradle.plugins.ide.idea.model.IdeaModel 2import org.robolectric.gradle.SpotlessPlugin 3buildscript { 4 apply from: 'dependencies.gradle' 5 6 repositories { 7 google() 8 mavenCentral() 9 gradlePluginPortal() 10 } 11 12 dependencies { 13 gradle 14 classpath libs.android.gradle 15 classpath libs.error.prone.gradle 16 classpath libs.aggregate.javadocs.gradle 17 classpath libs.kotlin.gradle 18 classpath libs.spotless.gradle 19 classpath libs.detekt.gradle 20 classpath libs.roborazzi.gradle 21 } 22} 23 24allprojects { 25 repositories { 26 google() 27 mavenCentral() 28 gradlePluginPortal() 29 } 30 31 group = "org.robolectric" 32 version = thisVersion 33} 34 35apply plugin: 'idea' 36// apply SpotlessPlugin 37apply plugin: SpotlessPlugin 38 39project.ext.configAnnotationProcessing = [] 40project.afterEvaluate { 41 def ideaProject = rootProject.extensions.getByType(IdeaModel).project 42 ideaProject.ipr.withXml { provider -> 43 def compilerConfiguration = provider.asNode().component.find { it.'@name' == 'CompilerConfiguration' } 44 45 // prevent compiler from complaining about duplicate classes... 46 def excludeFromCompile = compilerConfiguration.appendNode 'excludeFromCompile' 47 configAnnotationProcessing.each { Project subProject -> 48 def buildDirectory = subProject.layout.buildDirectory.get().asFile 49 excludeFromCompile.appendNode('directory', 50 [url: "file://$buildDirectory/classes/java/main/generated", includeSubdirectories: "true"]) 51 } 52 53 // replace existing annotationProcessing tag with a new one... 54 compilerConfiguration.annotationProcessing.replaceNode { 55 annotationProcessing { 56 configAnnotationProcessing.each { Project subProject -> 57 profile(name: "${subProject.name}_main", enabled: "true") { 58 module(name: "${subProject.name}_main") 59 option(name: "org.robolectric.annotation.processing.shadowPackage", 60 value: subProject.shadows.packageName) 61 processor(name: "org.robolectric.annotation.processing.RobolectricProcessor") 62 63 processorPath(useClasspath: "false") { 64 project.project(":processor") 65 .configurations.named("runtime") 66 .configure { runtimeConfiguration -> 67 runtimeConfiguration.allArtifacts.each { artifact -> 68 entry(name: artifact.file) 69 } 70 runtimeConfiguration.files.each { file -> 71 entry(name: file) 72 } 73 } 74 } 75 } 76 } 77 } 78 } 79 } 80} 81 82apply plugin: 'nebula-aggregate-javadocs' 83 84rootProject.gradle.projectsEvaluated { 85 rootProject.tasks.named("aggregateJavadocs").configure { 86 it.failOnError = false 87 } 88} 89 90gradle.projectsEvaluated { 91 def headerHtml = "<ul class=\"navList\" style=\"font-size: 1.5em;\"><li>Robolectric $thisVersion |" + 92 " <a href=\"/\" target=\"_top\">" + 93 "<img src=\"http://robolectric.org/images/logo-with-bubbles-down.png\"" + 94 " style=\"max-height: 18pt; vertical-align: sub;\"/></a></li></ul>" 95 project.allprojects { p -> 96 p.tasks.withType(Javadoc) { 97 options { 98 noTimestamp = true 99 links = [ 100 "https://docs.oracle.com/javase/8/docs/api/", 101 "https://developer.android.com/reference/", 102 ] 103 // Set javadoc source to JDK 8 to avoid unnamed module problem 104 // when running aggregateJavadoc with OpenJDK 13+. 105 source("8") 106 header = headerHtml 107 footer = headerHtml 108 // bottom = "<link rel=\"stylesheet\" href=\"http://robolectric.org/assets/css/main.css\">" 109 version = thisVersion 110 } 111 } 112 } 113} 114 115gradle.projectsEvaluated { 116 tasks.register('aggregateJsondocs', Copy) { 117 project.subprojects.findAll { it.plugins.hasPlugin(ShadowsPlugin) }.each { subproject -> 118 dependsOn subproject.tasks.named("compileJava") 119 from subproject.layout.buildDirectory.dir("docs/json") 120 } 121 into layout.buildDirectory.dir("docs/json") 122 } 123} 124 125tasks.register('aggregateDocs') { 126 dependsOn ':aggregateJavadocs' 127 dependsOn ':aggregateJsondocs' 128} 129 130tasks.register('prefetchSdks') { 131 AndroidSdk.ALL_SDKS.each { androidSdk -> 132 doLast { 133 println("Prefetching ${androidSdk.coordinates}...") 134 // prefetch into maven local repo... 135 def mvnCommand = "mvn -q dependency:get -DrepoUrl=http://maven.google.com \ 136 -DgroupId=${androidSdk.groupId} -DartifactId=${androidSdk.artifactId} \ 137 -Dversion=${androidSdk.version}" 138 shellExec(mvnCommand) 139 140 // prefetch into gradle local cache... 141 def config = configurations.create("sdk${androidSdk.apiLevel}") 142 dependencies.add("sdk${androidSdk.apiLevel}", androidSdk.coordinates) 143 // causes dependencies to be resolved: 144 config.files 145 } 146 } 147} 148 149tasks.register('prefetchInstrumentedSdks') { 150 AndroidSdk.ALL_SDKS.each { androidSdk -> 151 doLast { 152 println("Prefetching ${androidSdk.preinstrumentedCoordinates}...") 153 // prefetch into maven local repo... 154 def mvnCommand = "mvn -q dependency:get -DrepoUrl=http://maven.google.com \ 155 -DgroupId=${androidSdk.groupId} -DartifactId=${androidSdk.preinstrumentedArtifactId} \ 156 -Dversion=${androidSdk.preinstrumentedVersion}" 157 shellExec(mvnCommand) 158 159 // prefetch into gradle local cache... 160 def config = configurations.create("sdk${androidSdk.apiLevel}") 161 dependencies.add("sdk${androidSdk.apiLevel}", androidSdk.preinstrumentedCoordinates) 162 // causes dependencies to be resolved: 163 config.files 164 } 165 } 166} 167 168private void shellExec(String mvnCommand) { 169 def process = mvnCommand.execute() 170 def out = new StringBuffer() 171 def err = new StringBuffer() 172 process.consumeProcessOutput(out, err) 173 process.waitFor() 174 if (out.size() > 0) println out 175 if (err.size() > 0) println err 176 if (process.exitValue() != 0) System.exit(1) 177} 178 179tasks.register('prefetchDependencies') { 180 doLast { 181 allprojects.each { p -> 182 p.configurations.each { config -> 183 // causes dependencies to be resolved: 184 if (config.isCanBeResolved()) { 185 try { 186 config.files 187 } catch (ResolveException e) { 188 // ignore resolution issues for integration tests and test app, sigh 189 if (!p.path.startsWith(":integration_tests:") 190 && !p.path.startsWith(":testapp")) { 191 throw e 192 } 193 } 194 } 195 } 196 } 197 } 198} 199 200// for use of external initialization scripts... 201project.ext.allSdks = AndroidSdk.ALL_SDKS 202