From cd77d792f194f392db33cf7d5faecfff55a8ba8e Mon Sep 17 00:00:00 2001 From: Tianmin Shi Date: Wed, 3 Mar 2021 12:56:12 -0800 Subject: [PATCH] Add Corretto Build logic --- .github/ISSUE_TEMPLATE/bug_report.md | 37 ++ .github/ISSUE_TEMPLATE/feature_request.md | 38 ++ .github/actions/fetch-repo/action.yml | 21 + .github/actions/fetch-repo/refresh.sh | 11 + .github/actions/merge-repo/action.yml | 19 + .github/actions/merge-repo/merge.sh | 13 + .github/pull_request_template.md | 33 + .github/workflows/refresh-jdk16.yml | 26 + CHANGELOG.md | 3 + README.md | 45 +- TRADEMARKS.md | 37 ++ amazon-cacerts | Bin 0 -> 154013 bytes build.gradle | 272 +++++++++ gradle.properties | 1 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 55616 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 188 ++++++ gradlew.bat | 100 +++ installers/linux/alpine/tar/build.gradle | 152 +++++ .../linux/alpine/tar/patches/zlib.patch | 149 +++++ installers/linux/universal/deb/build.gradle | 175 ++++++ .../linux/universal/deb/jinfo/jinfo.template | 7 + .../deb/scripts/postin_jdk.sh.template | 19 + .../deb/scripts/preun_jdk.sh.template | 18 + installers/linux/universal/rpm/build.gradle | 126 ++++ .../rpm/scripts/postin_java.sh.template | 17 + .../rpm/scripts/postin_javac.sh.template | 46 ++ .../rpm/scripts/preun_java.sh.template | 3 + .../rpm/scripts/preun_javac.sh.template | 3 + installers/linux/universal/tar/build.gradle | 141 +++++ .../linux/universal/tar/patches/zlib.patch | 149 +++++ installers/mac/pkg/README.md | 26 + installers/mac/pkg/build.gradle | 87 +++ installers/mac/pkg/resources/amazon.png | Bin 0 -> 15540 bytes installers/mac/pkg/resources/preinstall | 9 + .../templates/CorrettoPkg.pkgproj.template | 574 ++++++++++++++++++ .../pkg/templates/introduction.html.template | 86 +++ installers/mac/tar/build.gradle | 165 +++++ .../mac/tar/templates/Info.plist.template | 43 ++ installers/windows/README.md | 31 + installers/windows/zip/build.gradle | 99 +++ settings.gradle | 22 + version.txt | 1 + 43 files changed, 2990 insertions(+), 7 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/actions/fetch-repo/action.yml create mode 100755 .github/actions/fetch-repo/refresh.sh create mode 100644 .github/actions/merge-repo/action.yml create mode 100755 .github/actions/merge-repo/merge.sh create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/refresh-jdk16.yml create mode 100644 CHANGELOG.md create mode 100644 TRADEMARKS.md create mode 100644 amazon-cacerts create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 installers/linux/alpine/tar/build.gradle create mode 100644 installers/linux/alpine/tar/patches/zlib.patch create mode 100644 installers/linux/universal/deb/build.gradle create mode 100644 installers/linux/universal/deb/jinfo/jinfo.template create mode 100644 installers/linux/universal/deb/scripts/postin_jdk.sh.template create mode 100644 installers/linux/universal/deb/scripts/preun_jdk.sh.template create mode 100644 installers/linux/universal/rpm/build.gradle create mode 100644 installers/linux/universal/rpm/scripts/postin_java.sh.template create mode 100644 installers/linux/universal/rpm/scripts/postin_javac.sh.template create mode 100644 installers/linux/universal/rpm/scripts/preun_java.sh.template create mode 100644 installers/linux/universal/rpm/scripts/preun_javac.sh.template create mode 100644 installers/linux/universal/tar/build.gradle create mode 100644 installers/linux/universal/tar/patches/zlib.patch create mode 100644 installers/mac/pkg/README.md create mode 100644 installers/mac/pkg/build.gradle create mode 100644 installers/mac/pkg/resources/amazon.png create mode 100755 installers/mac/pkg/resources/preinstall create mode 100644 installers/mac/pkg/templates/CorrettoPkg.pkgproj.template create mode 100644 installers/mac/pkg/templates/introduction.html.template create mode 100644 installers/mac/tar/build.gradle create mode 100644 installers/mac/tar/templates/Info.plist.template create mode 100644 installers/windows/README.md create mode 100644 installers/windows/zip/build.gradle create mode 100644 settings.gradle create mode 100644 version.txt diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000000..4d02673e5e4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,37 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +Thank you for taking the time to help improve OpenJDK and Corretto. + +If your request concerns a security vulnerability then please report it by email to aws-security@amazon.com instead of here. (You can find more information regarding security issues at https://aws.amazon.com/security/vulnerability-reporting/.) + +Otherwise, if your issue concerns OpenJDK and is not specific to Corretto we ask that you raise it to the OpenJDK community. Depending on your contributor status for OpenJDK, please use the [JDK bug system](https://bugs.openjdk.java.net/) or the appropriate [mailing list](http://mail.openjdk.java.net/mailman/listinfo) for the given problem area or [update project](http://mail.openjdk.java.net/mailman/listinfo/jdk-updates-dev). + +If your issue is specific to Corretto, then you are in the right place. Please proceed with the following. + +### Describe the bug +A clear and concise description of what the bug is. + +### To Reproduce +Steps and (source) code to reproduce the behavior. + +### Expected behavior +A clear and concise description of what you expected to happen. + +### Screenshots +If applicable, add screenshots to help explain your problem. + +### Platform information + OS: [e.g. Amazon Linux 2] + Version [e.g. "Corretto-15.0.1.9.1" (output from "java -version")] + +### Additional context +Add any other context about the problem here. + +For VM crashes, please attach the error report file. By default the file name is `hs_err_pidpid.log`, where pid is the process ID of the process. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000000..adce5c697cc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,38 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +Thank you for taking the time to help improve OpenJDK and Corretto. + +If your request concerns a security vulnerability then please report it by email to aws-security@amazon.com instead of here. +(You can find more information regarding security issues at https://aws.amazon.com/security/vulnerability-reporting/.) + +Otherwise, if your idea concerns OpenJDK +and is not specific to Corretto +we ask that you propose it to the OpenJDK community. +Depending on your contributor status for OpenJDK, +please use the [JDK bug system](https://bugs.openjdk.java.net/) or +the appropriate [mailing list](http://mail.openjdk.java.net/mailman/listinfo) +for the given problem area or [update project](http://mail.openjdk.java.net/mailman/listinfo/jdk-updates-dev)). + +If your proposal is specific to Corretto, +then you are in the right place. +Please proceed with the following. + +### Is your feature request related to a problem? +Please provide a clear and concise description of what the problem is. + +### Describe a solution you would like +Please provide a clear and concise description of what you want to happen. + +### Describe alternatives you have considered +Please provide a clear and concise description +of any alternative solutions or features you have considered. + +### Additional context +Add any other context or screenshots about the feature request here. diff --git a/.github/actions/fetch-repo/action.yml b/.github/actions/fetch-repo/action.yml new file mode 100644 index 00000000000..74f1494b8bc --- /dev/null +++ b/.github/actions/fetch-repo/action.yml @@ -0,0 +1,21 @@ +name: 'Fetch upstream repository' +description: 'Fetch the upstream openjdk repository and update the corresponding branches' + +inputs: + upstream: + description: 'Upstream repository https git url' + required: true + local-branch: + description: 'Local branch tracking the remote upstream' + required: true +outputs: + status: + description: 'Status of the upstream fetch and merge' +runs: + using: "composite" + steps: + - run: $GITHUB_ACTION_PATH/refresh.sh ${{ inputs.upstream }} ${{ inputs.local-branch }} + shell: bash + id: fetch-and-update-repo + + \ No newline at end of file diff --git a/.github/actions/fetch-repo/refresh.sh b/.github/actions/fetch-repo/refresh.sh new file mode 100755 index 00000000000..8003bf23bb6 --- /dev/null +++ b/.github/actions/fetch-repo/refresh.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -x + +UPSTREAM=$1 +LOCAL_BRANCH=$2 + +REMOTE_NAME=upstream-${LOCAL_BRANCH} +git remote add ${REMOTE_NAME} ${UPSTREAM} +git fetch origin ${LOCAL_BRANCH}:${LOCAL_BRANCH} || exit 1 +git fetch ${REMOTE_NAME} master:${LOCAL_BRANCH} || exit 1 +git push origin ${LOCAL_BRANCH} diff --git a/.github/actions/merge-repo/action.yml b/.github/actions/merge-repo/action.yml new file mode 100644 index 00000000000..d86c9afafcd --- /dev/null +++ b/.github/actions/merge-repo/action.yml @@ -0,0 +1,19 @@ +name: 'Merge Upstream branch' +description: 'Merge Upstream branch to Develop branch.' + +inputs: + upstream: + description: 'Upstream branch in repository' + required: true + merge-branch: + description: 'Merge branch in local repository' + required: true +outputs: + status: + description: 'Status of the upstream fetch and merge' +runs: + using: "composite" + steps: + - run: $GITHUB_ACTION_PATH/merge.sh ${{ inputs.upstream }} ${{ inputs.merge-branch }} + shell: bash + id: merge-upstream-to-develop \ No newline at end of file diff --git a/.github/actions/merge-repo/merge.sh b/.github/actions/merge-repo/merge.sh new file mode 100755 index 00000000000..9784700d79d --- /dev/null +++ b/.github/actions/merge-repo/merge.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -x + +UPSTREAM_BRANCH=$1 +MERGE_BRANCH=$2 + +git config user.email "no-reply@amazon.com" +git config user.name "corretto-github-robot" + +git checkout ${MERGE_BRANCH} +git merge -m "Merge ${UPSTREAM_BRANCH}" ${UPSTREAM_BRANCH} || exit 1 + +git push origin ${MERGE_BRANCH} \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000000..1a3bdf85729 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,33 @@ +Thank you for taking the time to help improve OpenJDK and Corretto 11. + +If your pull request concerns a security vulnerability then please do not file it here. +Instead, report the problem by email to aws-security@amazon.com. +(You can find more information regarding security issues at https://aws.amazon.com/security/vulnerability-reporting/.) + +Otherwise, if your pull request concerns OpenJDK 11 +and is not specific to Corretto 11, +then we ask you to redirect your contribution to the OpenJDK project. +See http://openjdk.java.net/contribute/ for details on how to do that. + +If your issue is specific to Corretto 11, +then you are in the right place. +Please fill in the following information about your pull request. + +### Description + + +### Related issues + + +### Motivation and context + + +### How has this been tested? + + +### Platform information + Works on OS: [e.g. Amazon Linux 2 only] + Applies to version [e.g. "11.0.1+13-1" (see output from "java -version")] + + +### Additional context diff --git a/.github/workflows/refresh-jdk16.yml b/.github/workflows/refresh-jdk16.yml new file mode 100644 index 00000000000..2ce20bb595a --- /dev/null +++ b/.github/workflows/refresh-jdk16.yml @@ -0,0 +1,26 @@ +name: "Refresh jdk16 from Upstream" +on: + schedule: + - cron: '0 8 * * *' + workflow_dispatch: + +jobs: + refresh-jdk16: + runs-on: ubuntu-latest + name: "Update Corretto-16" + if: github.repository_owner == 'corretto' + steps: + - name: "Checkout code" + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: "Fetch Corretto-16" + uses: ./.github/actions/fetch-repo + with: + upstream: 'https://github.com/openjdk/jdk16u.git' + local-branch: 'upstream-jdk16' + - name: "Merge Corretto-16" + uses: ./.github/actions/merge-repo + with: + upstream: 'upstream-jdk16' + merge-branch: 'develop-jdk16' \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000000..2107070f2bd --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +# Change Log for Amazon Corretto 16 + +The following sections describe the changes for each release of Amazon Corretto 16. diff --git a/README.md b/README.md index 399e7cc311f..b483617038d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,42 @@ -# Welcome to the JDK! +## Corretto JDK -For build instructions please see the -[online documentation](https://openjdk.java.net/groups/build/doc/building.html), -or either of these files: +Amazon Corretto is a no-cost, multiplatform, +production-ready distribution of the Open Java Development Kit (OpenJDK). +Corretto is used internally at Amazon for production services. +With Corretto, you can develop and run Java applications +on operating systems such as Linux, Windows, and macOS. -- [doc/building.html](doc/building.html) (html version) -- [doc/building.md](doc/building.md) (markdown version) +This repository is used to track [OpenJDK upstream tip](https://github.com/openjdk/jdk). +Please look at the branches section for more information on Feature Releases. -See for more information about +Documentation is available at [https://docs.aws.amazon.com/corretto](https://docs.aws.amazon.com/corretto). + +### Licenses and Trademarks + +Please read these files: "LICENSE", "ADDITIONAL_LICENSE_INFO", "ASSEMBLY_EXCEPTION", "TRADEMARKS.md". + +### Branches + +_develop-jdk16_ +: The default branch. The branch that consumes development and patches to upstream jdk16u. Corretto 16 builds are generated from this branch. + +_upstream-jdk16_ +: The branch is similar to master at [openjdk/jdk16u](https://github.com/openjdk/jdk16u). This branch merges into develop-jdk16. + +_upstream_ +: The branch is similar to master at [openjdk/jdk](https://github.com/openjdk/jdk). This branch merges into develop. + +### OpenJDK Readme +``` + +Welcome to the JDK! +=================== + +For build instructions, please see either of these files: + + * doc/building.html (html version) + * doc/building.md (markdown version) + +See https://openjdk.java.net/ for more information about the OpenJDK Community and the JDK. +``` \ No newline at end of file diff --git a/TRADEMARKS.md b/TRADEMARKS.md new file mode 100644 index 00000000000..f0ac051764d --- /dev/null +++ b/TRADEMARKS.md @@ -0,0 +1,37 @@ +# TRADEMARK POLICY + +This policy of Amazon.com, Inc. or its affiliates ("Amazon") provides guidelines for use of the "Corretto" and “Amazon Corretto” trademarks (“Corretto Trademarks") to identify Amazon's Corretto software. Use of the Corretto Trademarks must be in accordance with this policy. Our goal is to ensure that Amazon’s trademarks remain reliable indicators of quality and security while also permitting community members, software distributors and others we work with to discuss Amazon's products and to accurately describe such products’ affiliation with Amazon. Note that this policy only applies to use of the Corretto Trademarks. Use of any other Amazon trademarks is not included or covered by this policy. + +## OVERALL GUIDELINES + +You may use the Corretto and Amazon Corretto word marks in plain text to refer to Amazon’s Corretto software in compliance with this policy. Any other use of our trademarks, including any logos, requires prior written permission. + +Overall, your use of the Corretto Trademarks must not be confusing or damaging to Amazon or to the Corretto Trademarks themselves. + +People should always know who they are dealing with, and where the software they are downloading came from. You may not use the Corretto Trademarks in any manner that implies approval or endorsement by or association with Amazon. You may not use the Corretto Trademarks to refer to a product other than Amazon’s Corretto software. Following the guidelines below for modifications will help avoid confusion. + +You may not use the Corretto Trademarks as a vehicle to damage the reputation of Amazon or our Corretto software or to make any false or misleading statements. You may not use the Corretto Trademarks in a manner that may diminish or otherwise damage Amazon's goodwill in the trademarks. The Corretto Trademarks should be used in their exact form and not abbreviated or combined with any other word or words (e.g., "Corretto" software rather than "CRTO" or "Correttofied"). + +Amazon owns all rights in the Corretto Trademarks, and your use of them does not transfer rights to you. Any goodwill generated by your use of our Corretto Trademarks will belong to Amazon. + +## MODIFICATIONS + +Those taking full advantage of the open source nature of the Amazon Corretto code and making modifications may not redistribute the modified software under the Corretto Trademarks. Additionally, to avoid misleading a user into believing the modified software is a native Amazon product, if you modify any file where the file name contains a Corretto Trademark or the Amazon name, you must rename that file (except files that contain only an Amazon copyright that is part of an open source license header). + +## RELATED SOFTWARE + +Amazon recognizes that community members writing related software need some way to identify the Amazon product to which that software pertains. Users should not be confused as to whether the related software is an official Amazon product or otherwise approved by Amazon. The name of such software may not include, in whole or in part, the Corretto Trademarks in a way that suggests a connection between Amazon and the extension. + +## QUESTIONS + +If you are unsure whether your use of the Corretto Trademarks would run afoul of this policy, feel free to contact us and ask. If you have questions about these guidelines or use of any other Amazon trademark, please contact trademarks@amazon.com for assistance, or write to us at: + +**Amazon.com, Inc., Attention: Trademarks, +PO Box 81226 Seattle, WA 98108-1226** + +This policy is based in part on the open source trademark policy defined by the Mozilla organization, available [here](https://www.mozilla.org/en-US/foundation/trademarks/policy/), as adapted to Amazon’s Carbonado policy, available [here](http://carbonado.sourceforge.net/trademark.html). Thus, the text of this policy (and not the Corretto Trademarks themselves) is licensed under the Creative Commons "Attribution-ShareAlike 2.0" license. + +### FAQ: + +**1. Can I create and redistribute my own builds of Amazon Corretto?** +: If you build Amazon Corretto from source and redistribute the results, you may use the Corretto Trademarks only if it is clear in both the name of your distribution and the content associated with it that your distribution is your build of Amazon Corretto and not the official build, and you must identify the commit from which it is built, including the commit date. diff --git a/amazon-cacerts b/amazon-cacerts new file mode 100644 index 0000000000000000000000000000000000000000..e87df2722c74286bf47aab59f58ad38188db3c22 GIT binary patch literal 154013 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 literal 0 HcmV?d00001 diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000000..c1b21d03c53 --- /dev/null +++ b/build.gradle @@ -0,0 +1,272 @@ +/* +* Copyright (c) 2019, Amazon.com, Inc. or its affiliates. All Rights Reserved. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 only, as +* published by the Free Software Foundation. Amazon designates this +* particular file as subject to the "Classpath" exception as provided +* by Oracle in the LICENSE file that accompanied this code. +* +* This code is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* version 2 for more details (a copy is included in the LICENSE file that +* accompanied this code). +* +* You should have received a copy of the GNU General Public License version +* 2 along with this work; if not, write to the Free Software Foundation, +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +// Tasks can refer to version information using the project.version +// property. For an example of its usage, see ':installers:linux:rpm:buildLogic' +// where the version numbers are used to populate a templated RPM spec file. + +import org.apache.tools.ant.taskdefs.condition.Os + +allprojects { + apply plugin: 'base' + + configurations { + compile { + transitive = false + } + } + + version = { + def full = file('version.txt').text.trim() + def tokens = full.tokenize(".") + [full : full, + major : tokens[0], + minor : tokens[1], + security: tokens[2], + build : tokens[3], + revision: tokens[4], + upstream: "${tokens[0]}.${tokens[1]}.${tokens[2]}.${tokens[3]}".toString()] + }.call() + buildDir = 'corretto-build' + + ext { + buildRoot = file("$buildDir/buildRoot") + distributionDir = file("$buildDir/distributions") + packageInfo = [ + url : "https://github.com/corretto/corretto-${project.version.major}", + vendor : 'Amazon', + packager : 'Amazon', + description : 'Amazon Corretto\'s packaging of the runtime core elements of the OpenJDK 11 code.', + license : 'ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv2 and GPLv2 with ' + + 'exceptions and IJG and LGPLv2+ and MIT and MPLv2.0 and Public Domain and W3C and zlib and ' + + 'ISC and FTL and RSA.', + maintainer: 'Amazon Corretto Team ', + buildHost : 'build.amazon.com' + ] + jdkTools = ['java', 'keytool', 'rmid', 'rmiregistry', 'jjs', 'pack200', 'unpack200', 'javac', 'jaotc', 'jlink', + 'jmod', 'jhsdb', 'jar', 'jarsigner', 'javadoc', 'javap', 'jcmd', 'jconsole', 'jdb', 'jdeps', 'jdeprscan', + 'jimage', 'jinfo', 'jmap', 'jps', 'jrunscript', 'jshell', 'jstack', 'jstat', 'jstatd', 'rmic', 'serialver'] + // artifact names + caCerts = "cacerts" + sourceTar = "amazon-corretto-source-${project.version.full}.tar.gz" + + correttoCommonFlags = [ + "--with-freetype=bundled", + '--with-jvm-features=zgc', + "--with-version-build=${project.version.build}", + '--with-version-pre=', + "--with-version-string=${version.major}.${version.minor}.${version.security}", + "--with-vendor-bug-url=https://github.com/corretto/corretto-jdk/issues/", + '--with-vendor-vm-bug-url=https://github.com/corretto/corretto-jdk/issues/', + '--with-vendor-name=Amazon.com Inc.', + '--with-vendor-url=https://aws.amazon.com/corretto/', + "--with-vendor-version-string=Corretto-${project.version.full}" + ] + + def versionOpt = project.findProperty("corretto.versionOpt") + if (versionOpt) { + correttoCommonFlags += ["--with-version-opt=${versionOpt}"] + } + + def versionDate = project.findProperty("corretto.versionDate") + if (versionDate) { + correttoCommonFlags += ["--with-version-date=${versionDate}"] + } + + // Valid value: null, release, debug, fastdebug, slowdebug + def correttoDebugLevel = "release" // Default: release + switch(project.findProperty("corretto.debug_level")) { + case null: + case "release": + correttoCommonFlags += ['--with-debug-level=release', '--with-native-debug-symbols=none'] + break + case "fastdebug": + correttoDebugLevel = "fastdebug" + correttoCommonFlags += ['--with-debug-level=fastdebug', '--with-native-debug-symbols=zipped'] + break + case "debug": + case "slowdebug": + correttoDebugLevel = "slowdebug" + correttoCommonFlags += ['--with-debug-level=slowdebug', '--with-native-debug-symbols=external'] + break + default: + throw new RuntimeException("Invalid corretto.debug_level") + } + + // customized flags. Identify the index of double dashes as the start of a flag + String extraConfig = project.findProperty("corretto.extra_config") + def lastIndex = -1 + if (extraConfig != null) { + for (int index = extraConfig.indexOf("--"); index >= 0; index = extraConfig.indexOf("--", index + 1)) { + if (lastIndex != -1) { + correttoCommonFlags += extraConfig.substring(lastIndex, index).trim() + } + lastIndex = index + } + if (lastIndex != -1) { + correttoCommonFlags += extraConfig.substring(lastIndex).trim() + } + } + + // Determine the system architecture + def jdkArch = "" + def os = "" + if (Os.isFamily(Os.FAMILY_MAC)) { + os = 'macosx' + jdkArch = "x86_64" + } else if (Os.isFamily(Os.FAMILY_UNIX)) { + os = 'linux' + jdkArch = ['uname', '-m'].execute().text.trim() + // `uname -m` returns the host arch in a linux x86 docker instance. Pass a flag + // to enable + if (project.hasProperty("x86") && Boolean.parseBoolean(project.getProperty('x86'))) { + jdkArch = "x86" + } + } else if (Os.isFamily(Os.FAMILY_WINDOWS)) { + os = 'windows' + def arch = System.getenv('PROCESSOR_ARCHITECTURE') + if (arch == 'AMD64') { + jdkArch = "x86_64" + } else { //x86 + throw new GradleException("${arch} is not suported") + } + } else { + throw new GradleException("OS is not supported") + } + + // Ext property: correttoArch + switch (jdkArch) { + case 'x86': + case 'aarch64': + correttoArch = jdkArch + break + case 'x86_64': + correttoArch = 'x64' + break + default: + throw new GradleException("${jdkArch} is not supported") + } + + // Call toString explicitly to avoid lazy evaluation + jdkImageName = "${os}-${jdkArch}-server-${correttoDebugLevel}".toString() + // no debug level suffix for release build + if (correttoDebugLevel == "release") { + correttoJdkArchiveName = "amazon-corretto-${project.version.full}-${os}-${correttoArch}".toString() + } else { + correttoJdkArchiveName = + "amazon-corretto-${project.version.full}-${os}-${correttoArch}-${correttoDebugLevel}".toString() + } + correttoTestImageArchiveName = "amazon-corretto-testimage-${project.version.full}-${os}-${correttoArch}".toString() + } +} + +project(':prebuild') { + apply plugin: 'java' + + configurations { + cacerts + } + + ext { + cacertDir = "$distributionDir/${project.caCerts}" + } + + def preBuildSrc = "src" + def classPath = "classes" + def generateToolMain = "build.tools.generatecacerts.GenerateCacerts" + + task copyToolSrc(type: Copy) { + description 'Copy utility tool source to the project root' + from fileTree("$rootDir/make/jdk/src/classes") { + include 'build/tools/generatecacerts/*' + } + into preBuildSrc + } + + task buildTool(type: JavaCompile) { + dependsOn copyToolSrc + source = fileTree(dir: preBuildSrc, include: '**/*.java') + destinationDir = file(classPath) + classpath = files(classPath) + } + + task generateJdkCacerts(type: JavaExec) { + dependsOn buildTool + def jdkCaDir = "$rootDir/make/data/cacerts" + + description = 'Generate Cacerts from JDK source' + classpath = files(classPath) + main = generateToolMain + args = [jdkCaDir, project.caCerts] + } + + task importAmazonCacerts(type: Exec) { + dependsOn generateJdkCacerts + // Default password for JSSE key store + def keystore_password = "changeit" + commandLine 'keytool', '-importkeystore', '-noprompt', + '-srckeystore', "$rootDir/amazon-cacerts", + '-srcstorepass', keystore_password, + '-destkeystore', caCerts, + '-deststorepass', keystore_password + } + + task copyCacerts(type: Copy) { + dependsOn importAmazonCacerts + from caCerts + into distributionDir + } + + artifacts { + cacerts file: file("$distributionDir/${caCerts}"), builtBy: copyCacerts + } +} + +project(':openjdksrc') { + /** + * Compresses a snapshot of the source code used to perform the build. + */ + task sourceDistributionTarball(type: Tar) { + description 'Assemble source files required for building and distributing Corretto.' + compression Compression.GZIP + archiveName sourceTar + from fileTree(rootDir) { + include 'LICENSE', + 'ADDITIONAL_LICENSE_INFO', + 'README', + 'ASSEMBLY_EXCEPTION', + 'version.txt', + 'amazon-cacerts', + 'configure', + 'Makefile', + 'bin/**', + 'doc/**', + 'make/**', + 'src/**', + 'test/**' + } + } + + artifacts { + archives sourceDistributionTarball + } +} + diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000000..f97ebb7d334 --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +org.gradle.parallel=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..5c2d1cf016b3885f6930543d57b744ea8c220a1a GIT binary patch literal 55616 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000000..24467a141f7 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/installers/linux/alpine/tar/build.gradle b/installers/linux/alpine/tar/build.gradle new file mode 100644 index 00000000000..be47de31e97 --- /dev/null +++ b/installers/linux/alpine/tar/build.gradle @@ -0,0 +1,152 @@ +/* +* Copyright (c) 2019, Amazon.com, Inc. or its affiliates. All Rights Reserved. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 only, as +* published by the Free Software Foundation. Amazon designates this +* particular file as subject to the "Classpath" exception as provided +* by Oracle in the LICENSE file that accompanied this code. +* +* This code is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* version 2 for more details (a copy is included in the LICENSE file that +* accompanied this code). +* +* You should have received a copy of the GNU General Public License version +* 2 along with this work; if not, write to the Free Software Foundation, +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + + +dependencies { + compile project(path: ':openjdksrc', configuration: 'archives') + compile project(path: ':prebuild', configuration: 'cacerts') +} + +ext { + // all linux distros and macos support 'uname -m' + arch = ['uname', '-m'].execute().text.trim() + + switch (arch) { + case 'aarch64': + arch_alias = arch + break; + case 'x86_64': + arch_alias = 'x64' + break; + default: + throw new GradleException("${arch} is not suported") + } +} + +def jdkResultingImage = "$buildRoot/build/linux-${arch}-server-release/images/jdk" +def testResultingImage = "$buildRoot/build/linux-${arch}-server-release/images/test" + +// deps +def depsMap = [:] +project.configurations.compile.getFiles().each { depsMap[it.getName()] = it } +/** + * Create a local copy of the source tree in our + * build root -- this is required since OpenJDK's + * build wants to occur inside the source tree, + * and we don't want to tamper with someone + * else's tree. + */ +task copySource(type: Exec) { + if (!file(buildRoot).exists()) { + file(buildRoot).mkdirs() + } + workingDir '/usr/bin' + commandLine 'rsync', '-am', + '--exclude=pre-build', + '--exclude=installers', + '--exclude=corretto-build', + "${project.rootDir}/", buildRoot +} + +/** + * Scan the patches folder for any .patch that needs + * to be applied before start building. + */ +task applyPatches() { + dependsOn copySource + doLast { + fileTree('patches').matching { + include '*.patch' + }.each { f -> + ant.patch(patchfile: f, dir: "$buildRoot", strip: 0) + } + } +} + +task configureBuild(type: Exec) { + + dependsOn project.configurations.compile + dependsOn applyPatches + workingDir "$buildRoot" + + // Platform specific flags + def command = ['bash', 'configure', + "--with-cacerts-file=${depsMap[caCerts]}" + ] + // Common flags + command += project.correttoCommonFlags + commandLine command.flatten() +} + +task executeBuild(type: Exec) { + dependsOn configureBuild + workingDir "$buildRoot" + commandLine 'make', 'images' + outputs.dir jdkResultingImage +} + +task createTestImage(type: Exec) { + dependsOn executeBuild + workingDir "$buildRoot" + commandLine 'make','test-image-hotspot-jtreg-native','test-image-jdk-jtreg-native' +} + +task packageTestImage(type: Tar) { + dependsOn createTestImage + description 'Package test results' + archiveName "amazon-corretto-testimage-${project.version.full}-alpine-linux-${arch_alias}.tar.gz" + compression Compression.GZIP + from(testResultingImage) { + include '**' + } + into "amazon-corretto-testimage-${project.version.full}-alpine-linux-${arch_alias}" + +} + +task packageBuildResults(type: Tar) { + description 'Compresses the JDK image and puts the results in build/distributions.' + dependsOn packageTestImage + dependsOn executeBuild + archiveName "amazon-corretto-${project.version.full}-alpine-linux-${arch_alias}.tar.gz" + compression Compression.GZIP + from(buildRoot) { + include 'ADDITIONAL_LICENSE_INFO' + include 'ASSEMBLY_EXCEPTION' + include 'LICENSE' + include 'README.md' + include 'version.txt' + } + from(jdkResultingImage) { + include 'bin/**' + include 'conf/**' + include 'include/**' + include 'jmods/**' + include 'legal/**' + include 'lib/**' + include 'man/man1/**' + include 'release' + } + into "amazon-corretto-${project.version.full}-alpine-linux-${arch_alias}" +} + +artifacts { + archives packageBuildResults +} diff --git a/installers/linux/alpine/tar/patches/zlib.patch b/installers/linux/alpine/tar/patches/zlib.patch new file mode 100644 index 00000000000..98136dab4dd --- /dev/null +++ b/installers/linux/alpine/tar/patches/zlib.patch @@ -0,0 +1,149 @@ +This patch is applied to disable implicit-fallthrough warnings on gcc7 or +higher when building the bundled version of zlib. + +diff --git src/java.base/share/native/libzip/zlib/infback.c src/java.base/share/native/libzip/zlib/infback.c +index 4c8283909..1a9cc6b60 100644 +--- src/java.base/share/native/libzip/zlib/infback.c ++++ src/java.base/share/native/libzip/zlib/infback.c +@@ -501,7 +501,7 @@ void FAR *out_desc; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; +- ++ /* FALLTHROUGH */ + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { +diff --git src/java.base/share/native/libzip/zlib/inflate.c src/java.base/share/native/libzip/zlib/inflate.c +index ca904e744..4abfe84a5 100644 +--- src/java.base/share/native/libzip/zlib/inflate.c ++++ src/java.base/share/native/libzip/zlib/inflate.c +@@ -764,6 +764,7 @@ int flush; + CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; ++ /* FALLTHROUGH */ + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); +@@ -777,6 +778,7 @@ int flush; + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; ++ /* FALLTHROUGH */ + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; +@@ -799,6 +801,7 @@ int flush; + } + state->length = 0; + state->mode = NAME; ++ /* FALLTHROUGH */ + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; +@@ -820,6 +823,7 @@ int flush; + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; ++ /* FALLTHROUGH */ + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; +@@ -840,6 +844,7 @@ int flush; + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; ++ /* FALLTHROUGH */ + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); +@@ -863,6 +868,7 @@ int flush; + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; ++ /* FALLTHROUGH */ + case DICT: + if (state->havedict == 0) { + RESTORE(); +@@ -870,8 +876,10 @@ int flush; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; ++ /* FALLTHROUGH */ + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; ++ /* FALLTHROUGH */ + case TYPEDO: + if (state->last) { + BYTEBITS(); +@@ -922,8 +930,10 @@ int flush; + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; ++ /* FALLTHROUGH */ + case COPY_: + state->mode = COPY; ++ /* FALLTHROUGH */ + case COPY: + copy = state->length; + if (copy) { +@@ -1063,8 +1073,10 @@ int flush; + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; ++ /* FALLTHROUGH */ + case LEN_: + state->mode = LEN; ++ /* FALLTHROUGH */ + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); +@@ -1114,6 +1126,7 @@ int flush; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; ++ /* FALLTHROUGH */ + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); +@@ -1124,6 +1137,7 @@ int flush; + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; ++ /* FALLTHROUGH */ + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; +@@ -1151,6 +1165,7 @@ int flush; + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; ++ /* FALLTHROUGH */ + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); +@@ -1167,6 +1182,7 @@ int flush; + #endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; ++ /* FALLTHROUGH */ + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; +@@ -1242,6 +1258,7 @@ int flush; + } + #ifdef GUNZIP + state->mode = LENGTH; ++ /* FALLTHROUGH */ + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); +@@ -1255,6 +1272,7 @@ int flush; + } + #endif + state->mode = DONE; ++ /* FALLTHROUGH */ + case DONE: + ret = Z_STREAM_END; + goto inf_leave; diff --git a/installers/linux/universal/deb/build.gradle b/installers/linux/universal/deb/build.gradle new file mode 100644 index 00000000000..5f4848c64bb --- /dev/null +++ b/installers/linux/universal/deb/build.gradle @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2019, Amazon.com, Inc. or its affiliates. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Amazon designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +plugins { + id 'nebula.ospackage' version '8.4.1' +} + +dependencies { + compile project(path: ':installers:linux:universal:tar', configuration: 'archives') +} + +ext { + switch (project.correttoArch) { + case 'aarch64': + arch_deb = 'arm64' + break; + case 'x86': + arch_deb = "i386" + break + case 'x64': + arch_deb = 'amd64' + break + } +} + +def jvmDir = '/usr/lib/jvm' +def jdkInstallationDirName = "java-${project.version.major}-amazon-corretto" +def jdkHome = "${jvmDir}/${jdkInstallationDirName}".toString() +def jdkBinaryDir = "${buildRoot}/${project.correttoJdkArchiveName}" +def jdkPackageName = "java-${project.version.major}-amazon-corretto-jdk" + +def alternativesPriority = String.format("1%2s%2s%3s", project.version.major, project.version.minor, project.version.security).replace(' ', '0') + +def jinfoName = ".${jdkInstallationDirName}.jinfo" + +ospackage { + // Valid version must start with a digit and only contain [A-Za-z0-9.+:~-] + // See http://manpages.ubuntu.com/manpages/artful/en/man5/deb-version.5.html + version project.version.upstream + release project.version.revision + + url "${packageInfo.url}" + vendor "${packageInfo.vendor}" + packager "${packageInfo.packager}" + license "${packageInfo.license}" + buildHost "${packageInfo.buildHost}" + maintainer "${packageInfo.maintainer}" + packageGroup 'java' + priority 'optional' + user 'root' + permissionGroup 'root' + epoch 1 + arch arch_deb + multiArch SAME +} + +/** + * Uncompress and copy the universal Corretto artifact + * tar for DEB packaging. + */ +task extractUniversalTar(type: Copy) { + dependsOn project.configurations.compile + from tarTree(project.configurations.compile.singleFile) + into buildRoot +} + +/** + * Populate version numbers, java home and alternatives + * priority to postin_jdk.sh.template and preun_jdk.sh.template. + * Create script copies under build root scripts folder. + */ +task inflateDebScriptTemplate(type: Copy) { + dependsOn extractUniversalTar + // In trusty repo, openjdk7 has priority 1071 and openjdk6 has 1061 + // Corretto uses the same priority in both rpm and deb + def priority = + from('scripts') { + include '**/*.template' + rename { file -> file.replace('.template', '') } + filter(org.apache.tools.ant.filters.ReplaceTokens, + tokens: project.version + [java_home: jdkHome, alternatives_priority: alternativesPriority, + jdk_tools: jdkTools.join(' ')]) + } + into "${buildRoot}/scripts" +} + +/** + * Inflate jinfo file used by update-java-alternatives command. + * Create script copy under buildRoot/jinfo folder. See + * http://manpages.ubuntu.com/manpages/xenial/man8/update-java-alternatives.8.html#files + */ +task inflateJinfoTemplate(type: Copy) { + from('jinfo') { + include '**/*.template' + rename('jinfo.template', jinfoName) + filter(org.apache.tools.ant.filters.ReplaceTokens, + tokens: project.version + [java_home : jdkHome, alternatives_priority: alternativesPriority, + directory_name: jdkInstallationDirName.toString()]) + expand(jdk_tools: jdkTools) + } + into "${buildRoot}/jinfo" +} + +/** + * Generate DEB for JDK, with package published under + * distributions folder. + */ +task generateJdkDeb(type: Deb) { + description 'Create the DEB package for Corretto JDK' + dependsOn inflateDebScriptTemplate + dependsOn inflateJinfoTemplate + + packageName jdkPackageName + packageDescription "Amazon Corretto\'s packaging of the OpenJDK ${project.version.major} code." + summary "Amazon Corretto ${project.version.major} development environment" + + postInstall file("$buildRoot/scripts/postin_jdk.sh") + preUninstall file("$buildRoot/scripts/preun_jdk.sh") + + requires('java-common') + // jdk + provides('java-compiler') + provides('java-sdk') + provides('java5-sdk') + provides('java6-sdk') + provides('java7-sdk') + provides('java7-jdk') + provides('java8-jdk') + provides('java11-sdk') + // TODO: Move this to the jre when splitting the fat deb + provides('java-runtime') + provides('java5-runtime') + provides('java6-runtime') + provides('java7-runtime') + provides('java8-runtime') + provides('java11-runtime') + // TODO: Move this to the headless jre when splitting the fat deb + provides('java-runtime-headless') + provides('java5-runtime-headless') + provides('java6-runtime-headless') + provides('java7-runtime-headless') + provides('java8-runtime-headless') + provides('java11-runtime-headless') + + from(jdkBinaryDir) { + into jdkHome + } + + from("$buildRoot/jinfo") { + include '**/*.jinfo' + into jvmDir + } +} + +artifacts { + archives generateJdkDeb +} diff --git a/installers/linux/universal/deb/jinfo/jinfo.template b/installers/linux/universal/deb/jinfo/jinfo.template new file mode 100644 index 00000000000..2827503f4b6 --- /dev/null +++ b/installers/linux/universal/deb/jinfo/jinfo.template @@ -0,0 +1,7 @@ +name=@directory_name@ +alias=@directory_name@ +priority=@alternatives_priority@ +section=main + +<% jdk_tools.each {%>jdk ${it} @java_home@/bin/${it} +<%}%> \ No newline at end of file diff --git a/installers/linux/universal/deb/scripts/postin_jdk.sh.template b/installers/linux/universal/deb/scripts/postin_jdk.sh.template new file mode 100644 index 00000000000..e883f0e5377 --- /dev/null +++ b/installers/linux/universal/deb/scripts/postin_jdk.sh.template @@ -0,0 +1,19 @@ +# postinst script for Corretto +# +# summary of how this script can be called: +# * `configure' +# for details, see https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html or +# the debian-policy package + + +# Note that Nebula gradle-ospackage-plugin default and only support `configure` option for post installation script. + +for i in @jdk_tools@; do + if [ -e @java_home@/bin/$i ]; then + cmd="update-alternatives --install /usr/bin/$i $i @java_home@/bin/$i @alternatives_priority@" + if [ -e @java_home@/man/man1/$i.1 ]; then + cmd="$cmd --slave /usr/share/man/man1/$i.1 $i.1 @java_home@/man/man1/$i.1" + fi + $cmd + fi +done diff --git a/installers/linux/universal/deb/scripts/preun_jdk.sh.template b/installers/linux/universal/deb/scripts/preun_jdk.sh.template new file mode 100644 index 00000000000..69865534105 --- /dev/null +++ b/installers/linux/universal/deb/scripts/preun_jdk.sh.template @@ -0,0 +1,18 @@ +# postrm script for Corretto +# +# summary of how this script can be called: +# * `remove' +# for details, see https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html or +# the debian-policy package + +case "$1" in + remove | deconfigure) + for i in @jdk_tools@; do + if [ -e @java_home@/bin/$i ]; then + update-alternatives --remove $i @java_home@/bin/$i + fi + done + ;; +esac + +exit 0 diff --git a/installers/linux/universal/rpm/build.gradle b/installers/linux/universal/rpm/build.gradle new file mode 100644 index 00000000000..494662e2591 --- /dev/null +++ b/installers/linux/universal/rpm/build.gradle @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2019, Amazon.com, Inc. or its affiliates. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Amazon designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +plugins { + id 'nebula.ospackage' version '8.4.1' +} + +dependencies { + compile project(path: ':installers:linux:universal:tar', configuration: 'archives') +} + +ext { + switch (project.correttoArch) { + case 'aarch64': + arch_redline = 'AARCH64' + break; + case 'x86': + arch_redline = "i386" + break + case 'x64': + arch_redline = 'x86_64' + break + } +} + +def jvmDir = '/usr/lib/jvm' +def jdkInstallationDirName = "java-${project.version.major}-amazon-corretto" +def jdkHome = "${jvmDir}/${jdkInstallationDirName}" +def jdkBinaryDir = "${buildRoot}/${project.correttoJdkArchiveName}" +def jdkPackageName = "java-${project.version.major}-amazon-corretto-devel" + +ospackage { + version project.version.upstream + release project.version.revision + + url "${packageInfo.url}" + vendor "${packageInfo.vendor}" + packager "${packageInfo.packager}" + license "${packageInfo.license}" + buildHost "${packageInfo.buildHost}" + user 'root' + permissionGroup 'root' + epoch 1 + arch arch_redline + os LINUX + type BINARY +} + +/** + * Uncompress and copy the universal Corretto artifact + * tar for RPM packaging. + */ +task extractUniversalTar(type: Copy) { + dependsOn project.configurations.compile + from tarTree(project.configurations.compile.singleFile) + into buildRoot +} + +/** + * Populate version numbers, java home and alternatives + * priority to postin_javac.sh.template and preun_javac.sh.template. + * Create script copies under build root scripts folder. + */ +task inflateRpmScriptTemplate(type: Copy) { + dependsOn extractUniversalTar + // Use the same priority as IcedTea JDK RPM distribution, based on java version + def priority = String.format("1%2s%2s%3s", project.version.major, project.version.minor, project.version.security).replace(' ', '0') + from('scripts') { + include '**/*.template' + rename { file -> file.replace('.template', '') } + filter(org.apache.tools.ant.filters.ReplaceTokens, + tokens: project.version + [alternatives_priority: priority]) + } + into "${buildRoot}/scripts" +} + +/** + * Generate RPM for JDK, with package published under + * distributions folder. + */ +task generateJdkRpm(type: Rpm) { + description 'Create the RPM package for Corretto JDK' + dependsOn inflateRpmScriptTemplate + packageName jdkPackageName + packageDescription packageInfo.description + summary "Amazon Corretto ${project.version.major} development environment" + packageGroup 'Development/Tools' + prefix(jdkHome) + postInstall file("$buildRoot/scripts/postin_java.sh") + postInstall file("$buildRoot/scripts/postin_javac.sh") + preUninstall file("$buildRoot/scripts/preun_java.sh") + preUninstall file("$buildRoot/scripts/preun_javac.sh") + + provides(jdkPackageName, "${epoch}:${version}-${release}", EQUAL) + provides('java-11-devel', "${epoch}:${version}", EQUAL) + provides('java-11-openjdk-devel', "${epoch}:${version}", EQUAL) + provides('java-11-openjdk-devel', "${epoch}:${version}-${release}", EQUAL) + provides('java-sdk-11', "${epoch}:${version}", EQUAL) + provides('java-sdk-11-openjdk ', "${epoch}:${version}-${release}", EQUAL) + + from(jdkBinaryDir) { + into jdkHome + } +} + +artifacts { + archives generateJdkRpm +} diff --git a/installers/linux/universal/rpm/scripts/postin_java.sh.template b/installers/linux/universal/rpm/scripts/postin_java.sh.template new file mode 100644 index 00000000000..38faceace9b --- /dev/null +++ b/installers/linux/universal/rpm/scripts/postin_java.sh.template @@ -0,0 +1,17 @@ +if [ $1 -eq 1 ] ; then + alternatives --install /usr/bin/java java ${RPM_INSTALL_PREFIX}/bin/java @alternatives_priority@ \ + --slave /usr/lib/jvm/jre jre ${RPM_INSTALL_PREFIX} \ + --slave /usr/bin/jjs jjs ${RPM_INSTALL_PREFIX}/bin/jjs \ + --slave /usr/bin/keytool keytool ${RPM_INSTALL_PREFIX}/bin/keytool \ + --slave /usr/bin/pack200 pack200 ${RPM_INSTALL_PREFIX}/bin/pack200 \ + --slave /usr/bin/rmid rmid ${RPM_INSTALL_PREFIX}/bin/rmid \ + --slave /usr/bin/rmiregistry rmiregistry ${RPM_INSTALL_PREFIX}/bin/rmiregistry \ + --slave /usr/bin/unpack200 unpack200 ${RPM_INSTALL_PREFIX}/bin/unpack200 \ + --slave /usr/share/man/man1/java.1 java.1 ${RPM_INSTALL_PREFIX}/man/man1/java.1 \ + --slave /usr/share/man/man1/jjs.1 jjs.1 ${RPM_INSTALL_PREFIX}/man/man1/jjs.1 \ + --slave /usr/share/man/man1/keytool.1 keytool.1 ${RPM_INSTALL_PREFIX}/man/man1/keytool.1 \ + --slave /usr/share/man/man1/pack200.1 pack200.1 ${RPM_INSTALL_PREFIX}/man/man1/pack200.1 \ + --slave /usr/share/man/man1/rmid.1 rmid.1 ${RPM_INSTALL_PREFIX}/man/man1/rmid.1 \ + --slave /usr/share/man/man1/rmiregistry.1 rmiregistry.1 ${RPM_INSTALL_PREFIX}/man/man1/rmiregistry.1 \ + --slave /usr/share/man/man1/unpack200.1 unpack200.1 ${RPM_INSTALL_PREFIX}/man/man1/unpack200.1 +fi diff --git a/installers/linux/universal/rpm/scripts/postin_javac.sh.template b/installers/linux/universal/rpm/scripts/postin_javac.sh.template new file mode 100644 index 00000000000..afa79559e55 --- /dev/null +++ b/installers/linux/universal/rpm/scripts/postin_javac.sh.template @@ -0,0 +1,46 @@ +if [ $1 -eq 1 ] ; then + alternatives --install /usr/bin/javac javac ${RPM_INSTALL_PREFIX}/bin/javac @alternatives_priority@ \ + --slave /usr/lib/jvm/java java_sdk ${RPM_INSTALL_PREFIX} \ + --slave /usr/bin/jaotc jaotc ${RPM_INSTALL_PREFIX}/bin/jaotc \ + --slave /usr/bin/jlink jlink ${RPM_INSTALL_PREFIX}/bin/jlink \ + --slave /usr/bin/jmod jmod ${RPM_INSTALL_PREFIX}/bin/jmod \ + --slave /usr/bin/jhsdb jhsdb ${RPM_INSTALL_PREFIX}/bin/jhsdb \ + --slave /usr/bin/jar jar ${RPM_INSTALL_PREFIX}/bin/jar \ + --slave /usr/bin/jarsigner jarsigner ${RPM_INSTALL_PREFIX}/bin/jarsigner \ + --slave /usr/bin/javadoc javadoc ${RPM_INSTALL_PREFIX}/bin/javadoc \ + --slave /usr/bin/javap javap ${RPM_INSTALL_PREFIX}/bin/javap \ + --slave /usr/bin/jcmd jcmd ${RPM_INSTALL_PREFIX}/bin/jcmd \ + --slave /usr/bin/jconsole jconsole ${RPM_INSTALL_PREFIX}/bin/jconsole \ + --slave /usr/bin/jdb jdb ${RPM_INSTALL_PREFIX}/bin/jdb \ + --slave /usr/bin/jdeps jdeps ${RPM_INSTALL_PREFIX}/bin/jdeps \ + --slave /usr/bin/jdeprscan jdeprscan ${RPM_INSTALL_PREFIX}/bin/jdeprscan \ + --slave /usr/bin/jimage jimage ${RPM_INSTALL_PREFIX}/bin/jimage \ + --slave /usr/bin/jinfo jinfo ${RPM_INSTALL_PREFIX}/bin/jinfo \ + --slave /usr/bin/jmap jmap ${RPM_INSTALL_PREFIX}/bin/jmap \ + --slave /usr/bin/jps jps ${RPM_INSTALL_PREFIX}/bin/jps \ + --slave /usr/bin/jrunscript jrunscript ${RPM_INSTALL_PREFIX}/bin/jrunscript \ + --slave /usr/bin/jshell jshell ${RPM_INSTALL_PREFIX}/bin/jshell \ + --slave /usr/bin/jstack jstack ${RPM_INSTALL_PREFIX}/bin/jstack \ + --slave /usr/bin/jstat jstat ${RPM_INSTALL_PREFIX}/bin/jstat \ + --slave /usr/bin/jstatd jstatd ${RPM_INSTALL_PREFIX}/bin/jstatd \ + --slave /usr/bin/rmic rmic ${RPM_INSTALL_PREFIX}/bin/rmic \ + --slave /usr/bin/serialver serialver ${RPM_INSTALL_PREFIX}/bin/serialver \ + --slave /usr/share/man/man1/jar.1 jar.1 ${RPM_INSTALL_PREFIX}/man/man1/jar.1 \ + --slave /usr/share/man/man1/jarsigner.1 jarsigner.1 ${RPM_INSTALL_PREFIX}/man/man1/jarsigner.1 \ + --slave /usr/share/man/man1/javac.1 javac.1 ${RPM_INSTALL_PREFIX}/man/man1/javac.1 \ + --slave /usr/share/man/man1/javadoc.1 javadoc.1 ${RPM_INSTALL_PREFIX}/man/man1/javadoc.1 \ + --slave /usr/share/man/man1/javap.1 javap.1 ${RPM_INSTALL_PREFIX}/man/man1/javap.1 \ + --slave /usr/share/man/man1/jcmd.1 jcmd.1 ${RPM_INSTALL_PREFIX}/man/man1/jcmd.1 \ + --slave /usr/share/man/man1/jconsole.1 jconsole.1 ${RPM_INSTALL_PREFIX}/man/man1/jconsole.1 \ + --slave /usr/share/man/man1/jdb.1 jdb.1 ${RPM_INSTALL_PREFIX}/man/man1/jdb.1 \ + --slave /usr/share/man/man1/jdeps.1 jdeps.1 ${RPM_INSTALL_PREFIX}/man/man1/jdeps.1 \ + --slave /usr/share/man/man1/jinfo.1 jinfo.1 ${RPM_INSTALL_PREFIX}/man/man1/jinfo.1 \ + --slave /usr/share/man/man1/jmap.1 jmap.1 ${RPM_INSTALL_PREFIX}/man/man1/jmap.1 \ + --slave /usr/share/man/man1/jps.1 jps.1 ${RPM_INSTALL_PREFIX}/man/man1/jps.1 \ + --slave /usr/share/man/man1/jrunscript.1 jrunscript.1 ${RPM_INSTALL_PREFIX}/man/man1/jrunscript.1 \ + --slave /usr/share/man/man1/jstack.1 jstack.1 ${RPM_INSTALL_PREFIX}/man/man1/jstack.1 \ + --slave /usr/share/man/man1/jstat.1 jstat.1 ${RPM_INSTALL_PREFIX}/man/man1/jstat.1 \ + --slave /usr/share/man/man1/jstatd.1 jstatd.1 ${RPM_INSTALL_PREFIX}/man/man1/jstatd.1 \ + --slave /usr/share/man/man1/rmic.1 rmic.1 ${RPM_INSTALL_PREFIX}/man/man1/rmic.1 \ + --slave /usr/share/man/man1/serialver.1 serialver.1 ${RPM_INSTALL_PREFIX}/man/man1/serialver.1 +fi diff --git a/installers/linux/universal/rpm/scripts/preun_java.sh.template b/installers/linux/universal/rpm/scripts/preun_java.sh.template new file mode 100644 index 00000000000..6ee80c62528 --- /dev/null +++ b/installers/linux/universal/rpm/scripts/preun_java.sh.template @@ -0,0 +1,3 @@ +if [ $1 -eq 0 ] ; then + alternatives --remove java ${RPM_INSTALL_PREFIX}/bin/java +fi diff --git a/installers/linux/universal/rpm/scripts/preun_javac.sh.template b/installers/linux/universal/rpm/scripts/preun_javac.sh.template new file mode 100644 index 00000000000..b577074a5c0 --- /dev/null +++ b/installers/linux/universal/rpm/scripts/preun_javac.sh.template @@ -0,0 +1,3 @@ +if [ $1 -eq 0 ] ; then + alternatives --remove javac ${RPM_INSTALL_PREFIX}/bin/javac +fi diff --git a/installers/linux/universal/tar/build.gradle b/installers/linux/universal/tar/build.gradle new file mode 100644 index 00000000000..68fa2382f33 --- /dev/null +++ b/installers/linux/universal/tar/build.gradle @@ -0,0 +1,141 @@ +/* +* Copyright (c) 2019, Amazon.com, Inc. or its affiliates. All Rights Reserved. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 only, as +* published by the Free Software Foundation. Amazon designates this +* particular file as subject to the "Classpath" exception as provided +* by Oracle in the LICENSE file that accompanied this code. +* +* This code is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* version 2 for more details (a copy is included in the LICENSE file that +* accompanied this code). +* +* You should have received a copy of the GNU General Public License version +* 2 along with this work; if not, write to the Free Software Foundation, +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + + +dependencies { + compile project(path: ':openjdksrc', configuration: 'archives') + compile project(path: ':prebuild', configuration: 'cacerts') +} + +if (project.correttoArch == 'x86') { + project.correttoCommonFlags += '--with-target-bits=32' +} + +def imageDir= "$buildRoot/build/${project.jdkImageName}/images" +def jdkResultingImage = "${imageDir}/jdk" +def testResultingImage = "${imageDir}/test" + +// deps +def depsMap = [:] +project.configurations.compile.getFiles().each { depsMap[it.getName()] = it } +/** + * Create a local copy of the source tree in our + * build root -- this is required since OpenJDK's + * build wants to occur inside the source tree, + * and we don't want to tamper with someone + * else's tree. + */ +task copySource(type: Exec) { + if (!file(buildRoot).exists()) { + file(buildRoot).mkdirs() + } + workingDir '/usr/bin' + commandLine 'rsync', '-am', + '--exclude=pre-build', + '--exclude=installers', + '--exclude=corretto-build', + "${project.rootDir}/", buildRoot +} + +/** + * Scan the patches folder for any .patch that needs + * to be applied before start building. + */ +task applyPatches() { + dependsOn copySource + doLast { + fileTree('patches').matching { + include '*.patch' + }.each { f -> + ant.patch(patchfile: f, dir: "$buildRoot", strip: 0) + } + } +} + +task configureBuild(type: Exec) { + dependsOn project.configurations.compile + dependsOn applyPatches + workingDir "$buildRoot" + + // Platform specific flags + def command = ['bash', 'configure', + "--with-cacerts-file=${depsMap[caCerts]}", + "--with-zlib=bundled" + ] + // Common flags + command += project.correttoCommonFlags + commandLine command.flatten() + +} + +task executeBuild(type: Exec) { + dependsOn configureBuild + workingDir "$buildRoot" + commandLine 'make', 'images' + outputs.dir jdkResultingImage +} + +task createTestImage(type: Exec) { + dependsOn executeBuild + workingDir "$buildRoot" + commandLine 'make','test-image-hotspot-jtreg-native','test-image-jdk-jtreg-native' +} + +task packageTestImage(type: Tar) { + dependsOn createTestImage + description 'Package test results' + archiveName "${project.correttoTestImageArchiveName}.tar.gz" + compression Compression.GZIP + from(testResultingImage) { + include '**' + } + into project.correttoTestImageArchiveName + +} + +task packageBuildResults(type: Tar) { + description 'Compresses the JDK image and puts the results in build/distributions.' + dependsOn packageTestImage + archiveName "${project.correttoJdkArchiveName}.tar.gz" + compression Compression.GZIP + from(buildRoot) { + include 'ADDITIONAL_LICENSE_INFO' + include 'ASSEMBLY_EXCEPTION' + include 'LICENSE' + include 'README.md' + include 'version.txt' + } + from(jdkResultingImage) { + include 'bin/**' + include 'conf/**' + include 'include/**' + include 'jmods/**' + include 'legal/**' + include 'lib/**' + include 'man/man1/**' + include 'release' + } + into project.correttoJdkArchiveName +} + +artifacts { + archives packageBuildResults +} diff --git a/installers/linux/universal/tar/patches/zlib.patch b/installers/linux/universal/tar/patches/zlib.patch new file mode 100644 index 00000000000..98136dab4dd --- /dev/null +++ b/installers/linux/universal/tar/patches/zlib.patch @@ -0,0 +1,149 @@ +This patch is applied to disable implicit-fallthrough warnings on gcc7 or +higher when building the bundled version of zlib. + +diff --git src/java.base/share/native/libzip/zlib/infback.c src/java.base/share/native/libzip/zlib/infback.c +index 4c8283909..1a9cc6b60 100644 +--- src/java.base/share/native/libzip/zlib/infback.c ++++ src/java.base/share/native/libzip/zlib/infback.c +@@ -501,7 +501,7 @@ void FAR *out_desc; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; +- ++ /* FALLTHROUGH */ + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { +diff --git src/java.base/share/native/libzip/zlib/inflate.c src/java.base/share/native/libzip/zlib/inflate.c +index ca904e744..4abfe84a5 100644 +--- src/java.base/share/native/libzip/zlib/inflate.c ++++ src/java.base/share/native/libzip/zlib/inflate.c +@@ -764,6 +764,7 @@ int flush; + CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; ++ /* FALLTHROUGH */ + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); +@@ -777,6 +778,7 @@ int flush; + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; ++ /* FALLTHROUGH */ + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; +@@ -799,6 +801,7 @@ int flush; + } + state->length = 0; + state->mode = NAME; ++ /* FALLTHROUGH */ + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; +@@ -820,6 +823,7 @@ int flush; + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; ++ /* FALLTHROUGH */ + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; +@@ -840,6 +844,7 @@ int flush; + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; ++ /* FALLTHROUGH */ + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); +@@ -863,6 +868,7 @@ int flush; + strm->adler = state->check = ZSWAP32(hold); + INITBITS(); + state->mode = DICT; ++ /* FALLTHROUGH */ + case DICT: + if (state->havedict == 0) { + RESTORE(); +@@ -870,8 +876,10 @@ int flush; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; ++ /* FALLTHROUGH */ + case TYPE: + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; ++ /* FALLTHROUGH */ + case TYPEDO: + if (state->last) { + BYTEBITS(); +@@ -922,8 +930,10 @@ int flush; + INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; ++ /* FALLTHROUGH */ + case COPY_: + state->mode = COPY; ++ /* FALLTHROUGH */ + case COPY: + copy = state->length; + if (copy) { +@@ -1063,8 +1073,10 @@ int flush; + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; ++ /* FALLTHROUGH */ + case LEN_: + state->mode = LEN; ++ /* FALLTHROUGH */ + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); +@@ -1114,6 +1126,7 @@ int flush; + } + state->extra = (unsigned)(here.op) & 15; + state->mode = LENEXT; ++ /* FALLTHROUGH */ + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); +@@ -1124,6 +1137,7 @@ int flush; + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; + state->mode = DIST; ++ /* FALLTHROUGH */ + case DIST: + for (;;) { + here = state->distcode[BITS(state->distbits)]; +@@ -1151,6 +1165,7 @@ int flush; + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; + state->mode = DISTEXT; ++ /* FALLTHROUGH */ + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); +@@ -1167,6 +1182,7 @@ int flush; + #endif + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; ++ /* FALLTHROUGH */ + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; +@@ -1242,6 +1258,7 @@ int flush; + } + #ifdef GUNZIP + state->mode = LENGTH; ++ /* FALLTHROUGH */ + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); +@@ -1255,6 +1272,7 @@ int flush; + } + #endif + state->mode = DONE; ++ /* FALLTHROUGH */ + case DONE: + ret = Z_STREAM_END; + goto inf_leave; diff --git a/installers/mac/pkg/README.md b/installers/mac/pkg/README.md new file mode 100644 index 00000000000..7e92b9e8165 --- /dev/null +++ b/installers/mac/pkg/README.md @@ -0,0 +1,26 @@ +### Instruction for generating Amazon Corretto 11 installer + +#### Prerequisites + +The generation of the Corretto installer depends on an open-source utility tool [Packages](http://s.sudre.free.fr/Software/Packages/about.html). +The application must be installed before running the installer generation task. + +There are two options to generate a Corretto installer. + +#### Option 1: Build Corretto 11 +* Under the root directory of the repository, run +``` +./gradlew :installers:mac:pkg:generateInstaller +``` + +#### Option 2: Use pre-built Corretto 8 artifacts +* Set the environment variable "CORRETTO_ARTIFACTS_PATH" to the path of the pre-built Corretto artifacts. +``` +export CORRETTO_ARTIFACTS_PATH=.../path/to/amazon-corretto-11.jdk +``` +* Under the root directory of the repository, run +``` +./gradlew :installers:mac:pkg:generateInstaller +``` + +The installer will be generated under "/installers/mac/pkg/corretto-build/distributions". diff --git a/installers/mac/pkg/build.gradle b/installers/mac/pkg/build.gradle new file mode 100644 index 00000000000..5f4af8de081 --- /dev/null +++ b/installers/mac/pkg/build.gradle @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2019, Amazon.com, Inc. or its affiliates. All Rights Reserved. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 only, as +* published by the Free Software Foundation. Amazon designates this +* particular file as subject to the "Classpath" exception as provided +* by Oracle in the LICENSE file that accompanied this code. +* +* This code is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* version 2 for more details (a copy is included in the LICENSE file that +* accompanied this code). +* +* You should have received a copy of the GNU General Public License version +* 2 along with this work; if not, write to the Free Software Foundation, +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +dependencies { + compile project(path: ':installers:mac:tar', configuration: 'buildTar') +} + +// Copy task cannot be used here because Gradle does not preserve the symlink +task retrieveArtifacts(type: Exec) { + // Set environment variable CORRETTO_ARTIFACTS_PATH to the path of "amazon-corretto-8.jdk" to be packaged + def artifactsPath = System.getenv("CORRETTO_ARTIFACTS_PATH") + workingDir buildRoot + if (artifactsPath == null) { + dependsOn project.configurations.compile + commandLine "tar", "xf", project.configurations.compile.singleFile + } else { + commandLine "cp", "-Rf", "${artifactsPath}", buildRoot + } +} + +task copyResources(type: Copy) { + from "." + include 'resources/**' + into buildRoot +} + +task inflatePkgTemplate { + dependsOn copyResources + doLast { + copy { + from('templates/CorrettoPkg.pkgproj.template') { + rename { file -> file.replace('.template', '') } + filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: project.version) + } + into buildRoot + } + + copy { + from('templates/introduction.html.template') { + rename { file -> file.replace('.template', '') } + filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: project.version) + } + into "${buildRoot}/resources" + } + } + +} + +task generateInstaller { + dependsOn retrieveArtifacts + dependsOn copyResources + dependsOn inflatePkgTemplate + outputs.dir distributionDir + + doLast { + exec { + workingDir buildRoot + // Generation of the installer depends on the utility tool Packages: + // http://s.sudre.free.fr/Software/Packages/about.html + commandLine "packagesbuild", "-v", "--build-folder", distributionDir, "CorrettoPkg.pkgproj" + } + } +} + +build.dependsOn generateInstaller + +artifacts { + archives file: generateInstaller.outputs.getFiles().getSingleFile(), builtBy: generateInstaller +} diff --git a/installers/mac/pkg/resources/amazon.png b/installers/mac/pkg/resources/amazon.png new file mode 100644 index 0000000000000000000000000000000000000000..353b0f0399c835e6b09b40e33ca505835ce0af82 GIT binary patch literal 15540 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 literal 0 HcmV?d00001 diff --git a/installers/mac/pkg/resources/preinstall b/installers/mac/pkg/resources/preinstall new file mode 100755 index 00000000000..6460c546f47 --- /dev/null +++ b/installers/mac/pkg/resources/preinstall @@ -0,0 +1,9 @@ +#!/bin/bash +JDK_INSTALL_PATH="/Library/Java/JavaVirtualMachines" +MKDIR=`which mkdir` + +if [[ ! -d ${JDK_INSTALL_PATH} ]]; then + ${MKDIR} -p ${JDK_INSTALL_PATH} +fi + +exit 0 diff --git a/installers/mac/pkg/templates/CorrettoPkg.pkgproj.template b/installers/mac/pkg/templates/CorrettoPkg.pkgproj.template new file mode 100644 index 00000000000..09a0ad13bf0 --- /dev/null +++ b/installers/mac/pkg/templates/CorrettoPkg.pkgproj.template @@ -0,0 +1,574 @@ + + + + + + PACKAGES + + + MUST-CLOSE-APPLICATION-ITEMS + + MUST-CLOSE-APPLICATIONS + + PACKAGE_FILES + + DEFAULT_INSTALL_LOCATION + / + HIERARCHY + + CHILDREN + + + CHILDREN + + + CHILDREN + + + CHILDREN + + + BUNDLE_CAN_DOWNGRADE + + BUNDLE_POSTINSTALL_PATH + + PATH_TYPE + 0 + + BUNDLE_PREINSTALL_PATH + + PATH_TYPE + 0 + + CHILDREN + + GID + 0 + PATH + amazon-corretto-@major@.jdk + PATH_TYPE + 1 + PERMISSIONS + 493 + TYPE + 3 + UID + 0 + + + GID + 0 + PATH + JavaVirtualMachines + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + Java + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + Library + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + + GID + 0 + PATH + / + PATH_TYPE + 0 + PERMISSIONS + 493 + TYPE + 1 + UID + 0 + + PAYLOAD_TYPE + 0 + SHOW_INVISIBLE + + SPLIT_FORKS + + TREAT_MISSING_FILES_AS_WARNING + + VERSION + 5 + + PACKAGE_SCRIPTS + + POSTINSTALL_PATH + + PATH_TYPE + 0 + + PREINSTALL_PATH + + PATH + resources/preinstall + PATH_TYPE + 1 + + RESOURCES + + + PACKAGE_SETTINGS + + AUTHENTICATION + 1 + CONCLUSION_ACTION + 0 + FOLLOW_SYMBOLIC_LINKS + + IDENTIFIER + com.amazon.corretto.@major@ + LOCATION + 0 + NAME + amazon-corretto-@major@.jdk + OVERWRITE_PERMISSIONS + + PAYLOAD_SIZE + -1 + REFERENCE_PATH + + RELOCATABLE + + USE_HFS+_COMPRESSION + + VERSION + @full@ + + TYPE + 0 + UUID + 191C178B-0441-4E1C-9D79-D41E1E19B492 + + + PROJECT + + PROJECT_COMMENTS + + NOTES + + + + PROJECT_PRESENTATION + + BACKGROUND + + ALIGNMENT + 6 + APPAREANCES + + DARK_AQUA + + LIGHT_AQUA + + ALIGNMENT + 6 + BACKGROUND_PATH + + PATH + resources/amazon.png + PATH_TYPE + 1 + + CUSTOM + + LAYOUT_DIRECTION + 0 + SCALING + 0 + + + BACKGROUND_PATH + + PATH + resources/amazon.png + PATH_TYPE + 1 + + CUSTOM + + LAYOUT_DIRECTION + 0 + SCALING + 0 + SHARED_SETTINGS_FOR_ALL_APPAREANCES + + + INSTALLATION TYPE + + HIERARCHIES + + INSTALLER + + LIST + + + CHILDREN + + DESCRIPTION + + OPTIONS + + HIDDEN + + STATE + 1 + + PACKAGE_UUID + 191C178B-0441-4E1C-9D79-D41E1E19B492 + TITLE + + TYPE + 0 + UUID + B9E3C666-C319-4762-B695-8B3F20953825 + + + REMOVED + + + + MODE + 0 + + INSTALLATION_STEPS + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewIntroductionController + INSTALLER_PLUGIN + Introduction + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewReadMeController + INSTALLER_PLUGIN + ReadMe + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewLicenseController + INSTALLER_PLUGIN + License + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewDestinationSelectController + INSTALLER_PLUGIN + TargetSelect + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewInstallationTypeController + INSTALLER_PLUGIN + PackageSelection + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewInstallationController + INSTALLER_PLUGIN + Install + LIST_TITLE_KEY + InstallerSectionTitle + + + ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS + ICPresentationViewSummaryController + INSTALLER_PLUGIN + Summary + LIST_TITLE_KEY + InstallerSectionTitle + + + INTRODUCTION + + LOCALIZATIONS + + + LANGUAGE + English + VALUE + + PATH + resources/introduction.html + PATH_TYPE + 1 + + + + + LICENSE + + LOCALIZATIONS + + MODE + 0 + + README + + LOCALIZATIONS + + + SUMMARY + + LOCALIZATIONS + + + TITLE + + LOCALIZATIONS + + + LANGUAGE + English + VALUE + Amazon Corretto @major@ + + + + + PROJECT_REQUIREMENTS + + LIST + + RESOURCES + + ROOT_VOLUME_ONLY + + + PROJECT_SETTINGS + + BUILD_FORMAT + 0 + BUILD_PATH + + PATH + build + PATH_TYPE + 1 + + EXCLUDED_FILES + + + PATTERNS_ARRAY + + + REGULAR_EXPRESSION + + STRING + .DS_Store + TYPE + 0 + + + PROTECTED + + PROXY_NAME + Remove .DS_Store files + PROXY_TOOLTIP + Remove ".DS_Store" files created by the Finder. + STATE + + + + PATTERNS_ARRAY + + + REGULAR_EXPRESSION + + STRING + .pbdevelopment + TYPE + 0 + + + PROTECTED + + PROXY_NAME + Remove .pbdevelopment files + PROXY_TOOLTIP + Remove ".pbdevelopment" files created by ProjectBuilder or Xcode. + STATE + + + + PATTERNS_ARRAY + + + REGULAR_EXPRESSION + + STRING + CVS + TYPE + 1 + + + REGULAR_EXPRESSION + + STRING + .cvsignore + TYPE + 0 + + + REGULAR_EXPRESSION + + STRING + .cvspass + TYPE + 0 + + + REGULAR_EXPRESSION + + STRING + .svn + TYPE + 1 + + + REGULAR_EXPRESSION + + STRING + .git + TYPE + 1 + + + REGULAR_EXPRESSION + + STRING + .gitignore + TYPE + 0 + + + PROTECTED + + PROXY_NAME + Remove SCM metadata + PROXY_TOOLTIP + Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems. + STATE + + + + PATTERNS_ARRAY + + + REGULAR_EXPRESSION + + STRING + classes.nib + TYPE + 0 + + + REGULAR_EXPRESSION + + STRING + designable.db + TYPE + 0 + + + REGULAR_EXPRESSION + + STRING + info.nib + TYPE + 0 + + + PROTECTED + + PROXY_NAME + Optimize nib files + PROXY_TOOLTIP + Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles. + STATE + + + + PATTERNS_ARRAY + + + REGULAR_EXPRESSION + + STRING + Resources Disabled + TYPE + 1 + + + PROTECTED + + PROXY_NAME + Remove Resources Disabled folders + PROXY_TOOLTIP + Remove "Resources Disabled" folders. + STATE + + + + SEPARATOR + + + + NAME + amazon-corretto-@full@-macosx-x64 + PAYLOAD_ONLY + + REFERENCE_FOLDER_PATH + build + TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING + + + + TYPE + 0 + VERSION + 2 + + diff --git a/installers/mac/pkg/templates/introduction.html.template b/installers/mac/pkg/templates/introduction.html.template new file mode 100644 index 00000000000..d568469f65b --- /dev/null +++ b/installers/mac/pkg/templates/introduction.html.template @@ -0,0 +1,86 @@ +introduction

+Amazon Corretto @major@ Installer

+

You will be guided through the steps necessary to install Amazon Corretto @full@.

+
\ No newline at end of file diff --git a/installers/mac/tar/build.gradle b/installers/mac/tar/build.gradle new file mode 100644 index 00000000000..fe488ca59a8 --- /dev/null +++ b/installers/mac/tar/build.gradle @@ -0,0 +1,165 @@ +/* +* Copyright (c) 2019, Amazon.com, Inc. or its affiliates. All Rights Reserved. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 only, as +* published by the Free Software Foundation. Amazon designates this +* particular file as subject to the "Classpath" exception as provided +* by Oracle in the LICENSE file that accompanied this code. +* +* This code is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* version 2 for more details (a copy is included in the LICENSE file that +* accompanied this code). +* +* You should have received a copy of the GNU General Public License version +* 2 along with this work; if not, write to the Free Software Foundation, +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +dependencies { + compile project(path: ':openjdksrc', configuration: 'archives') + compile project(path: ':prebuild', configuration: 'cacerts') +} + +// Two configurations for tgz & Jtreg native library respectively. +// Separate artifacts to simplify the artifacts fetching in :mac:pkg. +configurations { + buildTar + testLib +} +// consts +def imageDir= "$buildRoot/build/${project.jdkImageName}/images" +def jdkResultingImage = "${imageDir}/jdk-bundle" +def testResultingImage = "${imageDir}/test" +def correttoMacDir = "amazon-corretto-${project.version.major}.jdk" + + +// deps +def depsMap = [:] +project.configurations.compile.getFiles().each { depsMap[it.getName()] = it } + +/** + * Create a local copy of the source tree in our + * build root -- this is required since OpenJDK's + * build wants to occur inside the source tree, + * and we don't want to tamper with someone + * else's tree. + */ +task copySource(type: Exec) { + if (!file(buildRoot).exists()) { + file(buildRoot).mkdirs() + } + workingDir '/usr/bin' + commandLine 'rsync', '-am', + '--exclude=pre-build', + '--exclude=installers', + '--exclude=corretto-build', + "${project.rootDir}/", buildRoot +} + +task configureBuild(type: Exec) { + dependsOn project.configurations.compile + dependsOn copySource + workingDir "$buildRoot" + + // Platform specific flags + def command = ['bash', 'configure', + "--with-cacerts-file=${depsMap[caCerts]}" + ] + // Common flags + command += project.correttoCommonFlags + commandLine command.flatten() +} + +task executeBuild(type: Exec) { + dependsOn configureBuild + workingDir "$buildRoot" + commandLine 'make', 'images' +} + +task executeTestBuild(type: Exec) { + dependsOn executeBuild + workingDir "$buildRoot" + commandLine 'make','test-image-hotspot-jtreg-native','test-image-jdk-jtreg-native' +} + +task prepareArtifacts { + dependsOn executeBuild + doLast { + if(file("${jdkResultingImage}/${correttoMacDir}").exists()) { + delete "${jdkResultingImage}/${correttoMacDir}" + } + // Rename bundle + exec { + workingDir jdkResultingImage + commandLine 'bash', '-c', "\"\"mv jdk-${version.major}*.jdk ${correttoMacDir}\"\"" + } + // Replace Info.plist + copy { + from('templates/Info.plist.template') { + rename { file -> file.replace('.template', '') } + filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: project.version) + } + into "${jdkResultingImage}/${correttoMacDir}/Contents" + } + // Filter files + if(file("${buildDir}/${correttoMacDir}").exists()) { + delete "${buildDir}/${correttoMacDir}" + } + copy { + from("${jdkResultingImage}/${correttoMacDir}") { + include "Contents/Home/bin/**" + include "Contents/Home/conf/**" + include "Contents/Home/include/**" + include "Contents/Home/jmods/**" + include "Contents/Home/legal/**" + include "Contents/Home/lib/**" + include "Contents/Home/man/man1/**" + include "Contents/Home/release" + include "Contents/Info.plist" + include "Contents/MacOS/**" + } + into "${buildDir}/${correttoMacDir}" + } + // Set the directory as bundle + exec { + commandLine "SetFile", "-a", "B", "${buildDir}/${correttoMacDir}" + } + // Gradle does not preserve symlink, fix it before packaging + exec { + workingDir "${buildDir}/${correttoMacDir}/Contents" + commandLine "ln", "-sf", "../Home/lib/libjli.dylib", "MacOS/libjli.dylib" + } + } +} + +task packaging(type: Exec) { + dependsOn prepareArtifacts + String tarDir = "${distributionDir}/${project.correttoJdkArchiveName}.tar.gz" + workingDir buildDir + commandLine "tar", "czf", tarDir, correttoMacDir + outputs.file tarDir +} + +task packageTestResults(type: Tar) { + dependsOn executeTestBuild + description 'Package test results' + archiveName "${project.correttoTestImageArchiveName}.tar.gz" + compression Compression.GZIP + from(testResultingImage) { + include '**' + } + into project.correttoTestImageArchiveName + +} + +build.dependsOn packaging +build.dependsOn packageTestResults + +artifacts { + buildTar file: packaging.outputs.getFiles().getSingleFile(), builtBy: packaging + testLib packageTestResults +} diff --git a/installers/mac/tar/templates/Info.plist.template b/installers/mac/tar/templates/Info.plist.template new file mode 100644 index 00000000000..d74c7a8177a --- /dev/null +++ b/installers/mac/tar/templates/Info.plist.template @@ -0,0 +1,43 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + libjli.dylib + CFBundleGetInfoString + Amazon Corretto @full@-LTS + CFBundleIdentifier + com.amazon.corretto.@major@ + CFBundleInfoDictionaryVersion + 7.0 + CFBundleName + Amazon Corretto @major@ + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + @full@ + JavaVM + + JVMCapabilities + + CommandLine + + JVMMinimumFrameworkVersion + 13.2.9 + JVMMinimumSystemVersion + 10.6.0 + JVMPlatformVersion + @major@.@minor@ + JVMVendor + Amazon.com Inc. + JVMVersion + @major@.@minor@.@security@ + + + diff --git a/installers/windows/README.md b/installers/windows/README.md new file mode 100644 index 00000000000..f35fbe1cb51 --- /dev/null +++ b/installers/windows/README.md @@ -0,0 +1,31 @@ +## Instruction of Building Corretto11 on Windows + +Corretto11 on Windows includes one subproject. + +The `:zip` project builds and packages Corretto11 archive as zip file. Before executing +this project, you need to provide the following parameters: + +```$xslt +bootjdk_dir # Path of bootstrap JDK. To build Corretto11, JDK10 or JDK11 is required. + +ucrt_dll_dir # Path of ucrt library directory. + +jtreg_dir # Path of Jtreg. + +vcruntime_dir # Path of the latest vcruntime140.dll +``` + +To execute this, run: `./gradlew :installers:windows:zip:build` at `corretto-11` root directory. +The zip archive is located at `/installers/windows/zip/corretto-build/distributions` + +```$xslt +➜ ./gradlew :installers:windows:zip:build \ + -Pbootjdk_dir=... \ + -Pucrt_dll_dir=... \ + -Pjtreg_dir=... \ + -Pvcruntime_dir=... +➜ tree installers/windows/zip/corretto-build/distributions + installers/windows/zip/corretto-build/distributions + └── unsigned-jdk-image.zip +``` + diff --git a/installers/windows/zip/build.gradle b/installers/windows/zip/build.gradle new file mode 100644 index 00000000000..f39bde9abb3 --- /dev/null +++ b/installers/windows/zip/build.gradle @@ -0,0 +1,99 @@ +/* +* Copyright (c) 2019, Amazon.com, Inc. or its affiliates. All Rights Reserved. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* This code is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License version 2 only, as +* published by the Free Software Foundation. Amazon designates this +* particular file as subject to the "Classpath" exception as provided +* by Oracle in the LICENSE file that accompanied this code. +* +* This code is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +* version 2 for more details (a copy is included in the LICENSE file that +* accompanied this code). +* +* You should have received a copy of the GNU General Public License version +* 2 along with this work; if not, write to the Free Software Foundation, +* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +dependencies { + compile project(path: ':openjdksrc', configuration: 'archives') + compile project(path: ':prebuild', configuration: 'cacerts') +} + +// deps +def depsMap = [:] +project.configurations.compile.getFiles().each { depsMap[it.getName()] = it } + +task copySource(type: Copy) { + dependsOn project.configurations.compile + from tarTree(depsMap[sourceTar]) + into buildRoot +} + + +task configureBuild(type: Exec) { + dependsOn copySource + workingDir buildRoot + + // Platform specific flags + def command = ['bash', 'configure', + "--with-cacerts-file=${depsMap[caCerts]}", + "--with-boot-jdk=${project.getProperty('bootjdk_dir')}", + "--with-ucrt-dll-dir=${project.getProperty('ucrt_dll_dir')}", + "--with-jtreg=${project.getProperty('jtreg_dir')}", + "--with-msvcr-dll=${project.getProperty('vcruntime_dir')}/vcruntime140.dll", + "--with-zlib=bundled" + ] + // Common flags + command += project.correttoCommonFlags + commandLine command.flatten() +} + +task executeBuild(type: Exec) { + dependsOn configureBuild + workingDir buildRoot + + commandLine 'make', 'clean', 'images', 'test-image-hotspot-jtreg-native', 'test-image-jdk-jtreg-native' +} + +task copyImage(type: Copy) { + dependsOn executeBuild + + from "${executeBuild.workingDir}/build/${project.jdkImageName}/images" + into "$buildRoot/build" +} + +task packageTestImage(type: Zip) { + dependsOn copyImage + archiveName "${project.correttoTestImageArchiveName}.zip" + from("${copyImage.destinationDir}/test") { + include '**' + } + into project.correttoTestImageArchiveName +} + +task packageBuildResults(type: Zip) { + dependsOn packageTestImage + archiveName = "unsigned-jdk-image.zip" + + from("${copyImage.destinationDir}/jdk") { + exclude 'demo' + } + from(buildRoot) { + include 'ASSEMBLY_EXCEPTION' + include 'LICENSE' + include 'version.txt' + include 'ADDITIONAL_LICENSE_INFO' + include 'README' + } +} + +build.dependsOn packageBuildResults + +artifacts { + archives packageBuildResults +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000000..cfece367c02 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,22 @@ +rootProject.name = 'corretto-jdk' + +import org.apache.tools.ant.taskdefs.condition.Os + +def subProjects = [':openjdksrc', ':prebuild'] + +if (Os.isFamily(Os.FAMILY_MAC)) { + subProjects += [':installers:mac:pkg', + ':installers:mac:tar'] +} else if (Os.isFamily(Os.FAMILY_UNIX)) { + subProjects += [':installers:linux:universal:tar', + ':installers:linux:universal:rpm', + ':installers:linux:universal:deb', + ':installers:linux:alpine:tar'] +} else if (Os.isFamily(Os.FAMILY_WINDOWS)) { + subProjects += [':installers:windows:zip'] +} + +include subProjects as String[] + +project(':openjdksrc').projectDir = file('source') +project(':prebuild').projectDir = file('pre-build') diff --git a/version.txt b/version.txt new file mode 100644 index 00000000000..22fe89380e4 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +16.0.0.36.1