Home | History | Annotate | Download | only in data-binding
      1 import groovy.xml.QName
      2 
      3 buildscript {
      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 
     17 subprojects {
     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 
     45 if (dataBindingConfig.addRemoteRepos && !dataBindingConfig.forGradlePlugin) {
     46     rootProject.localizeMaven {
     47         localRepoDir = file(dataBindingConfig.megaRepoDir)
     48         otherRepoDirs = dataBindingConfig.localRepositories
     49     }
     50 }
     51 
     52 task deleteRepo(type: Delete) {
     53     delete "${dataBindingConfig.mavenRepoDir}/${dataBindingConfig.group.replace('.', '/')}"
     54 }
     55 
     56 task deletePrebuildFolder(type: Delete) {
     57     delete "${dataBindingConfig.prebuildFolder}"
     58 }
     59 
     60 task deleteEap(type: Delete) {
     61     delete "${dataBindingConfig.eapOutDir}"
     62 }
     63 
     64 
     65 def buildExtensionsTask = project.tasks.create "buildExtensionsTask", Exec
     66 buildExtensionsTask.workingDir file('extensions').getAbsolutePath()
     67 buildExtensionsTask.commandLine './gradlew'
     68 buildExtensionsTask.args 'clean', 'uploadArchives', '--info', '--stacktrace',
     69         "-PuseReleaseVersion=${dataBindingConfig.inReleaseBuild ? 'true' : 'false'}",
     70         "-PaddRemoteRepos=${dataBindingConfig.addRemoteRepos ? 'true' : 'false'}",
     71         "-PforGradlePlugin=${dataBindingConfig.forGradlePlugin ? 'true' : 'false'}"
     72 buildExtensionsTask.dependsOn subprojects.uploadArchives
     73 
     74 def prepareExtensionPrebuilds = project.tasks.create "prepareExtensionPrebuilds", Exec
     75 prepareExtensionPrebuilds.workingDir file('extensions').getAbsolutePath()
     76 prepareExtensionPrebuilds.commandLine './gradlew'
     77 prepareExtensionPrebuilds.args 'clean', 'preparePrebuilds', '--info', '--stacktrace',
     78         "-PuseReleaseVersion=${dataBindingConfig.inReleaseBuild ? 'true' : 'false'}",
     79         "-PaddRemoteRepos=${dataBindingConfig.addRemoteRepos ? 'true' : 'false'}",
     80         "-PforGradlePlugin=${dataBindingConfig.forGradlePlugin ? 'true' : 'false'}"
     81 prepareExtensionPrebuilds.dependsOn subprojects.uploadArchives
     82 
     83 file('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 
     96 task runIntegrationTests {
     97     dependsOn tasks.findAll { task -> task.name.startsWith('runTestsOf') }
     98 }
     99 
    100 task runAllTests {
    101     dependsOn runIntegrationTests
    102 }
    103 
    104 task preparePrebuilds() {
    105     dependsOn deletePrebuildFolder
    106     dependsOn prepareExtensionPrebuilds
    107 }
    108 
    109 allprojects {
    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 
    117 subprojects.uploadArchives.each { it.shouldRunAfter deleteRepo  }
    118 subprojects.uploadArchives.each { it.shouldRunAfter deletePrebuildFolder  }
    119 
    120 buildExtensionsTask.shouldRunAfter deleteRepo
    121 tasks['runTestsOfMultiModuleTestApp'].dependsOn tasks['runTestsOfIndependentLibrary']
    122 
    123 
    124 task rebuildRepo() {
    125     dependsOn deleteRepo
    126     dependsOn subprojects.uploadArchives
    127 }
    128 
    129 task 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 
    139 task copyMavenRepoToEap(type : Copy) {
    140     mustRunAfter deleteEap
    141     dependsOn rebuildRepo
    142     from(dataBindingConfig.mavenRepoDir)
    143     into "${dataBindingConfig.eapOutDir}/${dataBindingConfig.mavenRepoName}"
    144 }
    145 
    146 tasks.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 
    154 task batchEAP() {
    155     dependsOn deleteEap
    156     dependsOn copyMavenRepoToEap
    157     dependsOn copySamplesToEap
    158     dependsOn createEapdataBindingConfigFile
    159 }
    160 
    161 def findChildByTag(node, tag) {
    162     return node.children().find {
    163         it.name().getLocalPart().equals(tag)
    164     }
    165 }
    166 
    167 def fullJar(project) {
    168     def localizeTask = project.parent.tasks.findByName('localizeDependencies')
    169     if (localizeTask != null) {
    170         localizeTask.dependsOn project.tasks.findByName('buildLicenseNotice')
    171     }
    172     if (!dataBindingConfig.inReleaseBuild) {
    173         return
    174     }
    175     def jarName = project.uploadArchives.repositories.mavenDeployer.pom.artifactId
    176     def workingDir = "${project.buildDir}/intermediates/fullJar"
    177     def fatJar = "${workingDir}/${jarName}-fat.jar"
    178     def proguardJar = "${workingDir}/${jarName}-proguard.jar"
    179     def jarJar = project.jar.archivePath
    180     def runProguard = dataBindingConfig.runProguard
    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     /**
    212      * not used unless jarJarFile is changed to use proguarded version instead.
    213      */
    214     project.tasks.create(name: 'proguard', type: proguard.gradle.ProGuardTask) {
    215         dependsOn 'fatJar'
    216 
    217         injars  fatJar
    218         outjars proguardJar
    219 
    220         configuration '../proguard.cfg'
    221     }
    222 
    223     project.tasks.create(name: 'jarJarFile') {
    224         dependsOn runProguard ? 'proguard' : 'fatJar'
    225         dependsOn project.jar
    226         def inputLibrary = runProguard ? proguardJar : fatJar
    227         def outputLibrary = jarJar
    228         inputs.file(inputLibrary)
    229         outputs.file(outputLibrary)
    230 
    231         doLast {
    232             def jarJarLibrary = new File(dataBindingConfig.externalPrebuiltsBase,
    233                     'tools/common/m2/repository/com/googlecode/jarjar/jarjar/1.4/jarjar-1.4.jar').
    234                     getCanonicalPath()
    235             // in Ant
    236             ant.taskdef(name: "jarjarIt",
    237                     classname: 'com.tonicsystems.jarjar.JarJarTask',
    238                     classpath: jarJarLibrary)
    239             // start jarjar task
    240             ant.jarjarIt(jarfile: outputLibrary) {
    241                 // input is our inputLibrary
    242                 zipfileset(src: inputLibrary)
    243                 // rule to repackage antlr to new package
    244                 rule pattern: 'org.antlr.**', result: 'com.google.repacked.org.antlr.@1'
    245                 rule pattern: 'org.abego.treelayout.**', result: 'com.google.repacked.treelayout.@1'
    246                 // rule to repackage commons
    247                 rule pattern: 'org.apache.**', result: 'com.google.repacked.apache.@1'
    248                 rule pattern: 'kotlin.**', result: 'com.google.repacked.kotlin.@1'
    249             }
    250         }
    251     }
    252 
    253     def setupUpload = { uploadTask ->
    254         uploadTask.dependsOn 'jarJarFile'
    255         uploadTask.repositories {
    256                 mavenDeployer {
    257                     pom.whenConfigured { pom ->
    258                         pom.dependencies.removeAll { dep ->
    259                             def isBaseLibrary = dep.groupId == 'com.android.databinding' &&
    260                                     dep.artifactId == 'baseLibrary'
    261                             def isGradle = dep.groupId == 'com.android.tools.build' &&
    262                                     dep.artifactId == 'gradle'
    263                             def isChardet = dep.groupId == 'com.googlecode.juniversalchardet' &&
    264                                     dep.artifactId == 'juniversalchardet'
    265                             return !isBaseLibrary && !isGradle && !isChardet
    266                         }
    267                     }
    268                 }
    269             }
    270         uploadTask.outputs.upToDateWhen { false } // force it to re-run all the time.
    271     }
    272 
    273     if (project.publishLocal != null) {
    274         setupUpload(project.publishLocal)
    275     }
    276     if (project.uploadArchives != null) {
    277         setupUpload(project.uploadArchives)
    278     }
    279 
    280     project.bintrayUpload.dependsOn 'jarJarFile'
    281     project.publishing.publications.mavenJava(MavenPublication) {
    282             pom.withXml {
    283                 def deps = findChildByTag(asNode(), "dependencies")
    284                 if (deps == null) {
    285                     throw new IllegalArgumentException("cannot find dependencies in pom file")
    286                 }
    287                 def unwanted = deps.children().findAll {
    288                     def groupId = findChildByTag(it, "groupId").localText()[0]
    289                     def artifactId = findChildByTag(it, "artifactId").localText()[0]
    290                     def isBaseLibrary = groupId == 'com.android.databinding' &&
    291                             artifactId == 'baseLibrary'
    292                     def isGradle = groupId == 'com.android.tools.build' && artifactId == 'gradle'
    293                     def isChardet = groupId == 'com.googlecode.juniversalchardet' &&
    294                             artifactId == 'juniversalchardet'
    295                     return !isBaseLibrary && !isGradle && !isChardet
    296                 }
    297                 unwanted.each {
    298                     deps.remove(it)
    299                 }
    300             }
    301     }
    302 }
    303