init.gradle revision 83ebc490a3749991fe049df215491ecc8f7a5cce
12eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar/*
22eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar * Copyright (C) 2016 The Android Open Source Project
32eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar *
42eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
52eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar * you may not use this file except in compliance with the License.
62eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar * You may obtain a copy of the License at
72eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar *
82eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
92eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar *
102eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar * Unless required by applicable law or agreed to in writing, software
112eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
122eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar * See the License for the specific language governing permissions and
142eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar * limitations under the License.
152eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar */
16450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar
172eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarimport org.gradle.internal.os.OperatingSystem
182eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyardef root = ext.supportRootFolder
19e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinetsext.usePrebuilts = "true" // for doclava
20450ed382339544eaf6b7886bc765522fc3446148Yigit Boyarext.inAppToolkitProject = rootProject.name == "app-toolkit"
21450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar
22450ed382339544eaf6b7886bc765522fc3446148Yigit Boyarif (ext.inAppToolkitProject) {
23e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinets    apply from: "${ext.supportRootFolder}/buildSrc/init.gradle"
24450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    init.loadDefaultVersions()
25450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    init.setSdkInLocalPropertiesFile()
26e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinets}
27450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar
282eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyardef checkoutRoot = "${root}/../.."
292eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarext.checkoutRoot = checkoutRoot
302eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarext.prebuiltsRoot = "$checkoutRoot/prebuilts"
312eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarext.prebuiltsRootUri = "file://${prebuiltsRoot}"
322eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar
332eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarfinal String platform = OperatingSystem.current().isMacOsX() ? 'darwin' : 'linux'
34c90eb815426eb89a589275a0a4a313791e43b7c2Sergey Vasilinetsfinal String fullSdkPath = new File("${checkoutRoot}/prebuilts/fullsdk-${platform}").getCanonicalPath()
35c90eb815426eb89a589275a0a4a313791e43b7c2Sergey VasilinetsSystem.setProperty('android.home', fullSdkPath)
362eb51995b418b034f58416876b6d27c74e19e4c7Yigit BoyarFile props = file("local.properties")
372eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarprops.write "sdk.dir=${fullSdkPath}"
382eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar
392eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyardef buildDir
402eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyardef distDir
4131be41e8a26d19fae442ecccfe45e692fa4016abSergey Vasilinetsdef supportLibBuildDir
42450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar
43beb35b4d84f972d2df210dde265dd87e8fe5a870Yigit Boyarif (ext.runningInBuildServer) {
4431be41e8a26d19fae442ecccfe45e692fa4016abSergey Vasilinets    supportLibBuildDir = new File(System.env.OUT_DIR + '/gradle/frameworks/support/build').getCanonicalFile();
4531be41e8a26d19fae442ecccfe45e692fa4016abSergey Vasilinets    buildDir = new File(System.env.OUT_DIR + '/gradle/frameworks/app-toolkit/build').getCanonicalFile()
462eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar    distDir = new File(System.env.DIST_DIR).getCanonicalFile()
472eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar} else {
4831be41e8a26d19fae442ecccfe45e692fa4016abSergey Vasilinets    supportLibBuildDir = file("${checkoutRoot}/out/host/gradle/frameworks/support/build")
49ed4fb5aab43da13f2203297071dd164e5a9a3d1aYigit Boyar    buildDir = file("${checkoutRoot}/out/host/gradle/frameworks/app-toolkit/build")
50450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    distDir = file("${checkoutRoot}/out/dist")
512eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar}
5225220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets
532eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyardef localMavenRepo = "file://${new File(buildDir, "flatfoot_repo").absolutePath}"
542eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarext.testApkDistOut = distDir
55beb35b4d84f972d2df210dde265dd87e8fe5a870Yigit Boyarext.testResultsDistDir = new File(distDir, "host-test-reports")
562eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarext.localMavenRepo = localMavenRepo
57450ed382339544eaf6b7886bc765522fc3446148Yigit Boyarfile(localMavenRepo).delete()
58450ed382339544eaf6b7886bc765522fc3446148Yigit Boyarfile(localMavenRepo).mkdirs()
592eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar
602eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarext.repoNames = ["$prebuiltsRootUri/maven_repo",
612eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                 "$prebuiltsRootUri/gradle-plugin",
622eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                 "$prebuiltsRootUri/tools/common/m2/repository",
632eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                 "$prebuiltsRootUri/tools/common/m2/internal",
642eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                 "$prebuiltsRootUri/tools/common/offline-m2",
652eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                 "$prebuiltsRootUri/maven_repo/android",
662eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                 "file://$fullSdkPath/extras/android/m2repository",
6731be41e8a26d19fae442ecccfe45e692fa4016abSergey Vasilinets                 "file://${new File(supportLibBuildDir, "support_repo").absolutePath}"]
682eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar
69450ed382339544eaf6b7886bc765522fc3446148Yigit Boyarapply from: "${ext.supportRootFolder}/app-toolkit/dependencies.gradle"
702eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarext.enablePublicRepos = System.getenv("ALLOW_PUBLIC_REPOS")
712eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar
722eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar// repository creation task
73450ed382339544eaf6b7886bc765522fc3446148Yigit Boyardef buildServerAnchorTask = rootProject.tasks.create(name : "runBuildServerCompilationTasks",
74450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    description: "Anchor task for everything we want to run in build server.")
75450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar
76450ed382339544eaf6b7886bc765522fc3446148Yigit Boyarif (ext.inAppToolkitProject) {
77450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    init.addMavenRepositories(repositories)
78450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    init.setupRepoOutAndBuildNumber()
79450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    init.configureSubProjects()
80450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    init.setupRelease()
81450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    init.enableDoclavaAndJDiff(this)
82450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar}
83450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar
84e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit Boyar
85e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit Boyar// flatfoot docs
86e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit Boyardef zipFlatfootDocsTask = rootProject.tasks.create(name : "createFlatfootDocsArchive", type : Zip) {
87e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit Boyar    from rootProject.docsDir
88e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit Boyar    destinationDir distDir
89e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit Boyar    baseName = String.format("flatfoot-docs-%s", rootProject.ext.flatfoot.release_version)
90e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit Boyar}
91e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit Boyar
92e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit BoyarbuildServerAnchorTask.dependsOn zipFlatfootDocsTask
93e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit BoyarzipFlatfootDocsTask.dependsOn rootProject.tasks["generateDocs"]
94e1bbf71e07cdf216510faed6174e30e78b862bd8Yigit Boyar
9524ac5438aa55aa2357cfb82d48079b48c5a8748dYigit Boyar// Disable API checks for now.
9624ac5438aa55aa2357cfb82d48079b48c5a8748dYigit BoyarcheckApiStable.enabled = false
9724ac5438aa55aa2357cfb82d48079b48c5a8748dYigit BoyarcheckApi.enabled = false
9824ac5438aa55aa2357cfb82d48079b48c5a8748dYigit Boyar
99450ed382339544eaf6b7886bc765522fc3446148Yigit BoyarbuildServerAnchorTask.dependsOn createArchive
1002eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar
1012eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarsubprojects {
1022eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar    configurations.all {
1032eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar        resolutionStrategy {
1042eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar            force "com.google.guava:guava-jdk5:17.0"
1052eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar        }
1062eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar    }
107450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    init.addMavenRepositories(project.repositories)
108e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinets    if (project.name == 'doclava' || project.name == 'jdiff') {
109e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinets        project.tasks.whenTaskAdded { task ->
110e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinets            if (task instanceof org.gradle.api.tasks.testing.Test) {
111e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinets                task.enabled = false
112e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinets            }
113e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinets        }
114e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinets        return
115e69e470336d0b6a1b4a16fe1783af17143d0c426Sergey Vasilinets    }
11683ebc490a3749991fe049df215491ecc8f7a5cceYigit Boyar
117450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    def mavenGroup = project.getPath().split(":")[1]
118450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    if (mavenGroup != "room" && mavenGroup != "lifecycle" && mavenGroup != "apptoolkit-core") {
119450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar        return
1202eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar    }
1215401646a273834c0c6c909b94bc4b7223b577940Yigit Boyar    project.tasks.whenTaskAdded { task ->
1225401646a273834c0c6c909b94bc4b7223b577940Yigit Boyar        if (task.name.startsWith("assembleAndroidTest")) {
1235401646a273834c0c6c909b94bc4b7223b577940Yigit Boyar            buildServerAnchorTask.dependsOn task
1245401646a273834c0c6c909b94bc4b7223b577940Yigit Boyar        }
1255401646a273834c0c6c909b94bc4b7223b577940Yigit Boyar    }
126450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    project.group = "com.android.support.$mavenGroup"
127450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar    project.version = flatfoot.release_version
128450ed382339544eaf6b7886bc765522fc3446148Yigit Boyar
1294d19f2e32099754f47664ed3ccb4662cb5465097Yigit Boyar    if (enablePublicRepos) {
1304d19f2e32099754f47664ed3ccb4662cb5465097Yigit Boyar        project.afterEvaluate {
1314d19f2e32099754f47664ed3ccb4662cb5465097Yigit Boyar            apply plugin: 'com.android.databinding.localizemaven'
1324d19f2e32099754f47664ed3ccb4662cb5465097Yigit Boyar            project.localizeMaven {
1334d19f2e32099754f47664ed3ccb4662cb5465097Yigit Boyar                localRepoDir = file("$prebuiltsRoot/tools/common/m2/repository")
1344d19f2e32099754f47664ed3ccb4662cb5465097Yigit Boyar                otherRepoDirs = repoNames
1354d19f2e32099754f47664ed3ccb4662cb5465097Yigit Boyar            }
1364d19f2e32099754f47664ed3ccb4662cb5465097Yigit Boyar        }
1374d19f2e32099754f47664ed3ccb4662cb5465097Yigit Boyar    }
1382eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar}
1392eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar
1402eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyardef createKotlinCheckstyle(Project project) {
14125220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    def fs = files();
14225220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    fs += files(project.sourceSets.main.allJava.srcDirs.collect{fileTree(it)})
14325220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    fs += files(project.sourceSets.test.allJava.srcDirs.collect{fileTree(it)})
14425220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    fs = fs.filter{file -> file.name.endsWith(".kt")}
14525220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    def kotlinCheckstyle = createCheckstyleTask(project, 'checkstyleKotlin',
14625220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets            "${project.rootProject.ext.supportRootFolder}/app-toolkit/kotlin-checkstyle.xml",
14725220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets            fs.files)
14825220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets
1492eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar    project.tasks.findByName("check").dependsOn(kotlinCheckstyle)
1502eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar    // poor man's line length check
1512eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar    def lineCheck = project.tasks.create(name : "lineLengthCheck") {
1522eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar        (project.sourceSets.main.allJava.getSourceDirectories() +
1532eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar            project.sourceSets.test.allJava.getSourceDirectories()).each { sourceDir ->
1542eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                  fileTree(dir : sourceDir, include : "**/*.kt").each{ file ->
1552eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                      file.readLines().eachWithIndex { line, index ->
1562eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                          if (line.size() > 100) {
1572eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                              throw new Exception("line too long: file: $file line:$index line: $line")
1582eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                          }
1592eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                      }
1602eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar                  }
1612eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar        }
1622eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar    }
1632eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar    kotlinCheckstyle.dependsOn(lineCheck)
1642eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar}
1652eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar
1662eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyardef createAndroidCheckstyle(Project project) {
16725220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    def fs = files()
16825220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    if (project.hasProperty('android')) {
16925220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets        fs += files(project.android.sourceSets.main.java.getSrcDirs().collect {fileTree(it)})
17025220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    }
17125220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    if (project.sourceSets.hasProperty('main')) {
17225220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets        fs += files(project.sourceSets.main.allJava)
17325220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    }
17425220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    fs = fs.filter{file -> file.name.endsWith(".java")}
17525220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets
17625220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    def checkStyle = createCheckstyleTask(project, 'checkstyleAndroid',
17725220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets            "${project.rootProject.ext.checkoutRoot}/prebuilts/checkstyle/android-style.xml",
17825220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets            fs.files)
17925220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    project.tasks.findByName("check").dependsOn(checkStyle)
18025220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets}
18125220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets
18225220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinetsdef createCheckstyleTask(project, taskName, configFile, inputFiles) {
18325220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    def arguments = ['-c', configFile]
18425220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    arguments.addAll(inputFiles)
18525220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    def checkStyle = project.tasks.create(name : taskName, type: JavaExec) {
18625220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets        inputs.files(inputFiles).skipWhenEmpty()
18725220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets        main = "com.puppycrawl.tools.checkstyle.Main"
18825220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets        args = arguments
18925220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets        classpath = files(file("${project.rootProject.ext.checkoutRoot}/prebuilts/checkstyle/checkstyle.jar").path)
1902eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar    }
19125220c41be213ea26b00fecb1f55c7ecdfb61c72Sergey Vasilinets    return checkStyle;
1922eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar}
1932eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyar
1942eb51995b418b034f58416876b6d27c74e19e4c7Yigit Boyarext.createKotlinCheckstyle = this.&createKotlinCheckstyle
195c90eb815426eb89a589275a0a4a313791e43b7c2Sergey Vasilinetsext.createAndroidCheckstyle = this.&createAndroidCheckstyle
196