build.gradle revision d437f7eeb199ed9bf9fb9bed664258dbbcd87130
1import groovy.xml.QName
2
3buildscript {
4    ext.dataBindingRootFolder = project.projectDir
5    apply from: 'propLoader.gradle'
6    ext.addRepos(repositories)
7    if (ext.dataBindingConfig.addRemoteRepos) {
8        dependencies {
9            classpath "com.android.databinding:localizemaven:${dataBindingConfig.extraPluginsVersion}"
10        }
11    }
12    dependencies {
13        classpath 'net.sf.proguard:proguard-gradle:5.2.1'
14    }
15}
16
17subprojects {
18    if (dataBindingConfig.isIndependent) {
19        apply plugin: 'maven'
20        if (dataBindingConfig.addRemoteRepos && !dataBindingConfig.forGradlePlugin) {
21            apply plugin: 'com.android.databinding.localizemaven'
22        }
23    } else {
24        apply from: "${project.projectDir}/../../buildSrc/base/baseJava.gradle"
25    }
26
27    if (it.name != "compilationTests") {
28        group = dataBindingConfig.group
29        version = dataBindingConfig.version
30        uploadArchives {
31            repositories {
32                mavenDeployer {
33                    repository(url: "file://${dataBindingConfig.mavenRepoDir}")
34                }
35            }
36        }
37    }
38
39    buildscript {
40        addRepos(repositories)
41    }
42
43}
44
45if (dataBindingConfig.addRemoteRepos && !dataBindingConfig.forGradlePlugin) {
46    localizeMaven {
47        localRepoDir = file(dataBindingConfig.megaRepoDir)
48        otherRepoDirs = dataBindingConfig.localRepositories
49    }
50}
51
52task deleteRepo(type: Delete) {
53    delete "${dataBindingConfig.mavenRepoDir}/${dataBindingConfig.group.replace('.', '/')}"
54}
55
56task deletePrebuildFolder(type: Delete) {
57    delete "${dataBindingConfig.prebuildFolder}"
58}
59
60task deleteEap(type: Delete) {
61    delete "${dataBindingConfig.eapOutDir}"
62}
63
64
65def buildExtensionsTask = project.tasks.create "buildExtensionsTask", Exec
66buildExtensionsTask.workingDir file('extensions').getAbsolutePath()
67buildExtensionsTask.commandLine './gradlew'
68buildExtensionsTask.args 'clean', 'uploadArchives', '--info', '--stacktrace',
69        "-PuseReleaseVersion=${dataBindingConfig.inReleaseBuild ? 'true' : 'false'}",
70        "-PaddRemoteRepos=${dataBindingConfig.addRemoteRepos ? 'true' : 'false'}",
71        "-PforGradlePlugin=${dataBindingConfig.forGradlePlugin ? 'true' : 'false'}"
72buildExtensionsTask.dependsOn subprojects.uploadArchives
73
74def prepareExtensionPrebuilds = project.tasks.create "prepareExtensionPrebuilds", Exec
75prepareExtensionPrebuilds.workingDir file('extensions').getAbsolutePath()
76prepareExtensionPrebuilds.commandLine './gradlew'
77prepareExtensionPrebuilds.args 'clean', 'preparePrebuilds', '--info', '--stacktrace',
78        "-PuseReleaseVersion=${dataBindingConfig.inReleaseBuild ? 'true' : 'false'}",
79        "-PaddRemoteRepos=${dataBindingConfig.addRemoteRepos ? 'true' : 'false'}",
80        "-PforGradlePlugin=${dataBindingConfig.forGradlePlugin ? 'true' : 'false'}"
81prepareExtensionPrebuilds.dependsOn subprojects.uploadArchives
82
83file('integration-tests').listFiles().findAll { it.isDirectory() }.each {
84    println("Creating run test task for  ${it.getAbsolutePath()}.")
85    def testTask = project.tasks.create "runTestsOf${it.getName().capitalize()}", Exec
86    testTask.workingDir it.getAbsolutePath()
87    //on linux
88    testTask.commandLine './gradlew'
89    testTask.args 'clean', 'connectedCheck', '--info', '--stacktrace',
90            "-PuseReleaseVersion=${dataBindingConfig.inReleaseBuild ? 'true' : 'false'}",
91            "-PaddRemoteRepos=${dataBindingConfig.addRemoteRepos ? 'true' : 'false'}",
92            "-PforGradlePlugin=${dataBindingConfig.forGradlePlugin ? 'true' : 'false'}"
93    testTask.dependsOn subprojects.uploadArchives
94}
95
96task runIntegrationTests {
97    dependsOn tasks.findAll { task -> task.name.startsWith('runTestsOf') }
98}
99
100task runAllTests {
101    dependsOn runIntegrationTests
102}
103
104task preparePrebuilds() {
105    dependsOn deletePrebuildFolder
106    dependsOn prepareExtensionPrebuilds
107}
108
109allprojects {
110    afterEvaluate { project ->
111        runAllTests.dependsOn project.tasks.findAll {task -> task.name.equals('test')}
112        runAllTests.dependsOn project.tasks.findAll {task -> task.name.equals('connectedCheck')}
113        preparePrebuilds.dependsOn project.tasks.findAll {task -> task.name.startsWith('prebuild')}
114    }
115}
116
117subprojects.uploadArchives.each { it.shouldRunAfter deleteRepo  }
118subprojects.uploadArchives.each { it.shouldRunAfter deletePrebuildFolder  }
119
120buildExtensionsTask.shouldRunAfter deleteRepo
121tasks['runTestsOfMultiModuleTestApp'].dependsOn tasks['runTestsOfIndependentLibrary']
122
123
124task rebuildRepo() {
125    dependsOn deleteRepo
126    dependsOn subprojects.uploadArchives
127}
128
129task copySamplesToEap(type : Copy) {
130    mustRunAfter deleteEap
131    from ("$projectDir/samples") {
132        exclude "**/build"
133        exclude "**/local.properties"
134    }
135    into "${dataBindingConfig.eapOutDir}/samples"
136}
137
138
139task copyMavenRepoToEap(type : Copy) {
140    mustRunAfter deleteEap
141    dependsOn rebuildRepo
142    from(dataBindingConfig.mavenRepoDir)
143    into "${dataBindingConfig.eapOutDir}/${dataBindingConfig.mavenRepoName}"
144}
145
146tasks.create(name : 'createEapdataBindingConfigFile') << {
147    def propsFile = new File("${dataBindingConfig.eapOutDir}/databinding.properties")
148    Properties props = new Properties()
149    props.setProperty('version', dataBindingConfig.version)
150    props.setProperty('mavenRepoName', dataBindingConfig.mavenRepoName)
151    props.store(propsFile.newWriter(), null)
152}
153
154task batchEAP() {
155    dependsOn deleteEap
156    dependsOn copyMavenRepoToEap
157    dependsOn copySamplesToEap
158    dependsOn createEapdataBindingConfigFile
159}
160
161def findChildByTag(node, tag) {
162    return node.children().find {
163        it.name().getLocalPart().equals(tag)
164    }
165}
166
167def fullJar(project) {
168    def localizeTask = project.parent.tasks.findByName('localizeDependencies')
169    if (localizeTask != null) {
170        localizeTask.dependsOn project.tasks.findByName('buildLicenseNotice')
171    }
172
173    if (!dataBindingConfig.runProguard || !dataBindingConfig.inReleaseBuild) {
174        return
175    }
176    def jarName = project.uploadArchives.repositories.mavenDeployer.pom.artifactId
177    def workingDir = "${project.buildDir}/intermediates/fullJar"
178    def fatJar = "${workingDir}/${jarName}-fat.jar"
179    def proguardJar = "${workingDir}/${jarName}-proguard.jar"
180    def jarJar = project.jar.archivePath
181
182    project.configurations {
183        jarJarArchives
184    }
185
186    project.tasks.create(name: 'fatJar', type: Jar) {
187        baseName = jarName + '-fat'
188        doFirst {
189            file(workingDir).mkdirs()
190        }
191        def deps = new HashSet<ResolvedDependency>()
192        project.configurations.compile.resolvedConfiguration.firstLevelModuleDependencies.each {
193            if (!it.moduleGroup.startsWith('com.android.tools')) {
194                deps.addAll(it.allModuleArtifacts)
195            }
196        }
197        from { deps.findAll { !it.name.contains('baseLibrary') && !it.name.contains("juniversalchardet")}.collect {
198            it.file.isDirectory() ? it.file : project.zipTree(it.file)
199        } } {
200            exclude "META-INF/maven/**"
201            exclude "META-INF/MANIFEST.MF"
202            exclude "META-INF/LICENSE.txt"
203            exclude "META-INF/NOTICE.txt"
204            exclude "META-INF/services/javax.annotation.processing.Processor"
205            exclude "**/*.stg"
206        }
207        archiveName "${baseName}.jar"
208        destinationDir = new File(workingDir)
209        with project.jar
210    }
211    project.tasks.create(name: 'proguard', type: proguard.gradle.ProGuardTask) {
212        dependsOn 'fatJar'
213
214        injars  fatJar
215        outjars proguardJar
216
217        configuration '../proguard.cfg'
218    }
219
220    project.tasks.create(name: 'jarJarFile') {
221        dependsOn 'proguard'
222        dependsOn project.jar
223        def inputLibrary = proguardJar
224        def outputLibrary = jarJar
225        inputs.file(inputLibrary)
226        outputs.file(outputLibrary)
227
228        doLast {
229            def jarJarLibrary = new File(dataBindingConfig.externalPrebuiltsBase,
230                    'tools/common/m2/repository/com/googlecode/jarjar/jarjar/1.3/jarjar-1.3.jar').
231                    getCanonicalPath()
232            // in Ant
233            ant.taskdef(name: "jarjarIt",
234                    classname: 'com.tonicsystems.jarjar.JarJarTask',
235                    classpath: jarJarLibrary)
236            // start jarjar task
237            ant.jarjarIt(jarfile: outputLibrary) {
238                // input is our inputLibrary
239                zipfileset(src: inputLibrary)
240                // rule to repackage antlr to new package
241                rule pattern: 'org.antlr.**', result: 'com.google.repacked.antlr.@1'
242                rule pattern: 'com.tunnelvisionlabs.**', result: 'com.google.repacked.tunnelvision.@1'
243                rule pattern: 'org.abego.treelayout.**', result: 'com.google.repacked.treelayout.@1'
244                // rule to repackage commons
245                rule pattern: 'org.apache.**', result: 'com.google.repacked.apache.@1'
246                rule pattern: 'kotlin.**', result: 'com.google.repacked.kotlin.@1'
247            }
248        }
249    }
250
251    project.uploadArchives {
252        dependsOn 'jarJarFile'
253        repositories {
254            mavenDeployer {
255                pom.whenConfigured { pom ->
256                    pom.dependencies.removeAll { dep ->
257                        def isBaseLibrary = dep.groupId == 'com.android.databinding' &&
258                                dep.artifactId == 'baseLibrary'
259                        def isGradle = dep.groupId == 'com.android.tools.build' &&
260                                dep.artifactId == 'gradle'
261                        def isChardet = dep.groupId == 'com.googlecode.juniversalchardet' &&
262                                dep.artifactId == 'juniversalchardet'
263                        return !isBaseLibrary && !isGradle && !isChardet
264                    }
265                }
266            }
267        }
268        outputs.upToDateWhen { false } // force it to re-run all the time.
269    }
270    project.bintrayUpload.dependsOn 'jarJarFile'
271    project.publishing.publications.mavenJava(MavenPublication) {
272            pom.withXml {
273                def deps = findChildByTag(asNode(), "dependencies")
274                if (deps == null) {
275                    throw new IllegalArgumentException("cannot find dependencies in pom file")
276                }
277                def unwanted = deps.children().findAll {
278                    def groupId = findChildByTag(it, "groupId").localText()[0]
279                    def artifactId = findChildByTag(it, "artifactId").localText()[0]
280                    def isBaseLibrary = groupId == 'com.android.databinding' &&
281                            artifactId == 'baseLibrary'
282                    def isGradle = groupId == 'com.android.tools.build' && artifactId == 'gradle'
283                    def isChardet = groupId == 'com.googlecode.juniversalchardet' &&
284                            artifactId == 'juniversalchardet'
285                    return !isBaseLibrary && !isGradle && !isChardet
286                }
287                unwanted.each {
288                    deps.remove(it)
289                }
290            }
291    }
292}
293