xref: /aosp_15_r20/external/conscrypt/openjdk/build.gradle (revision cd0cc2e34ba52cdf454361820a14d744e4bd531d)
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}