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 dependencies { 23 compile project(path: ':openjdksrc', configuration: 'archives') 24 compile project(path: ':prebuild', configuration: 'cacerts') 25 } 26 27 if (project.correttoArch == 'x86') { 28 project.correttoCommonFlags += '--with-target-bits=32' 29 } 30 31 def imageDir = "$buildRoot/build/${project.jdkImageName}/images" 32 def jdkResultingImage = "${imageDir}/jdk" 33 def testResultingImage = "${imageDir}/test" 34 35 // deps 36 def depsMap = [:] 37 project.configurations.compile.getFiles().each { depsMap[it.getName()] = it } 38 /** 39 * Create a local copy of the source tree in our 40 * build root -- this is required since OpenJDK's 41 * build wants to occur inside the source tree, 42 * and we don't want to tamper with someone 43 * else's tree. 44 */ 45 task copySource(type: Exec) { 46 if (!file(buildRoot).exists()) { 47 file(buildRoot).mkdirs() 48 } 49 workingDir '/usr/bin' 50 commandLine 'rsync', '-am', 51 '--exclude=pre-build', 52 '--exclude=installers', 53 '--exclude=corretto-build', 54 "${project.rootDir}/", buildRoot 55 } 56 57 /** 58 * Scan the patches folder for any .patch that needs 59 * to be applied before start building. 60 */ 61 task applyPatches() { 62 dependsOn copySource 63 doLast { 64 fileTree('patches').matching { 65 include '*.patch' 66 }.each { f -> 67 ant.patch(patchfile: f, dir: "$buildRoot", strip: 0) 68 } 69 } 70 } 71 72 task configureBuild(type: Exec) { 73 dependsOn project.configurations.compile 74 dependsOn applyPatches 75 workingDir "$buildRoot" 76 77 // Platform specific flags 78 def command = ['bash', 'configure', 79 "--with-cacerts-file=${depsMap[caCerts]}", 80 "--with-zlib=system" 81 ] 82 // Common flags 83 command += project.correttoCommonFlags 84 commandLine command.flatten() 85 86 } 87 88 task executeBuild(type: Exec) { 89 dependsOn configureBuild 90 workingDir "$buildRoot" 91 commandLine 'make', 'images' 92 outputs.dir jdkResultingImage 93 } 94 95 task createTestImage(type: Exec) { 96 dependsOn executeBuild 97 workingDir "$buildRoot" 98 commandLine 'make','test-image' 99 } 100 101 task bundleThirdPartyBinaries { 102 dependsOn executeBuild 103 doLast { 104 // If property set, copy async profiler binaries to bundle 105 if (project.asyncProfilerBinariesPath != "") { 106 if (!file(project.asyncProfilerBinariesPath).isDirectory()) { 107 throw new GradleException("asyncProfilerBinariesPath is not a valid directory: ${project.asyncProfilerBinariesPath}") 108 } 109 copy { 110 from project.asyncProfilerBinariesPath 111 include 'bin/**', 'lib/**' 112 into jdkResultingImage 113 } 114 copy { 115 from project.asyncProfilerLegal 116 into "${jdkResultingImage}/legal" 117 } 118 } 119 } 120 } 121 122 task fixCrossCompileLinking(type: Exec) { 123 dependsOn createTestImage 124 /* When cross-compiling for aarch64, gcc incorrectly links against 125 * libz.so, provided by the -devel packages, instead of libz.so.1 126 * This can lead to runtime errors of the form 127 * javac: error while loading shared libraries: libz.so: cannot open shared object file: No such file or directory 128 * As a workaround, use patchelf to update all references to libz.so to the expected libz.so.1 129 * 130 * See also: 131 * - https://github.com/AppImage/AppImageKit/issues/964 132 * - https://github.com/AppImage/AppImageKit/issues/1092 133 * - https://github.com/electron-userland/electron-builder/issues/7835 134 * - https://github.com/CollaboraOnline/richdocumentscode/issues/68 135 * - https://github.com/Sienci-Labs/gsender/issues/420 136 */ 137 if (project.hasProperty("corretto.crossCompile")) { 138 commandLine 'bash', '-c', "find ${imageDir} -type f -exec patchelf --replace-needed libz.so libz.so.1 {} \\; 2>/dev/null" 139 } else { 140 commandLine 'bash', '-c', "echo 'Not a cross-compiled build, no linker fixup required'" 141 } 142 } 143 144 task packageTestImage(type: Tar) { 145 dependsOn fixCrossCompileLinking 146 description = 'Package test results' 147 archiveFileName = "${project.correttoTestImageArchiveName}.tar.gz" 148 compression = Compression.GZIP 149 from(testResultingImage) { 150 include '**' 151 } 152 into project.correttoTestImageArchiveName 153 } 154 155 task packageDebugSymbols(type: Tar) { 156 description = 'Package debug results' 157 dependsOn packageTestImage 158 archiveFileName = "${project.correttoDebugSymbolsArchiveName}.tar.gz" 159 compression = Compression.GZIP 160 from(jdkResultingImage) { 161 include 'bin/*.diz' 162 include 'lib/*.diz' 163 include 'lib/server/*.diz' 164 into project.correttoDebugSymbolsArchiveName 165 } 166 } 167 168 task packageBuildResults(type: Tar) { 169 description = 'Compresses the JDK image and puts the results in build/distributions.' 170 dependsOn packageDebugSymbols 171 dependsOn bundleThirdPartyBinaries 172 archiveFileName = "${project.correttoJdkArchiveName}.tar.gz" 173 compression = Compression.GZIP 174 from(buildRoot) { 175 include project.rootFiles 176 into project.correttoJdkArchiveName 177 } 178 from(jdkResultingImage) { 179 include 'bin/**' 180 include 'conf/**' 181 include 'include/**' 182 include 'jmods/**' 183 include 'lib/**' 184 include 'man/man1/**' 185 include 'release' 186 exclude '**/*.diz' 187 into project.correttoJdkArchiveName 188 } 189 190 // Copy legal directory specifically to set permission correctly. 191 // See https://github.com/corretto/corretto-11/issues/129 192 from("${jdkResultingImage}/legal") { 193 include '**' 194 fileMode = 0444 195 into "${project.correttoJdkArchiveName}/legal" 196 } 197 } 198 199 artifacts { 200 archives packageBuildResults 201 }