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 ext {
 28     // all linux distros and macos support 'uname -m'
 29     arch = ['uname', '-m'].execute().text.trim()
 30 
 31 	switch (arch) {
 32 	case 'aarch64':
 33 		arch_alias = arch
 34 		break;
 35 	case 'x86_64':
 36 		arch_alias = 'x64'
 37 		break;
 38 	default:
 39 		throw new GradleException("${arch} is not suported")
 40     }
 41 }
 42 def jdkResultingImage = "$buildRoot/build/linux-${arch}-server-${correttoDebugLevel}/images/jdk"
 43 def testResultingImage = "$buildRoot/build/linux-${arch}-server-${correttoDebugLevel}/images/test"
 44 
 45 // deps
 46 def depsMap = [:]
 47 project.configurations.compile.getFiles().each { depsMap[it.getName()] = it }
 48 /**
 49  * Create a local copy of the source tree in our
 50  * build root -- this is required since OpenJDK's
 51  * build wants to occur inside the source tree,
 52  * and we don't want to tamper with someone
 53  * else's tree.
 54  */
 55 task copySource(type: Exec) {
 56     if (!file(buildRoot).exists()) {
 57         file(buildRoot).mkdirs()
 58     }
 59     workingDir '/usr/bin'
 60     commandLine 'rsync', '-am',
 61             '--exclude=pre-build',
 62             '--exclude=installers',
 63             '--exclude=corretto-build',
 64             "${project.rootDir}/", buildRoot
 65 }
 66 
 67 /**
 68  * Scan the patches folder for any .patch that needs
 69  * to be applied before start building.
 70  */
 71 task applyPatches() {
 72     dependsOn copySource
 73     doLast {
 74         fileTree('patches').matching {
 75             include '*.patch'
 76         }.each { f ->
 77             ant.patch(patchfile: f, dir: "$buildRoot", strip: 0)
 78         }
 79     }
 80 }
 81 
 82 task configureBuild(type: Exec) {
 83 
 84     dependsOn project.configurations.compile
 85     dependsOn applyPatches
 86     workingDir "$buildRoot"
 87 
 88     // Platform specific flags
 89     def command = ['bash', 'configure']
 90     // Common flags
 91     command += project.correttoCommonFlags
 92     command += ["--with-cacerts-file=${depsMap[caCerts]}",
 93                 "--with-zlib=system"
 94     ]
 95    commandLine command.flatten()
 96 }
 97 
 98 task executeBuild(type: Exec) {
 99     dependsOn configureBuild
100     workingDir "$buildRoot"
101     commandLine 'make', 'images'
102     outputs.dir jdkResultingImage
103 }
104 
105 task createTestImage(type: Exec) {
106     dependsOn executeBuild
107     workingDir "$buildRoot"
108     commandLine 'make','test-image'
109 }
110 
111 task bundleThirdPartyBinaries {
112     dependsOn executeBuild
113     doLast {
114         // If property set, copy async profiler binaries to bundle
115         if (project.asyncProfilerBinariesPath != "") {
116             if (!file(project.asyncProfilerBinariesPath).isDirectory()) {
117                 throw new GradleException("asyncProfilerBinariesPath is not a valid directory: ${project.asyncProfilerBinariesPath}")
118             }
119             copy {
120                 from project.asyncProfilerBinariesPath
121                 include 'bin/**', 'lib/**'
122                 into jdkResultingImage
123             }
124             copy {
125                 from project.asyncProfilerLegal
126                 into "${jdkResultingImage}/legal"
127             }
128         }
129     }
130 }
131 
132 task packageTestImage(type: Tar) {
133     dependsOn createTestImage
134     description = 'Package test results'
135     archiveFileName = "amazon-corretto-testimage-${project.version.full}-alpine-linux-${arch_alias}.tar.gz"
136     compression = Compression.GZIP
137     from(testResultingImage) {
138         include '**'
139     }
140     into "amazon-corretto-testimage-${project.version.full}-alpine-linux-${arch_alias}"
141 }
142 
143 task packageDebugSymbols(type: Tar) {
144     dependsOn packageTestImage
145     description = 'Package debug symbols'
146     archiveFileName = "amazon-corretto-debugsymbols-${project.version.full}-alpine-linux-${arch_alias}.tar.gz"
147     compression = Compression.GZIP
148     from(jdkResultingImage) {
149         include 'bin/*.diz'
150         include 'lib/*.diz'
151         include 'lib/server/*.diz'
152         into "amazon-corretto-debugsymbols-${project.version.full}-alpine-linux-${arch_alias}"
153     }
154 }
155 
156 task packageBuildResults(type: Tar) {
157     description = 'Compresses the JDK image and puts the results in build/distributions.'
158     dependsOn packageDebugSymbols
159     dependsOn executeBuild
160     dependsOn bundleThirdPartyBinaries
161     archiveFileName = "amazon-corretto-${project.version.full}-alpine-linux-${arch_alias}.tar.gz"
162     compression = Compression.GZIP
163     from(buildRoot) {
164         include project.rootFiles
165     }
166     from(jdkResultingImage) {
167         include 'bin/**'
168         include 'conf/**'
169         include 'include/**'
170         include 'jmods/**'
171         include 'lib/**'
172         include 'man/man1/**'
173         include 'release'
174         exclude '**/*.diz'
175     }
176 
177     // Copy legal directory specifically to set permission correctly.
178     // See https://github.com/corretto/corretto-11/issues/129
179     from(jdkResultingImage) {
180         include 'legal/**'
181         fileMode = 0444
182     }
183     into "amazon-corretto-${project.version.full}-alpine-linux-${arch_alias}"
184 }
185 
186 artifacts {
187     archives packageBuildResults
188 }