• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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