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