1*cd0cc2e3SAndroid Build Coastguard Workerplugins { 2*cd0cc2e3SAndroid Build Coastguard Worker alias libs.plugins.bnd 3*cd0cc2e3SAndroid Build Coastguard Worker alias libs.plugins.shadow 4*cd0cc2e3SAndroid Build Coastguard Worker} 5*cd0cc2e3SAndroid Build Coastguard Worker 6*cd0cc2e3SAndroid Build Coastguard Workerimport aQute.bnd.gradle.BundleTaskConvention 7*cd0cc2e3SAndroid Build Coastguard Workerimport com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar 8*cd0cc2e3SAndroid Build Coastguard Workerimport org.codehaus.groovy.runtime.InvokerHelper 9*cd0cc2e3SAndroid Build Coastguard Worker 10*cd0cc2e3SAndroid Build Coastguard Workerdescription = 'Conscrypt: OpenJdk' 11*cd0cc2e3SAndroid Build Coastguard Worker 12*cd0cc2e3SAndroid Build Coastguard Worker// Gradle mostly uses Java os.arch names for architectures which feeds into default 13*cd0cc2e3SAndroid Build Coastguard Worker// targetPlatform names. Notable exception Gradle 6.9.x reports MacOS/ARM as 14*cd0cc2e3SAndroid Build Coastguard Worker// arm-v8. 15*cd0cc2e3SAndroid Build Coastguard Worker// 16*cd0cc2e3SAndroid Build Coastguard Worker// The Maven osdetector plugin (which we recommend to developers) uses different 17*cd0cc2e3SAndroid Build Coastguard Worker// arch names, so that's what we need for artifacts. 18*cd0cc2e3SAndroid Build Coastguard Worker// 19*cd0cc2e3SAndroid Build Coastguard Worker// This class encapsulates both naming schemes as well as other per-platform information 20*cd0cc2e3SAndroid Build Coastguard Worker// about native builds, more of which will migrate in here over time. 21*cd0cc2e3SAndroid Build Coastguard Workerenum NativeBuildInfo { 22*cd0cc2e3SAndroid Build Coastguard Worker WINDOWS_X86_64("windows", "x86_64"), 23*cd0cc2e3SAndroid Build Coastguard Worker LINUX_X86_64("linux", "x86_64"), 24*cd0cc2e3SAndroid Build Coastguard Worker MAC_X86_64("osx", "x86_64") { 25*cd0cc2e3SAndroid Build Coastguard Worker String libDir() { 26*cd0cc2e3SAndroid Build Coastguard Worker "build.x86" 27*cd0cc2e3SAndroid Build Coastguard Worker } 28*cd0cc2e3SAndroid Build Coastguard Worker }, 29*cd0cc2e3SAndroid Build Coastguard Worker MAC_AARCH64("osx", "aarch_64") { 30*cd0cc2e3SAndroid Build Coastguard Worker String libDir() { 31*cd0cc2e3SAndroid Build Coastguard Worker "build.arm" 32*cd0cc2e3SAndroid Build Coastguard Worker } 33*cd0cc2e3SAndroid Build Coastguard Worker }; 34*cd0cc2e3SAndroid Build Coastguard Worker 35*cd0cc2e3SAndroid Build Coastguard Worker static String buildDir = "FIXME" // See below 36*cd0cc2e3SAndroid Build Coastguard Worker 37*cd0cc2e3SAndroid Build Coastguard Worker public final String os 38*cd0cc2e3SAndroid Build Coastguard Worker public final String arch 39*cd0cc2e3SAndroid Build Coastguard Worker 40*cd0cc2e3SAndroid Build Coastguard Worker // Maps osdetector arch to Gradle equivalent. 41*cd0cc2e3SAndroid Build Coastguard Worker private static final gradleArchMap = [ 42*cd0cc2e3SAndroid Build Coastguard Worker "aarch_64": "aarch64", 43*cd0cc2e3SAndroid Build Coastguard Worker "x86_64" : "x86-64", 44*cd0cc2e3SAndroid Build Coastguard Worker ] 45*cd0cc2e3SAndroid Build Coastguard Worker 46*cd0cc2e3SAndroid Build Coastguard Worker NativeBuildInfo(String os, String arch) { 47*cd0cc2e3SAndroid Build Coastguard Worker this.os = os 48*cd0cc2e3SAndroid Build Coastguard Worker this.arch = arch 49*cd0cc2e3SAndroid Build Coastguard Worker } 50*cd0cc2e3SAndroid Build Coastguard Worker 51*cd0cc2e3SAndroid Build Coastguard Worker // Classifier as generated by Maven osdetector. 52*cd0cc2e3SAndroid Build Coastguard Worker String mavenClassifier() { 53*cd0cc2e3SAndroid Build Coastguard Worker "${os}-${arch}" 54*cd0cc2e3SAndroid Build Coastguard Worker } 55*cd0cc2e3SAndroid Build Coastguard Worker 56*cd0cc2e3SAndroid Build Coastguard Worker // Gradle equivalent to Maven arch 57*cd0cc2e3SAndroid Build Coastguard Worker String gradleArch() { 58*cd0cc2e3SAndroid Build Coastguard Worker gradleArch(arch) 59*cd0cc2e3SAndroid Build Coastguard Worker } 60*cd0cc2e3SAndroid Build Coastguard Worker 61*cd0cc2e3SAndroid Build Coastguard Worker // Output directory for native resources 62*cd0cc2e3SAndroid Build Coastguard Worker String nativeResourcesDir() { 63*cd0cc2e3SAndroid Build Coastguard Worker "$buildDir/${mavenClassifier()}/native-resources" 64*cd0cc2e3SAndroid Build Coastguard Worker } 65*cd0cc2e3SAndroid Build Coastguard Worker 66*cd0cc2e3SAndroid Build Coastguard Worker // Directory for native resources inside final jar. 67*cd0cc2e3SAndroid Build Coastguard Worker String jarNativeResourcesDir() { 68*cd0cc2e3SAndroid Build Coastguard Worker nativeResourcesDir() + '/META-INF/native' 69*cd0cc2e3SAndroid Build Coastguard Worker } 70*cd0cc2e3SAndroid Build Coastguard Worker 71*cd0cc2e3SAndroid Build Coastguard Worker // Target platform identifier as used by Gradle 72*cd0cc2e3SAndroid Build Coastguard Worker String targetPlatform() { 73*cd0cc2e3SAndroid Build Coastguard Worker "${os}_${gradleArch()}" 74*cd0cc2e3SAndroid Build Coastguard Worker } 75*cd0cc2e3SAndroid Build Coastguard Worker 76*cd0cc2e3SAndroid Build Coastguard Worker String libDir() { 77*cd0cc2e3SAndroid Build Coastguard Worker "build64" 78*cd0cc2e3SAndroid Build Coastguard Worker } 79*cd0cc2e3SAndroid Build Coastguard Worker 80*cd0cc2e3SAndroid Build Coastguard Worker static String gradleArch(String arch) { 81*cd0cc2e3SAndroid Build Coastguard Worker gradleArchMap.get(arch) 82*cd0cc2e3SAndroid Build Coastguard Worker } 83*cd0cc2e3SAndroid Build Coastguard Worker 84*cd0cc2e3SAndroid Build Coastguard Worker static NativeBuildInfo findForGradle(String os, String arch) { 85*cd0cc2e3SAndroid Build Coastguard Worker values().find { 86*cd0cc2e3SAndroid Build Coastguard Worker it.os == os && it.gradleArch() == arch 87*cd0cc2e3SAndroid Build Coastguard Worker } 88*cd0cc2e3SAndroid Build Coastguard Worker } 89*cd0cc2e3SAndroid Build Coastguard Worker 90*cd0cc2e3SAndroid Build Coastguard Worker static NativeBuildInfo find(String os, String arch) { 91*cd0cc2e3SAndroid Build Coastguard Worker values().find { 92*cd0cc2e3SAndroid Build Coastguard Worker it.os == os && it.arch == arch 93*cd0cc2e3SAndroid Build Coastguard Worker } 94*cd0cc2e3SAndroid Build Coastguard Worker } 95*cd0cc2e3SAndroid Build Coastguard Worker 96*cd0cc2e3SAndroid Build Coastguard Worker static NativeBuildInfo find(NativePlatform targetPlatform) { 97*cd0cc2e3SAndroid Build Coastguard Worker String targetOS = targetPlatform.operatingSystem.name 98*cd0cc2e3SAndroid Build Coastguard Worker String targetArch = targetPlatform.architecture.name 99*cd0cc2e3SAndroid Build Coastguard Worker def result = findForGradle(targetOS, targetArch) 100*cd0cc2e3SAndroid Build Coastguard Worker assert result != null : "Unknown target platform: ${targetOS}-${targetArch}" 101*cd0cc2e3SAndroid Build Coastguard Worker result 102*cd0cc2e3SAndroid Build Coastguard Worker } 103*cd0cc2e3SAndroid Build Coastguard Worker 104*cd0cc2e3SAndroid Build Coastguard Worker static findAll(String os) { 105*cd0cc2e3SAndroid Build Coastguard Worker values().findAll { 106*cd0cc2e3SAndroid Build Coastguard Worker it.os == os 107*cd0cc2e3SAndroid Build Coastguard Worker } 108*cd0cc2e3SAndroid Build Coastguard Worker } 109*cd0cc2e3SAndroid Build Coastguard Worker} 110*cd0cc2e3SAndroid Build Coastguard Worker 111*cd0cc2e3SAndroid Build Coastguard Worker// TODO: There has to be a better way of accessing Gradle properties from Groovy code than this 112*cd0cc2e3SAndroid Build Coastguard WorkerNativeBuildInfo.buildDir = "$buildDir" 113*cd0cc2e3SAndroid Build Coastguard Worker 114*cd0cc2e3SAndroid Build Coastguard Workerext { 115*cd0cc2e3SAndroid Build Coastguard Worker jniSourceDir = "$rootDir/common/src/jni" 116*cd0cc2e3SAndroid Build Coastguard Worker assert file("$jniSourceDir").exists() 117*cd0cc2e3SAndroid Build Coastguard Worker 118*cd0cc2e3SAndroid Build Coastguard Worker // Decide which targets we should build and test 119*cd0cc2e3SAndroid Build Coastguard Worker nativeBuilds = NativeBuildInfo.findAll("${osdetector.os}") 120*cd0cc2e3SAndroid Build Coastguard Worker buildToTest = NativeBuildInfo.find("${osdetector.os}", "${osdetector.arch}") 121*cd0cc2e3SAndroid Build Coastguard Worker 122*cd0cc2e3SAndroid Build Coastguard Worker assert !nativeBuilds.isEmpty() : "No native builds selected." 123*cd0cc2e3SAndroid Build Coastguard Worker assert buildToTest != null : "No test build selected for os.arch = ${osdetector.arch}" 124*cd0cc2e3SAndroid Build Coastguard Worker 125*cd0cc2e3SAndroid Build Coastguard Worker // Compatibility with other sub-projects 126*cd0cc2e3SAndroid Build Coastguard Worker preferredSourceSet = buildToTest.mavenClassifier() 127*cd0cc2e3SAndroid Build Coastguard Worker preferredNativeFileDir = buildToTest.nativeResourcesDir() 128*cd0cc2e3SAndroid Build Coastguard Worker} 129*cd0cc2e3SAndroid Build Coastguard Worker 130*cd0cc2e3SAndroid Build Coastguard WorkersourceSets { 131*cd0cc2e3SAndroid Build Coastguard Worker main { 132*cd0cc2e3SAndroid Build Coastguard Worker java { 133*cd0cc2e3SAndroid Build Coastguard Worker srcDirs += "${rootDir}/common/src/main/java" 134*cd0cc2e3SAndroid Build Coastguard Worker srcDirs += project(':conscrypt-constants').sourceSets.main.java.srcDirs 135*cd0cc2e3SAndroid Build Coastguard Worker } 136*cd0cc2e3SAndroid Build Coastguard Worker resources { 137*cd0cc2e3SAndroid Build Coastguard Worker srcDirs += "build/generated/resources" 138*cd0cc2e3SAndroid Build Coastguard Worker } 139*cd0cc2e3SAndroid Build Coastguard Worker } 140*cd0cc2e3SAndroid Build Coastguard Worker 141*cd0cc2e3SAndroid Build Coastguard Worker platform { 142*cd0cc2e3SAndroid Build Coastguard Worker java { 143*cd0cc2e3SAndroid Build Coastguard Worker srcDirs = [ "src/main/java" ] 144*cd0cc2e3SAndroid Build Coastguard Worker includes = [ "org/conscrypt/Platform.java" ] 145*cd0cc2e3SAndroid Build Coastguard Worker } 146*cd0cc2e3SAndroid Build Coastguard Worker } 147*cd0cc2e3SAndroid Build Coastguard Worker 148*cd0cc2e3SAndroid Build Coastguard Worker test { 149*cd0cc2e3SAndroid Build Coastguard Worker java { 150*cd0cc2e3SAndroid Build Coastguard Worker srcDirs += "${rootDir}/common/src/test/java" 151*cd0cc2e3SAndroid Build Coastguard Worker } 152*cd0cc2e3SAndroid Build Coastguard Worker resources { 153*cd0cc2e3SAndroid Build Coastguard Worker srcDirs += "${rootDir}/common/src/test/resources" 154*cd0cc2e3SAndroid Build Coastguard Worker // This shouldn't be needed but seems to help IntelliJ locate the native artifact. 155*cd0cc2e3SAndroid Build Coastguard Worker // srcDirs += preferredNativeFileDir 156*cd0cc2e3SAndroid Build Coastguard Worker srcDirs += buildToTest.nativeResourcesDir() 157*cd0cc2e3SAndroid Build Coastguard Worker } 158*cd0cc2e3SAndroid Build Coastguard Worker } 159*cd0cc2e3SAndroid Build Coastguard Worker 160*cd0cc2e3SAndroid Build Coastguard Worker // Add the source sets for each of the native builds 161*cd0cc2e3SAndroid Build Coastguard Worker nativeBuilds.each { nativeBuild -> 162*cd0cc2e3SAndroid Build Coastguard Worker String sourceSetName = nativeBuild.mavenClassifier() 163*cd0cc2e3SAndroid Build Coastguard Worker String nativeDir = nativeBuild.nativeResourcesDir() 164*cd0cc2e3SAndroid Build Coastguard Worker 165*cd0cc2e3SAndroid Build Coastguard Worker // Main sources for the native build 166*cd0cc2e3SAndroid Build Coastguard Worker "$sourceSetName" { 167*cd0cc2e3SAndroid Build Coastguard Worker output.dir(nativeDir, builtBy: "copyNativeLib${sourceSetName}") 168*cd0cc2e3SAndroid Build Coastguard Worker } 169*cd0cc2e3SAndroid Build Coastguard Worker } 170*cd0cc2e3SAndroid Build Coastguard Worker} 171*cd0cc2e3SAndroid Build Coastguard Worker 172*cd0cc2e3SAndroid Build Coastguard WorkercompileJava { 173*cd0cc2e3SAndroid Build Coastguard Worker dependsOn generateProperties 174*cd0cc2e3SAndroid Build Coastguard Worker} 175*cd0cc2e3SAndroid Build Coastguard Worker 176*cd0cc2e3SAndroid Build Coastguard WorkerprocessResources { 177*cd0cc2e3SAndroid Build Coastguard Worker dependsOn generateProperties 178*cd0cc2e3SAndroid Build Coastguard Worker} 179*cd0cc2e3SAndroid Build Coastguard Worker 180*cd0cc2e3SAndroid Build Coastguard Workertasks.register("platformJar", Jar) { 181*cd0cc2e3SAndroid Build Coastguard Worker from sourceSets.platform.output 182*cd0cc2e3SAndroid Build Coastguard Worker} 183*cd0cc2e3SAndroid Build Coastguard Worker 184*cd0cc2e3SAndroid Build Coastguard Workertasks.register("testJar", ShadowJar) { 185*cd0cc2e3SAndroid Build Coastguard Worker archiveClassifier = 'tests' 186*cd0cc2e3SAndroid Build Coastguard Worker configurations = [project.configurations.testRuntimeClasspath] 187*cd0cc2e3SAndroid Build Coastguard Worker from sourceSets.test.output 188*cd0cc2e3SAndroid Build Coastguard Worker} 189*cd0cc2e3SAndroid Build Coastguard Worker 190*cd0cc2e3SAndroid Build Coastguard Workerif (isExecutableOnPath('cpplint')) { 191*cd0cc2e3SAndroid Build Coastguard Worker def cpplint = tasks.register("cpplint", Exec) { 192*cd0cc2e3SAndroid Build Coastguard Worker executable = 'cpplint' 193*cd0cc2e3SAndroid Build Coastguard Worker 194*cd0cc2e3SAndroid Build Coastguard Worker // TODO(nmittler): Is there a better way of getting the JNI sources? 195*cd0cc2e3SAndroid Build Coastguard Worker def pattern = ['**/*.cc', '**/*.h'] 196*cd0cc2e3SAndroid Build Coastguard Worker def sourceFiles = fileTree(dir: jniSourceDir, includes: pattern).asPath.tokenize(':') 197*cd0cc2e3SAndroid Build Coastguard Worker // Adding roots so that class #ifdefs don't require full path from the project root. 198*cd0cc2e3SAndroid Build Coastguard Worker args = sourceFiles 199*cd0cc2e3SAndroid Build Coastguard Worker 200*cd0cc2e3SAndroid Build Coastguard Worker // Capture stderr from the process 201*cd0cc2e3SAndroid Build Coastguard Worker errorOutput = new ByteArrayOutputStream() 202*cd0cc2e3SAndroid Build Coastguard Worker 203*cd0cc2e3SAndroid Build Coastguard Worker // Need to ignore exit value so that doLast will execute. 204*cd0cc2e3SAndroid Build Coastguard Worker ignoreExitValue = true 205*cd0cc2e3SAndroid Build Coastguard Worker 206*cd0cc2e3SAndroid Build Coastguard Worker doLast { 207*cd0cc2e3SAndroid Build Coastguard Worker // Create the report file. 208*cd0cc2e3SAndroid Build Coastguard Worker def reportDir = file("${buildDir}/cpplint") 209*cd0cc2e3SAndroid Build Coastguard Worker reportDir.mkdirs() 210*cd0cc2e3SAndroid Build Coastguard Worker def reportFile = new File(reportDir, "report.txt") 211*cd0cc2e3SAndroid Build Coastguard Worker def reportStream = new FileOutputStream(reportFile) 212*cd0cc2e3SAndroid Build Coastguard Worker 213*cd0cc2e3SAndroid Build Coastguard Worker try { 214*cd0cc2e3SAndroid Build Coastguard Worker // Check for failure 215*cd0cc2e3SAndroid Build Coastguard Worker if (execResult != null) { 216*cd0cc2e3SAndroid Build Coastguard Worker execResult.assertNormalExitValue() 217*cd0cc2e3SAndroid Build Coastguard Worker } 218*cd0cc2e3SAndroid Build Coastguard Worker } catch (Exception e) { 219*cd0cc2e3SAndroid Build Coastguard Worker // The process failed - get the error report from the stderr. 220*cd0cc2e3SAndroid Build Coastguard Worker String report = errorOutput.toString() 221*cd0cc2e3SAndroid Build Coastguard Worker 222*cd0cc2e3SAndroid Build Coastguard Worker // Write the report to the console. 223*cd0cc2e3SAndroid Build Coastguard Worker System.err.println(report) 224*cd0cc2e3SAndroid Build Coastguard Worker 225*cd0cc2e3SAndroid Build Coastguard Worker // Also write the report file. 226*cd0cc2e3SAndroid Build Coastguard Worker reportStream.write(report.bytes) 227*cd0cc2e3SAndroid Build Coastguard Worker 228*cd0cc2e3SAndroid Build Coastguard Worker // Extension method cpplint.output() can be used to obtain the report 229*cd0cc2e3SAndroid Build Coastguard Worker ext.output = { 230*cd0cc2e3SAndroid Build Coastguard Worker return report 231*cd0cc2e3SAndroid Build Coastguard Worker } 232*cd0cc2e3SAndroid Build Coastguard Worker 233*cd0cc2e3SAndroid Build Coastguard Worker // Rethrow the exception to terminate the build. 234*cd0cc2e3SAndroid Build Coastguard Worker throw e 235*cd0cc2e3SAndroid Build Coastguard Worker } finally { 236*cd0cc2e3SAndroid Build Coastguard Worker reportStream.close() 237*cd0cc2e3SAndroid Build Coastguard Worker } 238*cd0cc2e3SAndroid Build Coastguard Worker } 239*cd0cc2e3SAndroid Build Coastguard Worker } 240*cd0cc2e3SAndroid Build Coastguard Worker check.dependsOn cpplint 241*cd0cc2e3SAndroid Build Coastguard Worker} 242*cd0cc2e3SAndroid Build Coastguard Worker 243*cd0cc2e3SAndroid Build Coastguard Workerconfigurations { 244*cd0cc2e3SAndroid Build Coastguard Worker publicApiDocs 245*cd0cc2e3SAndroid Build Coastguard Worker platform 246*cd0cc2e3SAndroid Build Coastguard Worker} 247*cd0cc2e3SAndroid Build Coastguard Worker 248*cd0cc2e3SAndroid Build Coastguard Workerartifacts { 249*cd0cc2e3SAndroid Build Coastguard Worker platform platformJar 250*cd0cc2e3SAndroid Build Coastguard Worker} 251*cd0cc2e3SAndroid Build Coastguard Worker 252*cd0cc2e3SAndroid Build Coastguard Workerapply from: "$rootDir/gradle/publishing.gradle" 253*cd0cc2e3SAndroid Build Coastguard Workerpublishing.publications.maven { 254*cd0cc2e3SAndroid Build Coastguard Worker artifact sourcesJar 255*cd0cc2e3SAndroid Build Coastguard Worker artifact javadocJar 256*cd0cc2e3SAndroid Build Coastguard Worker} 257*cd0cc2e3SAndroid Build Coastguard Worker 258*cd0cc2e3SAndroid Build Coastguard Workerjar.manifest { 259*cd0cc2e3SAndroid Build Coastguard Worker attributes ('BoringSSL-Version' : boringSslVersion, 260*cd0cc2e3SAndroid Build Coastguard Worker 'Automatic-Module-Name' : 'org.conscrypt', 261*cd0cc2e3SAndroid Build Coastguard Worker 'Bundle-SymbolicName': 'org.conscrypt', 262*cd0cc2e3SAndroid Build Coastguard Worker '-exportcontents': 'org.conscrypt.*') 263*cd0cc2e3SAndroid Build Coastguard Worker} 264*cd0cc2e3SAndroid Build Coastguard Worker 265*cd0cc2e3SAndroid Build Coastguard Workerdependencies { 266*cd0cc2e3SAndroid Build Coastguard Worker // This is used for the @Internal annotation processing in JavaDoc 267*cd0cc2e3SAndroid Build Coastguard Worker publicApiDocs project(':conscrypt-api-doclet') 268*cd0cc2e3SAndroid Build Coastguard Worker 269*cd0cc2e3SAndroid Build Coastguard Worker // This is listed as compile-only, but we absorb its contents. 270*cd0cc2e3SAndroid Build Coastguard Worker compileOnly project(':conscrypt-constants') 271*cd0cc2e3SAndroid Build Coastguard Worker 272*cd0cc2e3SAndroid Build Coastguard Worker testImplementation project(':conscrypt-constants'), 273*cd0cc2e3SAndroid Build Coastguard Worker project(path: ':conscrypt-testing', configuration: 'shadow'), 274*cd0cc2e3SAndroid Build Coastguard Worker libs.junit, 275*cd0cc2e3SAndroid Build Coastguard Worker libs.mockito 276*cd0cc2e3SAndroid Build Coastguard Worker 277*cd0cc2e3SAndroid Build Coastguard Worker testRuntimeOnly sourceSets["$preferredSourceSet"].output 278*cd0cc2e3SAndroid Build Coastguard Worker 279*cd0cc2e3SAndroid Build Coastguard Worker platformCompileOnly sourceSets.main.output 280*cd0cc2e3SAndroid Build Coastguard Worker} 281*cd0cc2e3SAndroid Build Coastguard Worker 282*cd0cc2e3SAndroid Build Coastguard WorkernativeBuilds.each { nativeBuild -> 283*cd0cc2e3SAndroid Build Coastguard Worker // Create the JAR task and add it's output to the published archives for this project 284*cd0cc2e3SAndroid Build Coastguard Worker addNativeJar(nativeBuild) 285*cd0cc2e3SAndroid Build Coastguard Worker 286*cd0cc2e3SAndroid Build Coastguard Worker // Build the classes as part of the standard build. 287*cd0cc2e3SAndroid Build Coastguard Worker classes.dependsOn sourceSets[nativeBuild.mavenClassifier()].classesTaskName 288*cd0cc2e3SAndroid Build Coastguard Worker} 289*cd0cc2e3SAndroid Build Coastguard Worker 290*cd0cc2e3SAndroid Build Coastguard Worker// Adds a JAR task for the native library. 291*cd0cc2e3SAndroid Build Coastguard Workerdef addNativeJar(NativeBuildInfo nativeBuild) { 292*cd0cc2e3SAndroid Build Coastguard Worker // Create a JAR for this configuration and add it to the output archives. 293*cd0cc2e3SAndroid Build Coastguard Worker SourceSet sourceSet = sourceSets[nativeBuild.mavenClassifier()] 294*cd0cc2e3SAndroid Build Coastguard Worker def jarTask = tasks.register(sourceSet.jarTaskName, Jar) { Jar t -> 295*cd0cc2e3SAndroid Build Coastguard Worker // Depend on the regular classes task 296*cd0cc2e3SAndroid Build Coastguard Worker dependsOn classes 297*cd0cc2e3SAndroid Build Coastguard Worker manifest = jar.manifest 298*cd0cc2e3SAndroid Build Coastguard Worker archiveClassifier = nativeBuild.mavenClassifier() 299*cd0cc2e3SAndroid Build Coastguard Worker 300*cd0cc2e3SAndroid Build Coastguard Worker from sourceSet.output + sourceSets.main.output 301*cd0cc2e3SAndroid Build Coastguard Worker 302*cd0cc2e3SAndroid Build Coastguard Worker // add OSGI headers 303*cd0cc2e3SAndroid Build Coastguard Worker t.convention.plugins.bundle = new BundleTaskConvention(t) 304*cd0cc2e3SAndroid Build Coastguard Worker t.doLast { 305*cd0cc2e3SAndroid Build Coastguard Worker t.buildBundle() 306*cd0cc2e3SAndroid Build Coastguard Worker } 307*cd0cc2e3SAndroid Build Coastguard Worker } 308*cd0cc2e3SAndroid Build Coastguard Worker 309*cd0cc2e3SAndroid Build Coastguard Worker // Add the jar task to the standard build. 310*cd0cc2e3SAndroid Build Coastguard Worker jar.dependsOn jarTask 311*cd0cc2e3SAndroid Build Coastguard Worker 312*cd0cc2e3SAndroid Build Coastguard Worker // Add it to the publishing archives list. 313*cd0cc2e3SAndroid Build Coastguard Worker publishing.publications.maven.artifact jarTask.get() 314*cd0cc2e3SAndroid Build Coastguard Worker} 315*cd0cc2e3SAndroid Build Coastguard Worker 316*cd0cc2e3SAndroid Build Coastguard Workertest { 317*cd0cc2e3SAndroid Build Coastguard Worker include "org/conscrypt/ConscryptOpenJdkSuite.class" 318*cd0cc2e3SAndroid Build Coastguard Worker} 319*cd0cc2e3SAndroid Build Coastguard Worker 320*cd0cc2e3SAndroid Build Coastguard Workerdef testFdSocket = tasks.register("testFdSocket", Test) { 321*cd0cc2e3SAndroid Build Coastguard Worker include "org/conscrypt/ConscryptOpenJdkSuite.class" 322*cd0cc2e3SAndroid Build Coastguard Worker InvokerHelper.setProperties(testLogging, test.testLogging.properties) 323*cd0cc2e3SAndroid Build Coastguard Worker systemProperties = test.systemProperties 324*cd0cc2e3SAndroid Build Coastguard Worker systemProperty "org.conscrypt.useEngineSocketByDefault", false 325*cd0cc2e3SAndroid Build Coastguard Worker} 326*cd0cc2e3SAndroid Build Coastguard Workercheck.dependsOn testFdSocket 327*cd0cc2e3SAndroid Build Coastguard Worker 328*cd0cc2e3SAndroid Build Coastguard Worker// Tests that involve interoperation with the OpenJDK TLS provider (generally to 329*cd0cc2e3SAndroid Build Coastguard Worker// test renegotiation, since we don't support initiating renegotiation but do 330*cd0cc2e3SAndroid Build Coastguard Worker// support peer-initiated renegotiation). The JDK TLS provider doesn't work 331*cd0cc2e3SAndroid Build Coastguard Worker// if Conscrypt is installed as the default provider, so these need to live in 332*cd0cc2e3SAndroid Build Coastguard Worker// a different task than the other tests, most of which need Conscrypt to be 333*cd0cc2e3SAndroid Build Coastguard Worker// installed to function. 334*cd0cc2e3SAndroid Build Coastguard Workerdef testInterop = tasks.register("testInterop", Test) { 335*cd0cc2e3SAndroid Build Coastguard Worker include "org/conscrypt/ConscryptEngineTest.class" 336*cd0cc2e3SAndroid Build Coastguard Worker include "org/conscrypt/RenegotiationTest.class" 337*cd0cc2e3SAndroid Build Coastguard Worker} 338*cd0cc2e3SAndroid Build Coastguard Workercheck.dependsOn testInterop 339*cd0cc2e3SAndroid Build Coastguard Worker 340*cd0cc2e3SAndroid Build Coastguard WorkerjacocoTestReport { 341*cd0cc2e3SAndroid Build Coastguard Worker additionalSourceDirs.from files("$rootDir/openjdk/src/test/java", "$rootDir/common/src/main/java") 342*cd0cc2e3SAndroid Build Coastguard Worker executionData tasks.withType(Test) 343*cd0cc2e3SAndroid Build Coastguard Worker dependsOn test 344*cd0cc2e3SAndroid Build Coastguard Worker} 345*cd0cc2e3SAndroid Build Coastguard Worker 346*cd0cc2e3SAndroid Build Coastguard Workerjavadoc { 347*cd0cc2e3SAndroid Build Coastguard Worker dependsOn configurations.publicApiDocs 348*cd0cc2e3SAndroid Build Coastguard Worker options { 349*cd0cc2e3SAndroid Build Coastguard Worker showFromPublic() 350*cd0cc2e3SAndroid Build Coastguard Worker encoding = 'UTF-8' 351*cd0cc2e3SAndroid Build Coastguard Worker doclet = 'org.conscrypt.doclet.FilterDoclet' 352*cd0cc2e3SAndroid Build Coastguard Worker links = ['https://docs.oracle.com/en/java/javase/21/docs/api/java.base/'] 353*cd0cc2e3SAndroid Build Coastguard Worker docletpath = configurations.publicApiDocs.files as List 354*cd0cc2e3SAndroid Build Coastguard Worker } 355*cd0cc2e3SAndroid Build Coastguard Worker failOnError false 356*cd0cc2e3SAndroid Build Coastguard Worker 357*cd0cc2e3SAndroid Build Coastguard Worker doLast { 358*cd0cc2e3SAndroid Build Coastguard Worker copy { 359*cd0cc2e3SAndroid Build Coastguard Worker from "$rootDir/api-doclet/src/main/resources/styles.css" 360*cd0cc2e3SAndroid Build Coastguard Worker into "$buildDir/docs/javadoc" 361*cd0cc2e3SAndroid Build Coastguard Worker } 362*cd0cc2e3SAndroid Build Coastguard Worker } 363*cd0cc2e3SAndroid Build Coastguard Worker} 364*cd0cc2e3SAndroid Build Coastguard Worker 365*cd0cc2e3SAndroid Build Coastguard Workerdef jniIncludeDir() { 366*cd0cc2e3SAndroid Build Coastguard Worker def result = "" 367*cd0cc2e3SAndroid Build Coastguard Worker java { 368*cd0cc2e3SAndroid Build Coastguard Worker def jdkHome = javaToolchains.compilerFor(toolchain).get().metadata.getInstallationPath() 369*cd0cc2e3SAndroid Build Coastguard Worker result = jdkHome.file("include").toString() 370*cd0cc2e3SAndroid Build Coastguard Worker } 371*cd0cc2e3SAndroid Build Coastguard Worker result 372*cd0cc2e3SAndroid Build Coastguard Worker} 373*cd0cc2e3SAndroid Build Coastguard Worker 374*cd0cc2e3SAndroid Build Coastguard Workermodel { 375*cd0cc2e3SAndroid Build Coastguard Worker buildTypes { 376*cd0cc2e3SAndroid Build Coastguard Worker release 377*cd0cc2e3SAndroid Build Coastguard Worker } 378*cd0cc2e3SAndroid Build Coastguard Worker 379*cd0cc2e3SAndroid Build Coastguard Worker components { 380*cd0cc2e3SAndroid Build Coastguard Worker // Builds the JNI library. 381*cd0cc2e3SAndroid Build Coastguard Worker conscrypt_openjdk_jni(NativeLibrarySpec) { 382*cd0cc2e3SAndroid Build Coastguard Worker nativeBuilds.each { nativeBuild -> 383*cd0cc2e3SAndroid Build Coastguard Worker targetPlatform nativeBuild.targetPlatform() 384*cd0cc2e3SAndroid Build Coastguard Worker } 385*cd0cc2e3SAndroid Build Coastguard Worker 386*cd0cc2e3SAndroid Build Coastguard Worker sources { 387*cd0cc2e3SAndroid Build Coastguard Worker cpp { 388*cd0cc2e3SAndroid Build Coastguard Worker source { 389*cd0cc2e3SAndroid Build Coastguard Worker srcDirs "$jniSourceDir/main/cpp" 390*cd0cc2e3SAndroid Build Coastguard Worker include "**/*.cc" 391*cd0cc2e3SAndroid Build Coastguard Worker } 392*cd0cc2e3SAndroid Build Coastguard Worker } 393*cd0cc2e3SAndroid Build Coastguard Worker } 394*cd0cc2e3SAndroid Build Coastguard Worker 395*cd0cc2e3SAndroid Build Coastguard Worker binaries { 396*cd0cc2e3SAndroid Build Coastguard Worker // Build the JNI lib as a shared library. 397*cd0cc2e3SAndroid Build Coastguard Worker withType (SharedLibraryBinarySpec) { 398*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.define "CONSCRYPT_OPENJDK" 399*cd0cc2e3SAndroid Build Coastguard Worker def jdkIncludeDir = jniIncludeDir() 400*cd0cc2e3SAndroid Build Coastguard Worker def nativeBuild = NativeBuildInfo.find(targetPlatform) 401*cd0cc2e3SAndroid Build Coastguard Worker String libPath = "$boringsslHome/${nativeBuild.libDir()}" 402*cd0cc2e3SAndroid Build Coastguard Worker 403*cd0cc2e3SAndroid Build Coastguard Worker if (toolChain in Clang || toolChain in Gcc) { 404*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.args "-Wall", 405*cd0cc2e3SAndroid Build Coastguard Worker "-fPIC", 406*cd0cc2e3SAndroid Build Coastguard Worker "-O3", 407*cd0cc2e3SAndroid Build Coastguard Worker "-std=c++17", 408*cd0cc2e3SAndroid Build Coastguard Worker "-I$jniSourceDir/main/include", 409*cd0cc2e3SAndroid Build Coastguard Worker "-I$jniSourceDir/unbundled/include", 410*cd0cc2e3SAndroid Build Coastguard Worker "-I$boringsslIncludeDir", 411*cd0cc2e3SAndroid Build Coastguard Worker "-I$jdkIncludeDir", 412*cd0cc2e3SAndroid Build Coastguard Worker "-I$jdkIncludeDir/linux", 413*cd0cc2e3SAndroid Build Coastguard Worker "-I$jdkIncludeDir/darwin", 414*cd0cc2e3SAndroid Build Coastguard Worker "-I$jdkIncludeDir/win32" 415*cd0cc2e3SAndroid Build Coastguard Worker if (rootProject.hasProperty('checkErrorQueue')) { 416*cd0cc2e3SAndroid Build Coastguard Worker System.out.println("Compiling with error queue checking enabled") 417*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.define "CONSCRYPT_CHECK_ERROR_QUEUE" 418*cd0cc2e3SAndroid Build Coastguard Worker } 419*cd0cc2e3SAndroid Build Coastguard Worker 420*cd0cc2e3SAndroid Build Coastguard Worker // Static link to BoringSSL 421*cd0cc2e3SAndroid Build Coastguard Worker linker.args "-O3", 422*cd0cc2e3SAndroid Build Coastguard Worker "-fvisibility=hidden", 423*cd0cc2e3SAndroid Build Coastguard Worker "-lpthread", 424*cd0cc2e3SAndroid Build Coastguard Worker libPath + "/ssl/libssl.a", 425*cd0cc2e3SAndroid Build Coastguard Worker libPath + "/crypto/libcrypto.a" 426*cd0cc2e3SAndroid Build Coastguard Worker if (targetPlatform.operatingSystem.isLinux()) { 427*cd0cc2e3SAndroid Build Coastguard Worker // Static link libstdc++ and libgcc because 428*cd0cc2e3SAndroid Build Coastguard Worker // they are not available in some restrictive Linux 429*cd0cc2e3SAndroid Build Coastguard Worker // environments. 430*cd0cc2e3SAndroid Build Coastguard Worker linker.args "-static-libstdc++", 431*cd0cc2e3SAndroid Build Coastguard Worker "-static-libgcc" 432*cd0cc2e3SAndroid Build Coastguard Worker } else { 433*cd0cc2e3SAndroid Build Coastguard Worker linker.args "-lstdc++" 434*cd0cc2e3SAndroid Build Coastguard Worker } 435*cd0cc2e3SAndroid Build Coastguard Worker } else if (toolChain in VisualCpp) { 436*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.define "DLL_EXPORT" 437*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.define "WIN32_LEAN_AND_MEAN" 438*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.define "NOMINMAX" 439*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.define "WIN64" 440*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.define "_WINDOWS" 441*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.define "UNICODE" 442*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.define "_UNICODE" 443*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.define "NDEBUG" 444*cd0cc2e3SAndroid Build Coastguard Worker 445*cd0cc2e3SAndroid Build Coastguard Worker cppCompiler.args "/nologo", 446*cd0cc2e3SAndroid Build Coastguard Worker "/MT", 447*cd0cc2e3SAndroid Build Coastguard Worker "/WX-", 448*cd0cc2e3SAndroid Build Coastguard Worker "/Wall", 449*cd0cc2e3SAndroid Build Coastguard Worker "/O2", 450*cd0cc2e3SAndroid Build Coastguard Worker "/Oi", 451*cd0cc2e3SAndroid Build Coastguard Worker "/Ot", 452*cd0cc2e3SAndroid Build Coastguard Worker "/GL", 453*cd0cc2e3SAndroid Build Coastguard Worker "/GS", 454*cd0cc2e3SAndroid Build Coastguard Worker "/Gy", 455*cd0cc2e3SAndroid Build Coastguard Worker "/fp:precise", 456*cd0cc2e3SAndroid Build Coastguard Worker "/std:c++17", 457*cd0cc2e3SAndroid Build Coastguard Worker "-wd4514", // Unreferenced inline function removed 458*cd0cc2e3SAndroid Build Coastguard Worker "-wd4548", // Expression before comma has no effect 459*cd0cc2e3SAndroid Build Coastguard Worker "-wd4625", // Copy constructor was implicitly defined as deleted 460*cd0cc2e3SAndroid Build Coastguard Worker "-wd4626", // Assignment operator was implicitly defined as deleted 461*cd0cc2e3SAndroid Build Coastguard Worker "-wd4710", // function not inlined 462*cd0cc2e3SAndroid Build Coastguard Worker "-wd4711", // function inlined 463*cd0cc2e3SAndroid Build Coastguard Worker "-wd4820", // Extra padding added to struct 464*cd0cc2e3SAndroid Build Coastguard Worker "-wd4946", // reinterpret_cast used between related classes: 465*cd0cc2e3SAndroid Build Coastguard Worker "-wd4996", // Thread safety for strerror 466*cd0cc2e3SAndroid Build Coastguard Worker "-wd5027", // Move assignment operator was implicitly defined as deleted 467*cd0cc2e3SAndroid Build Coastguard Worker "-I$jniSourceDir/main/include", 468*cd0cc2e3SAndroid Build Coastguard Worker "-I$jniSourceDir/unbundled/include", 469*cd0cc2e3SAndroid Build Coastguard Worker "-I$boringsslIncludeDir", 470*cd0cc2e3SAndroid Build Coastguard Worker "-I$jdkIncludeDir", 471*cd0cc2e3SAndroid Build Coastguard Worker "-I$jdkIncludeDir/win32" 472*cd0cc2e3SAndroid Build Coastguard Worker 473*cd0cc2e3SAndroid Build Coastguard Worker // Static link to BoringSSL 474*cd0cc2e3SAndroid Build Coastguard Worker linker.args "-WX", 475*cd0cc2e3SAndroid Build Coastguard Worker "ws2_32.lib", 476*cd0cc2e3SAndroid Build Coastguard Worker "advapi32.lib", 477*cd0cc2e3SAndroid Build Coastguard Worker "${libPath}\\ssl\\ssl.lib", 478*cd0cc2e3SAndroid Build Coastguard Worker "${libPath}\\crypto\\crypto.lib" 479*cd0cc2e3SAndroid Build Coastguard Worker } 480*cd0cc2e3SAndroid Build Coastguard Worker } 481*cd0cc2e3SAndroid Build Coastguard Worker 482*cd0cc2e3SAndroid Build Coastguard Worker // Never build a static library. 483*cd0cc2e3SAndroid Build Coastguard Worker withType(StaticLibraryBinarySpec) { 484*cd0cc2e3SAndroid Build Coastguard Worker buildable = false 485*cd0cc2e3SAndroid Build Coastguard Worker } 486*cd0cc2e3SAndroid Build Coastguard Worker } 487*cd0cc2e3SAndroid Build Coastguard Worker } 488*cd0cc2e3SAndroid Build Coastguard Worker } 489*cd0cc2e3SAndroid Build Coastguard Worker 490*cd0cc2e3SAndroid Build Coastguard Worker tasks { t -> 491*cd0cc2e3SAndroid Build Coastguard Worker $.binaries.withType(SharedLibraryBinarySpec).each { binary -> 492*cd0cc2e3SAndroid Build Coastguard Worker def nativeBuild = NativeBuildInfo.find(binary.targetPlatform) 493*cd0cc2e3SAndroid Build Coastguard Worker def classifier = nativeBuild.mavenClassifier() 494*cd0cc2e3SAndroid Build Coastguard Worker def source = binary.sharedLibraryFile 495*cd0cc2e3SAndroid Build Coastguard Worker 496*cd0cc2e3SAndroid Build Coastguard Worker // Copies the native library to a resource location that will be included in the jar. 497*cd0cc2e3SAndroid Build Coastguard Worker def copyTask = project.tasks.register("copyNativeLib${classifier}", Copy) { 498*cd0cc2e3SAndroid Build Coastguard Worker dependsOn binary.tasks.link 499*cd0cc2e3SAndroid Build Coastguard Worker from source 500*cd0cc2e3SAndroid Build Coastguard Worker // Rename the artifact to include the generated classifier 501*cd0cc2e3SAndroid Build Coastguard Worker rename '(.+)(\\.[^\\.]+)', "\$1-$classifier\$2" 502*cd0cc2e3SAndroid Build Coastguard Worker // Everything under will be included in the native jar. 503*cd0cc2e3SAndroid Build Coastguard Worker into nativeBuild.jarNativeResourcesDir() 504*cd0cc2e3SAndroid Build Coastguard Worker } 505*cd0cc2e3SAndroid Build Coastguard Worker processResources { 506*cd0cc2e3SAndroid Build Coastguard Worker dependsOn copyTask 507*cd0cc2e3SAndroid Build Coastguard Worker } 508*cd0cc2e3SAndroid Build Coastguard Worker processTestResources { 509*cd0cc2e3SAndroid Build Coastguard Worker dependsOn copyTask 510*cd0cc2e3SAndroid Build Coastguard Worker } 511*cd0cc2e3SAndroid Build Coastguard Worker 512*cd0cc2e3SAndroid Build Coastguard Worker // Now define a task to strip the release binary (linux only) 513*cd0cc2e3SAndroid Build Coastguard Worker if (osdetector.os == 'linux' && (!rootProject.hasProperty('nostrip') || 514*cd0cc2e3SAndroid Build Coastguard Worker !rootProject.nostrip.toBoolean())) { 515*cd0cc2e3SAndroid Build Coastguard Worker def stripTask = binary.tasks.taskName("strip") 516*cd0cc2e3SAndroid Build Coastguard Worker project.tasks.register(stripTask as String, Exec) { 517*cd0cc2e3SAndroid Build Coastguard Worker dependsOn binary.tasks.link 518*cd0cc2e3SAndroid Build Coastguard Worker executable "strip" 519*cd0cc2e3SAndroid Build Coastguard Worker args binary.tasks.link.linkedFile.asFile.get() 520*cd0cc2e3SAndroid Build Coastguard Worker } 521*cd0cc2e3SAndroid Build Coastguard Worker copyTask.configure { 522*cd0cc2e3SAndroid Build Coastguard Worker dependsOn stripTask 523*cd0cc2e3SAndroid Build Coastguard Worker } 524*cd0cc2e3SAndroid Build Coastguard Worker } 525*cd0cc2e3SAndroid Build Coastguard Worker } 526*cd0cc2e3SAndroid Build Coastguard Worker } 527*cd0cc2e3SAndroid Build Coastguard Worker} 528*cd0cc2e3SAndroid Build Coastguard Worker 529*cd0cc2e3SAndroid Build Coastguard Workerboolean isExecutableOnPath(executable) { 530*cd0cc2e3SAndroid Build Coastguard Worker FilenameFilter filter = new FilenameFilter() { 531*cd0cc2e3SAndroid Build Coastguard Worker @Override 532*cd0cc2e3SAndroid Build Coastguard Worker boolean accept(File dir, String name) { 533*cd0cc2e3SAndroid Build Coastguard Worker return executable == name 534*cd0cc2e3SAndroid Build Coastguard Worker } 535*cd0cc2e3SAndroid Build Coastguard Worker } 536*cd0cc2e3SAndroid Build Coastguard Worker for(String folder : System.getenv('PATH').split("" + File.pathSeparatorChar)) { 537*cd0cc2e3SAndroid Build Coastguard Worker File[] files = file(folder).listFiles(filter) 538*cd0cc2e3SAndroid Build Coastguard Worker if (files != null && files.size() > 0) { 539*cd0cc2e3SAndroid Build Coastguard Worker return true 540*cd0cc2e3SAndroid Build Coastguard Worker } 541*cd0cc2e3SAndroid Build Coastguard Worker } 542*cd0cc2e3SAndroid Build Coastguard Worker return false 543*cd0cc2e3SAndroid Build Coastguard Worker}