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