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 // Two configurations for tgz & Jtreg native library respectively.
 28 // Separate artifacts to simplify the artifacts fetching in :mac:pkg.
 29 configurations {
 30     buildTar
 31     testLib
 32 }
 33 // consts
 34 def imageDir= "$buildRoot/build/${project.jdkImageName}/images"
 35 def jdkResultingImage = "${imageDir}/jdk-bundle"
 36 def testResultingImage = "${imageDir}/test"
 37 def correttoMacDir = "amazon-corretto-${project.version.major}.jdk"
 38 
 39 // deps
 40 def depsMap = [:]
 41 project.configurations.compile.getFiles().each { depsMap[it.getName()] = it }
 42 
 43 /**
 44  * Create a local copy of the source tree in our
 45  * build root -- this is required since OpenJDK's
 46  * build wants to occur inside the source tree,
 47  * and we don't want to tamper with someone
 48  * else's tree.
 49  */
 50 task copySource(type: Exec) {
 51     if (!file(buildRoot).exists()) {
 52         file(buildRoot).mkdirs()
 53     }
 54     workingDir '/usr/bin'
 55     commandLine 'rsync', '-am',
 56             '--exclude=pre-build',
 57             '--exclude=installers',
 58             '--exclude=corretto-build',
 59             "${project.rootDir}/", buildRoot
 60 }
 61 
 62 task configureBuild(type: Exec) {
 63     dependsOn project.configurations.compile
 64     dependsOn copySource
 65     workingDir "$buildRoot"
 66 
 67     // Platform specific flags
 68     def command = ['bash', 'configure',
 69             "--with-cacerts-file=${depsMap[caCerts]}"
 70     ]
 71     if (project.correttoArch == "aarch64") {
 72         command += "--with-zlib=bundled"
 73     }
 74     // Common flags
 75     command += project.correttoCommonFlags
 76     commandLine command.flatten()
 77 }
 78 
 79 task executeBuild(type: Exec) {
 80     dependsOn configureBuild
 81     workingDir "$buildRoot"
 82     commandLine 'make', 'images'
 83 }
 84 
 85 task executeTestBuild(type: Exec) {
 86     dependsOn executeBuild
 87     workingDir "$buildRoot"
 88     commandLine 'make','test-image'
 89 }
 90 
 91 task prepareArtifacts {
 92     dependsOn executeBuild
 93     doLast {
 94         if(file("${jdkResultingImage}/${correttoMacDir}").exists()) {
 95             delete "${jdkResultingImage}/${correttoMacDir}"
 96         }
 97         // Rename bundle
 98         exec {
 99             workingDir jdkResultingImage
100             commandLine 'bash', '-c', "\"\"mv jdk-${version.major}*.jdk ${correttoMacDir}\"\""
101         }
102 
103         // Replace Info.plist
104         def plistTokens = new Properties()
105         plistTokens["INFO"] = "Amazon Corretto ${project.version.full}-${versionOpt}".toString()
106         plistTokens["ID"] = "com.amazon.corretto.${project.version.major}".toString()
107         plistTokens["NAME"] = "Amazon Corretto ${project.version.major}".toString()
108         plistTokens["VERSION"] = "${project.version.major}.${project.version.minor}.${project.version.security}".toString()
109         plistTokens["BUILD_VERSION"] = "${project.version.full}".toString()
110         plistTokens["MACOSX_VERSION_MIN"] = (correttoArch == "x64" ? "10.12" : "11.0")
111         plistTokens["VENDOR"] = "Amazon.com Inc."
112 
113         copy {
114             from("${rootDir}/make/data/bundle/JDK-Info.plist.template") {
115                 rename { file -> 'Info.plist' }
116                 filter(org.apache.tools.ant.filters.ReplaceTokens, beginToken: "@@", endToken: "@@", tokens: plistTokens)
117             }
118             into "${jdkResultingImage}/${correttoMacDir}/Contents"
119         }
120 
121         // If property set, copy async profiler binaries to bundle
122         if (project.asyncProfilerBinariesPath != "") {
123             if (!file(project.asyncProfilerBinariesPath).isDirectory()) {
124                 throw new GradleException("asyncProfilerBinariesPath is not a valid directory: ${project.asyncProfilerBinariesPath}")
125             }
126             copy {
127                 from project.asyncProfilerBinariesPath
128                 include 'bin/**', 'lib/**'
129                 into "${jdkResultingImage}/${correttoMacDir}/Contents/Home"
130             }
131             copy {
132                 from project.asyncProfilerLegal
133                 into "${jdkResultingImage}/${correttoMacDir}/Contents/Home/legal"
134             }
135         }
136 
137         // Filter files
138         if(file("${buildDir}/${correttoMacDir}").exists()) {
139             delete "${buildDir}/${correttoMacDir}"
140         }
141         copy {
142             from("${jdkResultingImage}/${correttoMacDir}") {
143                 include "Contents/Home/bin/**"
144                 include "Contents/Home/conf/**"
145                 include "Contents/Home/include/**"
146                 include "Contents/Home/jmods/**"
147                 include "Contents/Home/legal/**"
148                 include "Contents/Home/lib/**"
149                 include "Contents/Home/man/man1/**"
150                 include "Contents/Home/release"
151                 include "Contents/Info.plist"
152                 include "Contents/MacOS/**"
153                 exclude "Contents/Home/**/*.diz"
154             }
155             from(buildRoot) {
156                 include project.rootFiles
157                 into "Contents/Home"
158             }
159             into "${buildDir}/${correttoMacDir}"
160         }
161         // Set the directory as bundle
162         exec {
163             commandLine "SetFile", "-a", "B", "${buildDir}/${correttoMacDir}"
164         }
165     }
166 }
167 
168 task packaging(type: Exec) {
169     dependsOn prepareArtifacts
170     String tarDir = "${distributionDir}/${project.correttoJdkArchiveName}.tar.gz"
171     workingDir buildDir
172     commandLine "tar", "czf", tarDir, correttoMacDir
173     outputs.file tarDir
174 }
175 
176 task packageDebugSymbols(type: Tar) {
177     dependsOn prepareArtifacts
178     description 'Package debug symbols'
179     archiveFileName = "${project.correttoDebugSymbolsArchiveName}.tar.gz"
180     compression Compression.GZIP
181     from("${jdkResultingImage}/${correttoMacDir}") {
182         include "Contents/Home/bin/*.diz"
183         include "Contents/Home/lib/*.diz"
184         include "Contents/Home/lib/server/*.diz"
185     }
186     into "${buildDir}/${correttoMacDir}"
187     into project.correttoDebugSymbolsArchiveName
188 }
189 
190 task packageTestResults(type: Tar) {
191     dependsOn executeTestBuild
192     description 'Package test results'
193     archiveFileName = "${project.correttoTestImageArchiveName}.tar.gz"
194     compression Compression.GZIP
195     from(testResultingImage) {
196         include '**'
197     }
198     into project.correttoTestImageArchiveName
199 }
200 
201 build.dependsOn packaging
202 build.dependsOn packageDebugSymbols
203 build.dependsOn packageTestResults
204 
205 artifacts {
206     buildTar file: packaging.outputs.getFiles().getSingleFile(), builtBy: packaging
207     testLib packageTestResults
208 }