普通文本  |  303行  |  11.02 KB

buildscript {
    ext.android_tools = 'com.android.tools.build:gradle:3.1.3'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        // This must be applied in the root project otherwise each subproject will
        // have it in a different ClassLoader.
        classpath android_tools
    }
}

plugins {
  // Add dependency for build script so we can access Git from our
  // build script.
  id 'org.ajoberstar.grgit' version '2.2.1'
  id 'net.ltgt.errorprone' version '0.0.11'
}

subprojects {
    def androidProject = ((project.name == 'conscrypt-android')
            || (project.name == 'conscrypt-android-platform')
            || (project.name == 'conscrypt-benchmark-android')
            || (project.name == 'conscrypt-benchmark-caliper'))
    if (androidProject) {
        repositories {
            google()
        }
    } else {
        apply plugin: 'java-library'
        apply plugin: 'cpp'

        model {
            toolChains {
                visualCpp(VisualCpp)
                // Prefer Clang over Gcc (order here matters!)
                clang(Clang)
                gcc(Gcc)
            }
        }
    }
    apply plugin: "maven"
    apply plugin: "signing"
    apply plugin: "idea"
    apply plugin: "jacoco"
    apply plugin: "net.ltgt.errorprone"

    group = "org.conscrypt"
    description = 'Conscrypt is an alternate Java Security Provider that uses BoringSSL'
    version = "2.1.0-SNAPSHOT"

    ext {
        os = org.gradle.internal.os.OperatingSystem.current();
        if (os.isLinux()) {
            osName = "linux"
        } else if (os.isMacOsX()) {
            osName = "osx"
        } else if (os.isWindows()) {
            osName = "windows"
        } else {
            throw new GradleException("Unsupported os: " + os.name)
        }

        if (project.hasProperty("boringsslHome")) {
            boringsslHome = project.property("boringsslHome")
        } else {
            boringsslHome = "$System.env.BORINGSSL_HOME"
        }

        boringsslIncludeDir = normalizePath("$boringsslHome/include")
        boringssl32BuildDir = normalizePath("$boringsslHome/build32")
        boringssl64BuildDir = normalizePath("$boringsslHome/build64")

        if (project.hasProperty("jdkHome")) {
            jdkHome = project.property("jdkHome")
        } else {
            jdkHome = "$System.env.JAVA_HOME"
        }
        jdkIncludeDir = normalizePath("$jdkHome/include")
        // Needs to be binary compatible with androidMinSdkVersion
        androidMinJavaVersion = JavaVersion.VERSION_1_7

        build32Bit = file("$boringssl32BuildDir").exists()
        build64Bit = file("$boringssl64BuildDir").exists()

        // Ensure the environment is configured properly.
        assert file("$boringsslHome").exists()
        assert file("$boringsslIncludeDir").exists()
        assert build32Bit || build64Bit
        assert file("$jdkHome").exists()
        assert file("$jdkIncludeDir").exists()

        // Get the commit hash for BoringSSL.
        boringSslGit = org.ajoberstar.grgit.Grgit.open(dir: boringsslHome)
        boringSslVersion = boringSslGit.head().id

        // Allow the java executable to be specified via env/property for each architecture.
        javaExecutable32 = System.getProperty('javaExecutable32', System.env.CONSCRYPT_JAVA_EXECUTABLE_32)
        javaExecutable64 = System.getProperty('javaExecutable64', System.env.CONSCRYPT_JAVA_EXECUTABLE_64)

        jmhVersion = '1.19'
        libraries = [
                android_tools: android_tools,
                roboelectric: 'org.robolectric:android-all:7.1.0_r7-robolectric-0',

                // Test dependencies.
                bouncycastle_apis: 'org.bouncycastle:bcpkix-jdk15on:1.56',
                bouncycastle_provider: 'org.bouncycastle:bcprov-jdk15on:1.56',
                junit  : 'junit:junit:4.12',
                mockito: 'org.mockito:mockito-core:1.9.5',
                truth  : 'com.google.truth:truth:0.28',

                // Benchmark dependencies
                jmh_core: "org.openjdk.jmh:jmh-core:${jmhVersion}",
                jmh_generator_annprocess: "org.openjdk.jmh:jmh-generator-annprocess:${jmhVersion}",
                jmh_generator_asm: "org.openjdk.jmh:jmh-generator-asm:${jmhVersion}",
                jmh_generator_bytecode: "org.openjdk.jmh:jmh-generator-bytecode:${jmhVersion}",
                jmh_generator_reflection: "org.openjdk.jmh:jmh-generator-reflection:${jmhVersion}",
                netty_handler: 'io.netty:netty-handler:4.1.8.Final',
                netty_tcnative: 'io.netty:netty-tcnative-boringssl-static:1.1.33.Fork26',
        ]

        signJar = { jarPath ->
            if (rootProject.hasProperty('signingKeystore') && rootProject.hasProperty('signingPassword')) {
                def command = 'jarsigner -keystore ' + rootProject.signingKeystore +
                        ' -storepass ' + rootProject.signingPassword +
                        ' ' + jarPath + ' signingcert'
                def process = command.execute()
                process.waitFor()
                if (process.exitValue()) {
                    throw new GradleException('Jar signing failed for ' + jarPath + ': ' + process.text)
                }
            }
        }
    }

    repositories {
        mavenCentral()
        mavenLocal()
        jcenter()
    }

    signing {
        required false
        sign configurations.archives
    }

    signArchives.doFirst {
        configurations.archives.allArtifacts.each {
            if (it.type == 'jar' && it.classifier != 'sources' && it.classifier != 'javadoc') {
                signJar(it.file.absolutePath)
            }
        }
    }

    task generateProperties(type: WriteProperties) {
        ext {
            parsedVersion = VersionNumber.parse(version)
        }
        property("org.conscrypt.version.major", parsedVersion.getMajor())
        property("org.conscrypt.version.minor", parsedVersion.getMinor())
        property("org.conscrypt.version.patch", parsedVersion.getMicro())
        property("org.conscrypt.boringssl.version", boringSslVersion)
        outputFile "build/generated/resources/org/conscrypt/conscrypt.properties"
    }

    if (!androidProject) {
        sourceCompatibility = JavaVersion.VERSION_1_7
        targetCompatibility = JavaVersion.VERSION_1_7

        [compileJava, compileTestJava].each() {
            it.options.compilerArgs += ["-Xlint:all", "-Xlint:-options", '-Xmaxwarns', '9999999']
            it.options.encoding = "UTF-8"
            if (rootProject.hasProperty('failOnWarnings') && rootProject.failOnWarnings.toBoolean()) {
                it.options.compilerArgs += ["-Werror"]
            }
        }

        compileTestJava {
            // serialVersionUID is basically guaranteed to be useless in our tests
            options.compilerArgs += ["-Xlint:-serial"]
        }

        jar.manifest {
            attributes('Implementation-Title': name,
                    'Implementation-Version': version,
                    'Built-By': System.getProperty('user.name'),
                    'Built-JDK': System.getProperty('java.version'),
                    'Source-Compatibility': sourceCompatibility,
                    'Target-Compatibility': targetCompatibility)
        }

        javadoc.options {
            encoding = 'UTF-8'
            links 'https://docs.oracle.com/javase/8/docs/api/'
        }

        // Disable JavaDoc doclint on Java 8. It's annoying.
        if (JavaVersion.current().isJava8Compatible()) {
            allprojects {
                tasks.withType(Javadoc) {
                    options.addStringOption('Xdoclint:none', '-quiet')
                }
            }
        }

        task javadocJar(type: Jar) {
            classifier = 'javadoc'
            from javadoc
        }

        task sourcesJar(type: Jar) {
            classifier = 'sources'
            from sourceSets.main.allSource
        }

        artifacts {
            archives sourcesJar
            archives javadocJar
        }

        uploadArchives.repositories.mavenDeployer {
            beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
            String stagingUrl
            if (rootProject.hasProperty('repositoryId')) {
                stagingUrl = 'https://oss.sonatype.org/service/local/staging/deployByRepositoryId/' +
                        rootProject.repositoryId
            } else {
                stagingUrl = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/'
            }
            def configureAuth = {
                if (rootProject.hasProperty('ossrhUsername') && rootProject.hasProperty('ossrhPassword')) {
                    authentication(userName: rootProject.ossrhUsername, password: rootProject.ossrhPassword)
                }
            }
            repository(url: stagingUrl, configureAuth)
            snapshotRepository(url: 'https://oss.sonatype.org/content/repositories/snapshots/', configureAuth)
        }

        [
                install.repositories.mavenInstaller,
                uploadArchives.repositories.mavenDeployer,
        ]*.pom*.whenConfigured { pom ->
            pom.project {
                name "$project.group:$project.name"
                description project.description
                url 'https://conscrypt.org/'

                scm {
                    connection 'scm:git:https://github.com/google/conscrypt.git'
                    developerConnection 'scm:git:git@github.com:google/conscrypt.git'
                    url 'https://github.com/google/conscrypt'
                }

                licenses {
                    license {
                        name 'Apache 2'
                        url 'https://www.apache.org/licenses/LICENSE-2.0'
                    }
                }

                developers {
                    developer {
                        id "conscrypt"
                        name "Conscrypt Contributors"
                        email "conscrypt@googlegroups.com"
                        url "https://conscrypt.org/"
                        organization = "Google, Inc."
                        organizationUrl "https://www.google.com"
                    }
                }
            }
        }

        // At a test failure, log the stack trace to the console so that we don't
        // have to open the HTML in a browser.
        test {
            testLogging {
                exceptionFormat = 'full'
                showExceptions true
                showCauses true
                showStackTraces true
                showStandardStreams = true
            }
            // Enable logging for all conscrypt classes while running tests.
            systemProperty 'java.util.logging.config.file', "${rootDir}/test_logging.properties"
            maxHeapSize = '1500m'

            // Override the default executable if manually specified
            if (build64Bit && javaExecutable64 != null) {
                executable javaExecutable64
            } else if (build32Bit && javaExecutable32 != null) {
                executable javaExecutable32
            }
        }
    }
}

static String normalizePath(path) {
    new File(path.toString()).absolutePath
}