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 }