1*cd0cc2e3SAndroid Build Coastguard Workerimport org.ajoberstar.grgit.Grgit 2*cd0cc2e3SAndroid Build Coastguard Workerimport org.gradle.util.VersionNumber 3*cd0cc2e3SAndroid Build Coastguard Worker 4*cd0cc2e3SAndroid Build Coastguard Workerbuildscript { 5*cd0cc2e3SAndroid Build Coastguard Worker repositories { 6*cd0cc2e3SAndroid Build Coastguard Worker google() 7*cd0cc2e3SAndroid Build Coastguard Worker mavenCentral() 8*cd0cc2e3SAndroid Build Coastguard Worker } 9*cd0cc2e3SAndroid Build Coastguard Worker dependencies { 10*cd0cc2e3SAndroid Build Coastguard Worker // This must be applied in the root project otherwise each subproject will 11*cd0cc2e3SAndroid Build Coastguard Worker // have it in a different ClassLoader. 12*cd0cc2e3SAndroid Build Coastguard Worker classpath libs.android.tools 13*cd0cc2e3SAndroid Build Coastguard Worker } 14*cd0cc2e3SAndroid Build Coastguard Worker} 15*cd0cc2e3SAndroid Build Coastguard Worker 16*cd0cc2e3SAndroid Build Coastguard Workerplugins { 17*cd0cc2e3SAndroid Build Coastguard Worker alias libs.plugins.bnd apply false 18*cd0cc2e3SAndroid Build Coastguard Worker alias libs.plugins.errorprone 19*cd0cc2e3SAndroid Build Coastguard Worker alias libs.plugins.grgit 20*cd0cc2e3SAndroid Build Coastguard Worker alias libs.plugins.osdetector 21*cd0cc2e3SAndroid Build Coastguard Worker alias libs.plugins.task.tree 22*cd0cc2e3SAndroid Build Coastguard Worker} 23*cd0cc2e3SAndroid Build Coastguard Worker 24*cd0cc2e3SAndroid Build Coastguard Workersubprojects { 25*cd0cc2e3SAndroid Build Coastguard Worker def androidProject = ((project.name == 'conscrypt-android') 26*cd0cc2e3SAndroid Build Coastguard Worker || (project.name == 'conscrypt-android-platform') 27*cd0cc2e3SAndroid Build Coastguard Worker || (project.name == 'conscrypt-benchmark-android') 28*cd0cc2e3SAndroid Build Coastguard Worker || (project.name == 'conscrypt-benchmark-caliper')) 29*cd0cc2e3SAndroid Build Coastguard Worker if (androidProject) { 30*cd0cc2e3SAndroid Build Coastguard Worker repositories { 31*cd0cc2e3SAndroid Build Coastguard Worker google() 32*cd0cc2e3SAndroid Build Coastguard Worker } 33*cd0cc2e3SAndroid Build Coastguard Worker } else { 34*cd0cc2e3SAndroid Build Coastguard Worker apply plugin: 'java-library' 35*cd0cc2e3SAndroid Build Coastguard Worker apply plugin: 'cpp' 36*cd0cc2e3SAndroid Build Coastguard Worker 37*cd0cc2e3SAndroid Build Coastguard Worker model { 38*cd0cc2e3SAndroid Build Coastguard Worker toolChains { 39*cd0cc2e3SAndroid Build Coastguard Worker visualCpp(VisualCpp) 40*cd0cc2e3SAndroid Build Coastguard Worker // Prefer Clang over Gcc (order here matters!) 41*cd0cc2e3SAndroid Build Coastguard Worker clang(Clang) { 42*cd0cc2e3SAndroid Build Coastguard Worker // Gradle 7.x still seems to get confused about toolchains on Mac 43*cd0cc2e3SAndroid Build Coastguard Worker // so explicitly add -arch args. 44*cd0cc2e3SAndroid Build Coastguard Worker target("osx_aarch64") { 45*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.withArguments { args -> 46*cd0cc2e3SAndroid Build Coastguard Worker args << "-arch" << "arm64" 47*cd0cc2e3SAndroid Build Coastguard Worker } 48*cd0cc2e3SAndroid Build Coastguard Worker linker.withArguments { args -> 49*cd0cc2e3SAndroid Build Coastguard Worker args << "-arch" << "arm64" 50*cd0cc2e3SAndroid Build Coastguard Worker } 51*cd0cc2e3SAndroid Build Coastguard Worker } 52*cd0cc2e3SAndroid Build Coastguard Worker target("osx_x86-64") { 53*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.withArguments { args -> 54*cd0cc2e3SAndroid Build Coastguard Worker args << "-arch" << "x86_64" 55*cd0cc2e3SAndroid Build Coastguard Worker } 56*cd0cc2e3SAndroid Build Coastguard Worker linker.withArguments { args -> 57*cd0cc2e3SAndroid Build Coastguard Worker args << "-arch" << "x86_64" 58*cd0cc2e3SAndroid Build Coastguard Worker } 59*cd0cc2e3SAndroid Build Coastguard Worker } 60*cd0cc2e3SAndroid Build Coastguard Worker } 61*cd0cc2e3SAndroid Build Coastguard Worker gcc(Gcc) 62*cd0cc2e3SAndroid Build Coastguard Worker } 63*cd0cc2e3SAndroid Build Coastguard Worker } 64*cd0cc2e3SAndroid Build Coastguard Worker } 65*cd0cc2e3SAndroid Build Coastguard Worker apply plugin: "jacoco" 66*cd0cc2e3SAndroid Build Coastguard Worker apply plugin: libs.plugins.errorprone.get().pluginId 67*cd0cc2e3SAndroid Build Coastguard Worker 68*cd0cc2e3SAndroid Build Coastguard Worker group = "org.conscrypt" 69*cd0cc2e3SAndroid Build Coastguard Worker description = 'Conscrypt is an alternate Java Security Provider that uses BoringSSL' 70*cd0cc2e3SAndroid Build Coastguard Worker version = "2.6-SNAPSHOT" 71*cd0cc2e3SAndroid Build Coastguard Worker 72*cd0cc2e3SAndroid Build Coastguard Worker ext { 73*cd0cc2e3SAndroid Build Coastguard Worker // Needs to be binary compatible with androidMinSdkVersion 74*cd0cc2e3SAndroid Build Coastguard Worker androidMinJavaVersion = JavaVersion.VERSION_1_8 75*cd0cc2e3SAndroid Build Coastguard Worker 76*cd0cc2e3SAndroid Build Coastguard Worker if (project.hasProperty("boringsslHome")) { 77*cd0cc2e3SAndroid Build Coastguard Worker boringsslHome = project.property("boringsslHome") 78*cd0cc2e3SAndroid Build Coastguard Worker } else { 79*cd0cc2e3SAndroid Build Coastguard Worker boringsslHome = "$System.env.BORINGSSL_HOME" 80*cd0cc2e3SAndroid Build Coastguard Worker } 81*cd0cc2e3SAndroid Build Coastguard Worker boringsslIncludeDir = normalizePath("$boringsslHome/include") 82*cd0cc2e3SAndroid Build Coastguard Worker 83*cd0cc2e3SAndroid Build Coastguard Worker // Ensure the environment is configured properly. 84*cd0cc2e3SAndroid Build Coastguard Worker assert file("$boringsslIncludeDir").exists() 85*cd0cc2e3SAndroid Build Coastguard Worker 86*cd0cc2e3SAndroid Build Coastguard Worker // Get the commit hash for BoringSSL. 87*cd0cc2e3SAndroid Build Coastguard Worker boringSslGit = Grgit.open(dir: boringsslHome) 88*cd0cc2e3SAndroid Build Coastguard Worker boringSslVersion = boringSslGit.head().id 89*cd0cc2e3SAndroid Build Coastguard Worker 90*cd0cc2e3SAndroid Build Coastguard Worker signJar = { jarPath -> 91*cd0cc2e3SAndroid Build Coastguard Worker if (rootProject.hasProperty('signingKeystore') && rootProject.hasProperty('signingPassword')) { 92*cd0cc2e3SAndroid Build Coastguard Worker def command = 'jarsigner -keystore ' + rootProject.signingKeystore + 93*cd0cc2e3SAndroid Build Coastguard Worker ' -storepass ' + rootProject.signingPassword + 94*cd0cc2e3SAndroid Build Coastguard Worker ' ' + jarPath + ' signingcert' 95*cd0cc2e3SAndroid Build Coastguard Worker def process = command.execute() 96*cd0cc2e3SAndroid Build Coastguard Worker process.waitFor() 97*cd0cc2e3SAndroid Build Coastguard Worker if (process.exitValue()) { 98*cd0cc2e3SAndroid Build Coastguard Worker throw new RuntimeException('Jar signing failed for ' + jarPath + ': ' + process.text) 99*cd0cc2e3SAndroid Build Coastguard Worker } 100*cd0cc2e3SAndroid Build Coastguard Worker } 101*cd0cc2e3SAndroid Build Coastguard Worker } 102*cd0cc2e3SAndroid Build Coastguard Worker } 103*cd0cc2e3SAndroid Build Coastguard Worker 104*cd0cc2e3SAndroid Build Coastguard Worker repositories { 105*cd0cc2e3SAndroid Build Coastguard Worker mavenCentral() 106*cd0cc2e3SAndroid Build Coastguard Worker mavenLocal() 107*cd0cc2e3SAndroid Build Coastguard Worker } 108*cd0cc2e3SAndroid Build Coastguard Worker 109*cd0cc2e3SAndroid Build Coastguard Worker jacoco { 110*cd0cc2e3SAndroid Build Coastguard Worker toolVersion = libs.versions.jacoco 111*cd0cc2e3SAndroid Build Coastguard Worker } 112*cd0cc2e3SAndroid Build Coastguard Worker 113*cd0cc2e3SAndroid Build Coastguard Worker configurations { 114*cd0cc2e3SAndroid Build Coastguard Worker jacocoAnt 115*cd0cc2e3SAndroid Build Coastguard Worker jacocoAgent 116*cd0cc2e3SAndroid Build Coastguard Worker } 117*cd0cc2e3SAndroid Build Coastguard Worker 118*cd0cc2e3SAndroid Build Coastguard Worker dependencies { 119*cd0cc2e3SAndroid Build Coastguard Worker jacocoAnt libs.jacoco.ant 120*cd0cc2e3SAndroid Build Coastguard Worker jacocoAgent libs.jacoco.agent 121*cd0cc2e3SAndroid Build Coastguard Worker } 122*cd0cc2e3SAndroid Build Coastguard Worker 123*cd0cc2e3SAndroid Build Coastguard Worker dependencies { 124*cd0cc2e3SAndroid Build Coastguard Worker errorprone libs.errorprone 125*cd0cc2e3SAndroid Build Coastguard Worker } 126*cd0cc2e3SAndroid Build Coastguard Worker 127*cd0cc2e3SAndroid Build Coastguard Worker tasks.register("generateProperties", WriteProperties) { 128*cd0cc2e3SAndroid Build Coastguard Worker ext { 129*cd0cc2e3SAndroid Build Coastguard Worker parsedVersion = VersionNumber.parse(version) 130*cd0cc2e3SAndroid Build Coastguard Worker } 131*cd0cc2e3SAndroid Build Coastguard Worker property("org.conscrypt.version.major", parsedVersion.getMajor()) 132*cd0cc2e3SAndroid Build Coastguard Worker property("org.conscrypt.version.minor", parsedVersion.getMinor()) 133*cd0cc2e3SAndroid Build Coastguard Worker property("org.conscrypt.version.patch", parsedVersion.getMicro()) 134*cd0cc2e3SAndroid Build Coastguard Worker property("org.conscrypt.boringssl.version", boringSslVersion) 135*cd0cc2e3SAndroid Build Coastguard Worker outputFile "build/generated/resources/org/conscrypt/conscrypt.properties" 136*cd0cc2e3SAndroid Build Coastguard Worker } 137*cd0cc2e3SAndroid Build Coastguard Worker 138*cd0cc2e3SAndroid Build Coastguard Worker if (!androidProject) { 139*cd0cc2e3SAndroid Build Coastguard Worker java { 140*cd0cc2e3SAndroid Build Coastguard Worker toolchain { 141*cd0cc2e3SAndroid Build Coastguard Worker languageVersion = JavaLanguageVersion.of(11) 142*cd0cc2e3SAndroid Build Coastguard Worker } 143*cd0cc2e3SAndroid Build Coastguard Worker } 144*cd0cc2e3SAndroid Build Coastguard Worker 145*cd0cc2e3SAndroid Build Coastguard Worker [tasks.named("compileJava"), tasks.named("compileTestJava")].forEach { t -> 146*cd0cc2e3SAndroid Build Coastguard Worker t.configure { 147*cd0cc2e3SAndroid Build Coastguard Worker options.compilerArgs += ["-Xlint:all", "-Xlint:-options", '-Xmaxwarns', '9999999'] 148*cd0cc2e3SAndroid Build Coastguard Worker options.encoding = "UTF-8" 149*cd0cc2e3SAndroid Build Coastguard Worker options.release = 8 150*cd0cc2e3SAndroid Build Coastguard Worker 151*cd0cc2e3SAndroid Build Coastguard Worker if (rootProject.hasProperty('failOnWarnings') && rootProject.failOnWarnings.toBoolean()) { 152*cd0cc2e3SAndroid Build Coastguard Worker options.compilerArgs += ["-Werror"] 153*cd0cc2e3SAndroid Build Coastguard Worker } 154*cd0cc2e3SAndroid Build Coastguard Worker } 155*cd0cc2e3SAndroid Build Coastguard Worker } 156*cd0cc2e3SAndroid Build Coastguard Worker 157*cd0cc2e3SAndroid Build Coastguard Worker tasks.named("compileTestJava").configure { 158*cd0cc2e3SAndroid Build Coastguard Worker // serialVersionUID is basically guaranteed to be useless in our tests 159*cd0cc2e3SAndroid Build Coastguard Worker options.compilerArgs += ["-Xlint:-serial"] 160*cd0cc2e3SAndroid Build Coastguard Worker } 161*cd0cc2e3SAndroid Build Coastguard Worker 162*cd0cc2e3SAndroid Build Coastguard Worker tasks.named("jar").configure { 163*cd0cc2e3SAndroid Build Coastguard Worker manifest { 164*cd0cc2e3SAndroid Build Coastguard Worker attributes('Implementation-Title': name, 165*cd0cc2e3SAndroid Build Coastguard Worker 'Implementation-Version': archiveVersion, 166*cd0cc2e3SAndroid Build Coastguard Worker 'Built-By': System.getProperty('user.name'), 167*cd0cc2e3SAndroid Build Coastguard Worker 'Built-JDK': System.getProperty('java.version'), 168*cd0cc2e3SAndroid Build Coastguard Worker 'Source-Compatibility': sourceCompatibility, 169*cd0cc2e3SAndroid Build Coastguard Worker 'Target-Compatibility': targetCompatibility) 170*cd0cc2e3SAndroid Build Coastguard Worker } 171*cd0cc2e3SAndroid Build Coastguard Worker } 172*cd0cc2e3SAndroid Build Coastguard Worker 173*cd0cc2e3SAndroid Build Coastguard Worker javadoc.options { 174*cd0cc2e3SAndroid Build Coastguard Worker encoding = 'UTF-8' 175*cd0cc2e3SAndroid Build Coastguard Worker links 'https://docs.oracle.com/en/java/javase/21/docs/api/java.base/' 176*cd0cc2e3SAndroid Build Coastguard Worker } 177*cd0cc2e3SAndroid Build Coastguard Worker 178*cd0cc2e3SAndroid Build Coastguard Worker tasks.register("javadocJar", Jar) { 179*cd0cc2e3SAndroid Build Coastguard Worker archiveClassifier = 'javadoc' 180*cd0cc2e3SAndroid Build Coastguard Worker from javadoc 181*cd0cc2e3SAndroid Build Coastguard Worker } 182*cd0cc2e3SAndroid Build Coastguard Worker 183*cd0cc2e3SAndroid Build Coastguard Worker tasks.register("sourcesJar", Jar) { 184*cd0cc2e3SAndroid Build Coastguard Worker archiveClassifier = 'sources' 185*cd0cc2e3SAndroid Build Coastguard Worker from sourceSets.main.allSource 186*cd0cc2e3SAndroid Build Coastguard Worker } 187*cd0cc2e3SAndroid Build Coastguard Worker 188*cd0cc2e3SAndroid Build Coastguard Worker // At a test failure, log the stack trace to the console so that we don't 189*cd0cc2e3SAndroid Build Coastguard Worker // have to open the HTML in a browser. 190*cd0cc2e3SAndroid Build Coastguard Worker test { 191*cd0cc2e3SAndroid Build Coastguard Worker testLogging { 192*cd0cc2e3SAndroid Build Coastguard Worker exceptionFormat = 'full' 193*cd0cc2e3SAndroid Build Coastguard Worker showExceptions true 194*cd0cc2e3SAndroid Build Coastguard Worker showCauses true 195*cd0cc2e3SAndroid Build Coastguard Worker showStackTraces true 196*cd0cc2e3SAndroid Build Coastguard Worker showStandardStreams = true 197*cd0cc2e3SAndroid Build Coastguard Worker } 198*cd0cc2e3SAndroid Build Coastguard Worker // Enable logging for all conscrypt classes while running tests. 199*cd0cc2e3SAndroid Build Coastguard Worker systemProperty 'java.util.logging.config.file', "${rootDir}/test_logging.properties" 200*cd0cc2e3SAndroid Build Coastguard Worker maxHeapSize = '1500m' 201*cd0cc2e3SAndroid Build Coastguard Worker } 202*cd0cc2e3SAndroid Build Coastguard Worker } 203*cd0cc2e3SAndroid Build Coastguard Worker} 204*cd0cc2e3SAndroid Build Coastguard Worker 205*cd0cc2e3SAndroid Build Coastguard Workerstatic String normalizePath(path) { 206*cd0cc2e3SAndroid Build Coastguard Worker new File(path.toString()).absolutePath 207*cd0cc2e3SAndroid Build Coastguard Worker} 208