1 /* 2 * Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Amazon designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 */ 21 22 // Tasks can refer to version information using the project.version 23 // property. For an example of its usage, see ':installers:linux:rpm:buildLogic' 24 // where the version numbers are used to populate a templated RPM spec file. 25 26 import org.apache.tools.ant.taskdefs.condition.Os 27 28 allprojects { 29 apply plugin: 'base' 30 31 configurations { 32 compile { 33 transitive = false 34 } 35 } 36 37 version = { 38 def full = file('version.txt').text.trim() 39 def tokens = full.tokenize(".") 40 [full : full, 41 major : tokens[0], 42 minor : tokens[1], 43 security: tokens[2], 44 build : tokens[3], 45 revision: tokens[4], 46 upstream: "${tokens[0]}.${tokens[1]}.${tokens[2]}.${tokens[3]}".toString()] 47 }.call() 48 buildDir = 'corretto-build' 49 50 ext { 51 buildRoot = file("$buildDir/buildRoot") 52 distributionDir = file("$buildDir/distributions") 53 packageInfo = [ 54 url : "https://github.com/corretto/corretto-${project.version.major}", 55 vendor : 'Amazon', 56 packager : 'Amazon', 57 description : 'Amazon Corretto\'s packaging of the runtime core elements of the OpenJDK code.', 58 license : 'ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with ' + 59 'exceptions and IJG and LGPLv2+ and MIT and MPLv2.0 and Public Domain and W3C and zlib and ' + 60 'ISC and FTL and RSA.', 61 maintainer: 'Amazon Corretto Team <corretto-team@amazon.com>', 62 buildHost : 'build.amazon.com' 63 ] 64 jdkTools = ['java', 'keytool', 'rmid', 'rmiregistry', 'jjs', 'pack200', 'unpack200', 'javac', 'jaotc', 'jlink', 65 'jmod', 'jhsdb', 'jar', 'jarsigner', 'javadoc', 'javap', 'jcmd', 'jconsole', 'jdb', 'jdeps', 'jdeprscan', 66 'jimage', 'jinfo', 'jmap', 'jps', 'jrunscript', 'jshell', 'jstack', 'jstat', 'jstatd', 'rmic', 'serialver'] 67 // artifact names 68 caCerts = "cacerts" 69 sourceTar = "amazon-corretto-source-${project.version.full}.tar.gz" 70 71 configurationFiles = [ 72 'conf/logging.properties', 73 'conf/net.properties', 74 'conf/sound.properties', 75 'conf/security/policy/limited/default_local.policy', 76 'conf/security/policy/limited/exempt_local.policy', 77 'conf/security/policy/limited/default_US_export.policy', 78 'conf/security/policy/unlimited/default_local.policy', 79 'conf/security/policy/unlimited/default_US_export.policy', 80 'conf/security/java.security', 81 'conf/management/jmxremote.access', 82 'conf/management/management.properties', 83 'lib/security/blocked.certs', 84 'lib/security/public_suffix_list.dat' 85 ]; 86 87 correttoCommonFlags = [ 88 "--with-freetype=bundled", 89 '--with-jvm-features=zgc', 90 "--with-version-build=${project.version.build}", 91 '--with-version-pre=', 92 "--with-vendor-bug-url=https://github.com/corretto/corretto-${project.version.major}/issues/", 93 "--with-vendor-vm-bug-url=https://github.com/corretto/corretto-${project.version.major}/issues/", 94 '--with-vendor-name=Amazon.com Inc.', 95 '--with-vendor-url=https://aws.amazon.com/corretto/', 96 "--with-vendor-version-string=Corretto-${project.version.full}" 97 ] 98 99 // If this is a certified release build, exclude the README.JAVASE file 100 excludeReadmeJavaSE = Boolean.parseBoolean(project.findProperty("corretto.excludeReadmeJavaSE")) 101 rootFiles = ['ADDITIONAL_LICENSE_INFO', 'ASSEMBLY_EXCEPTION', 'LICENSE', 'README.md', 'commitId.txt', 'version.txt'] 102 if (!excludeReadmeJavaSE) { 103 rootFiles += 'README.JAVASE' 104 } 105 106 // If the version opt is empty, then the JDK will set to 'adhoc.<username>.<base dir name>' 107 versionOpt = project.findProperty("corretto.versionOpt") ?: "LTS" // Set the LTS when needed 108 correttoCommonFlags += ["--with-version-opt=${versionOpt}"] 109 110 def versionDate = project.findProperty("corretto.versionDate") 111 if (versionDate) { 112 correttoCommonFlags += ["--with-version-date=${versionDate}"] 113 } 114 115 def gtest = project.findProperty("corretto.gtest") 116 if (gtest) { 117 correttoCommonFlags += ["--with-gtest=${gtest}"] 118 } 119 120 // This should be public so we can know if we should build the micro-benchmarks 121 jmh = project.findProperty("corretto.jmh") 122 if (jmh) { 123 correttoCommonFlags += ["--with-jmh=${jmh}"] 124 } 125 126 // If asyncProfilerBinariesPath provided, store for easy reference when bundling 127 asyncProfilerBinariesPath = project.findProperty("asyncProfilerBinariesPath") ?: "" 128 asyncProfilerLegal = "${rootDir}/installers/legal/async-profiler.md" 129 130 // Valid value: null, release, debug, fastdebug, slowdebug 131 correttoDebugLevel = "release" // Default: release 132 switch(project.findProperty("corretto.debug_level")) { 133 case null: 134 case "release": 135 correttoCommonFlags += ['--with-debug-level=release', '--with-native-debug-symbols=zipped'] 136 break 137 case "fastdebug": 138 correttoDebugLevel = "fastdebug" 139 correttoCommonFlags += ['--with-debug-level=fastdebug', '--with-native-debug-symbols=zipped'] 140 break 141 case "debug": 142 case "slowdebug": 143 correttoDebugLevel = "slowdebug" 144 correttoCommonFlags += ['--with-debug-level=slowdebug', '--with-native-debug-symbols=external'] 145 break 146 default: 147 throw new RuntimeException("Invalid corretto.debug_level") 148 } 149 150 // customized flags. Identify the index of double dashes as the start of a flag 151 String extraConfig = project.findProperty("corretto.extra_config") 152 def lastIndex = -1 153 if (extraConfig != null) { 154 for (int index = extraConfig.indexOf("--"); index >= 0; index = extraConfig.indexOf("--", index + 1)) { 155 if (lastIndex != -1) { 156 correttoCommonFlags += extraConfig.substring(lastIndex, index).trim() 157 } 158 lastIndex = index 159 } 160 if (lastIndex != -1) { 161 correttoCommonFlags += extraConfig.substring(lastIndex).trim() 162 } 163 } 164 165 // Determine the system architecture 166 def jdkArch = "" 167 def os = "" 168 if (Os.isFamily(Os.FAMILY_MAC)) { 169 os = 'macosx' 170 nativeArch = ['uname', '-m'].execute().text.trim() 171 if (nativeArch == "arm64") { 172 jdkArch = "aarch64" 173 } else { 174 jdkArch = "x86_64" 175 } 176 } else if (Os.isFamily(Os.FAMILY_UNIX)) { 177 os = 'linux' 178 jdkArch = ['uname', '-m'].execute().text.trim() 179 // `uname -m` returns the host arch in a linux x86 docker instance. Pass a flag 180 // to enable 181 if (project.hasProperty("x86") && Boolean.parseBoolean(project.getProperty('x86'))) { 182 jdkArch = "x86" 183 } 184 } else if (Os.isFamily(Os.FAMILY_WINDOWS)) { 185 os = 'windows' 186 def arch = System.getenv('PROCESSOR_ARCHITECTURE') 187 if (arch == 'AMD64') { 188 jdkArch = "x86_64" 189 } else { //x86 190 throw new GradleException("${arch} is not suported") 191 } 192 } else { 193 throw new GradleException("OS is not supported") 194 } 195 196 // Ext property: correttoArch 197 switch (jdkArch) { 198 case 'x86': 199 case 'aarch64': 200 correttoArch = jdkArch 201 break 202 case 'x86_64': 203 correttoArch = 'x64' 204 break 205 default: 206 throw new GradleException("${jdkArch} is not supported") 207 } 208 209 // Call toString explicitly to avoid lazy evaluation 210 jdkImageName = "${os}-${jdkArch}-server-${correttoDebugLevel}".toString() 211 // no debug level suffix for release build 212 if (correttoDebugLevel == "release") { 213 correttoJdkArchiveName = "amazon-corretto-${project.version.full}-${os}-${correttoArch}".toString() 214 } else { 215 correttoJdkArchiveName = 216 "amazon-corretto-${project.version.full}-${os}-${correttoArch}-${correttoDebugLevel}".toString() 217 } 218 correttoDebugSymbolsArchiveName = "amazon-corretto-debugsymbols-${project.version.full}-${os}-${correttoArch}".toString() 219 correttoTestImageArchiveName = "amazon-corretto-testimage-${project.version.full}-${os}-${correttoArch}".toString() 220 } 221 } 222 223 project(':prebuild') { 224 apply plugin: 'java' 225 226 configurations { 227 cacerts 228 } 229 230 ext { 231 cacertDir = "$distributionDir/${project.caCerts}" 232 } 233 234 def preBuildSrc = "src" 235 def classPath = "classes" 236 def generateToolMain = "build.tools.generatecacerts.GenerateCacerts" 237 238 task copyToolSrc(type: Copy) { 239 description = 'Copy utility tool source to the project root' 240 from fileTree("$rootDir/make/jdk/src/classes") { 241 include 'build/tools/generatecacerts/*' 242 } 243 into preBuildSrc 244 } 245 246 task buildTool(type: JavaCompile) { 247 dependsOn copyToolSrc 248 source = fileTree(dir: preBuildSrc, include: '**/*.java') 249 destinationDirectory = file(classPath) 250 classpath = files(classPath) 251 } 252 253 task generateJdkCacerts(type: JavaExec) { 254 dependsOn buildTool 255 def jdkCaDir = "$rootDir/src/java.base/share/data/cacerts" 256 257 description = 'Generate Cacerts from JDK source' 258 classpath = files(classPath) 259 260 // See commit for [JDK-8275252](https://github.com/corretto/corretto-jdk/commit/bd2b41dd7062c50f3aaebec2137d5fdd9546c120) 261 jvmArgs = ['-Dkeystore.pkcs12.certProtectionAlgorithm=NONE', '-Dkeystore.pkcs12.macAlgorithm=NONE'] 262 mainClass = generateToolMain 263 args = [jdkCaDir, project.caCerts] 264 } 265 266 task importAmazonCacerts(type: Exec) { 267 dependsOn generateJdkCacerts 268 // Default password for JSSE key store 269 def keystore_password = "changeit" 270 commandLine 'keytool', '-importkeystore', '-noprompt', 271 '-srckeystore', "$rootDir/amazon-cacerts", 272 '-srcstorepass', keystore_password, 273 '-destkeystore', caCerts, 274 '-deststorepass', '' 275 } 276 277 task copyCacerts(type: Copy) { 278 dependsOn importAmazonCacerts 279 from caCerts 280 into distributionDir 281 } 282 283 artifacts { 284 cacerts file: file("$distributionDir/${caCerts}"), builtBy: copyCacerts 285 } 286 } 287 288 project(':openjdksrc') { 289 /** 290 * Compresses a snapshot of the source code used to perform the build. 291 */ 292 task sourceDistributionTarball(type: Tar) { 293 description = 'Assemble source files required for building and distributing Corretto.' 294 compression = Compression.GZIP 295 archiveFileName = sourceTar 296 def sourceTarRootFiles = ['LICENSE', 297 'ADDITIONAL_LICENSE_INFO', 298 'README', 299 'README.md', 300 'ASSEMBLY_EXCEPTION', 301 'commitId.txt', 302 'version.txt', 303 'amazon-cacerts', 304 'configure', 305 'Makefile', 306 'bin/**', 307 'doc/**', 308 'make/**', 309 'src/**', 310 'test/**'] 311 if (!excludeReadmeJavaSE) { 312 sourceTarRootFiles += 'README.JAVASE' 313 } 314 315 from fileTree(rootDir) { 316 include sourceTarRootFiles 317 } 318 } 319 320 artifacts { 321 archives sourceDistributionTarball 322 } 323 }