build.gradle
author Michael Comella <michael.l.comella@gmail.com>
Fri, 25 Mar 2016 09:52:15 -0700
changeset 328249 fe11700b6cdfdb0fca3a9b2a54bf6d339792df24
parent 327637 1b70e9fe9db0c1829208283251e8edc308eee5f3
child 328261 81d754a0681160c34aa9ad4ba9d398d0d149eb7b
permissions -rw-r--r--
Bug 1258769 - Use soter to add checkstyle gradle task with simple checks. r=nalexander Run checkstyle via: ./mach gradle app:checkstyle This is intended to be added to automation in bug 1258787. Concerns with this patch: 1) I don't have a maven-metadata-local.xml. However, I didn't take the snapshotted version and [1] seems to indicate it's unnecessary for my particular build. For the addition of future checks, it's worth noting Google's config is available: https://github.com/checkstyle/checkstyle/blob/3e4367941c3e9680703e8ea8400abbd5dc78e1d9/src/main/resources/google_checks.xml And this version contains links with descriptions of each of the tasks: http://checkstyle.sourceforge.net/google_style.html [1]: https://maven.apache.org/ref/3.3.3/maven-repository-metadata/ MozReview-Commit-ID: ID3X9ZA27b0

import java.util.regex.Pattern

allprojects {
    // Expose the per-object-directory configuration to all projects.
    ext {
        mozconfig = gradle.mozconfig
        topsrcdir = gradle.mozconfig.topsrcdir
        topobjdir = gradle.mozconfig.topobjdir
    }

    repositories {
        if (gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORY) {
            maven {
                url gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORY
            }
        }
    }
}

buildDir "${topobjdir}/gradle/build"

buildscript {
    repositories {
        if (gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORY) {
            maven {
                url gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORY
            }
        }
        // For android-sdk-manager SNAPSHOT releases & soter.
        maven {
            url "file://${gradle.mozconfig.topsrcdir}/mobile/android/gradle/m2repo"
        }
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath('com.stanfy.spoon:spoon-gradle-plugin:1.0.4') {
            // Without these, we get errors linting.
            exclude module: 'guava'
        }
        // Provided in tree.
        classpath 'com.jakewharton.sdkmanager:gradle-plugin:1.5.0-SNAPSHOT'
        classpath "gradle.plugin.si.dlabs.gradle:soter:1.0.6"
    }
}

task generateCodeAndResources(type:Exec) {
    workingDir "${topobjdir}"

    commandLine mozconfig.substs.GMAKE
    args '-C'
    args "${topobjdir}/mobile/android/base"
    args 'gradle-targets'

    // Only show the output if something went wrong.
    ignoreExitValue = true
    standardOutput = new ByteArrayOutputStream()
    errorOutput = standardOutput
    doLast {
        if (execResult.exitValue != 0) {
            throw new GradleException("Process '${commandLine}' finished with non-zero exit value ${execResult.exitValue}:\n\n${standardOutput.toString()}")
        }
    }
}

// Skip unit test for all build variants, unless if it was specifically requested by user.
// The enabled property for the unit test tasks is reset based on the command line task names just before the task execution.
// I bet there is a easier/cleaner way to do this, but this gets the job done for now.
Pattern pattern = Pattern.compile('.*test(.+UnitTest)?.*')
boolean startTasksIncludeTest = gradle.startParameter.taskNames.any {
    taskName ->
        taskName.matches(pattern)
}
gradle.taskGraph.beforeTask {
    Task task ->
        if (task.name.matches(pattern)) {
            task.enabled = startTasksIncludeTest
        }
}

afterEvaluate {
    subprojects {
        if (!hasProperty('android')) {
            return
        }
        android.applicationVariants.all {
            preBuild.dependsOn rootProject.generateCodeAndResources
        }
        android.libraryVariants.all {
            preBuild.dependsOn rootProject.generateCodeAndResources
        }
    }
}

apply plugin: 'idea'

idea {
    project {
        languageLevel = '1.7'
    }

    module {
        // Object directories take a huge amount of time for IntelliJ to index.
        // Exclude them.  Convention is that object directories start with obj.
        // IntelliJ is clever and will not exclude the parts of the object
        // directory that are referenced, if there are any.  In practice,
        // indexing the entirety of the tree is taking too long, so exclude all
        // but mobile/.
        def topsrcdirURI = file(topsrcdir).toURI()
        excludeDirs += files(file(topsrcdir)
            .listFiles({it.isDirectory()} as FileFilter)
            .collect({topsrcdirURI.relativize(it.toURI()).toString()}) // Relative paths.
            .findAll({!it.equals('mobile/')}))

        // If topobjdir is below topsrcdir, hide only some portions of that tree.
        def topobjdirURI = file(topobjdir).toURI()
        if (!topsrcdirURI.relativize(topobjdirURI).isAbsolute()) {
            excludeDirs -= file(topobjdir)
            excludeDirs += files(file(topobjdir).listFiles())
            excludeDirs -= file("${topobjdir}/gradle")
        }

        if (!mozconfig.substs.MOZ_INSTALL_TRACKING) {
            excludeDirs += file("${topsrcdir}/mobile/android/thirdparty/com/adjust")
        }
    }
}

task wrapper(type: Wrapper) {
}