#!/bin/bash # Generates the 'source tarball' for JDK 8 projects. # # Example 1: # When used from local repo set REPO_ROOT pointing to file:// with your repo. # If your local repo follows upstream forests conventions, it may be enough to # set OPENJDK_URL. # # Example 2: # This will read the OpenJDK feature version from the spec file, then create a # tarball from the most recent tag for that version in the upstream Git # repository. # # $ OPENJDK_LATEST=1 ./generate_source_tarball.sh # [...] # Tarball is: temp-generated-source-tarball-ujD/openjdk-17.0.10+6-ea.tar.xz # # Unless you use OPENJDK_LATEST, you have to set PROJECT_NAME, REPO_NAME and # VERSION, e.g.: # # PROJECT_NAME=openjdk # REPO_NAME=shenandoah-jdk8u # VERSION=HEAD # # They are used to create correct name and are used in construction of sources # URL (unless REPO_ROOT is set). # # This script creates a single source tarball out of the repository based on the # given tag and removes code not allowed in Fedora/RHEL. SCRIPT_DIR=$(dirname "$0") JCONSOLE_PATCH_DEFAULT=${SCRIPT_DIR}/jconsole-plugin.patch if [ "x${JCONSOLE_PATCH}" != "x" ] ; then if [ ! -f "${JCONSOLE_PATCH}" ] ; then echo "You have specified the jconsole.js patch as ${JCONSOLE_PATCH} but it does not exist. Exiting."; exit 2; fi else JCONSOLE_PATCH=${JCONSOLE_PATCH_DEFAULT} fi set -e OPENJDK_URL_DEFAULT=https://github.com COMPRESSION_DEFAULT=xz if [ "$1" = "help" ] ; then echo "Behaviour may be specified by setting the following variables:" echo echo "VERSION - the version of the specified OpenJDK project" echo " (required unless OPENJDK_LATEST is set)" echo "PROJECT_NAME - the name of the OpenJDK project being archived" echo " (needed to compute REPO_ROOT and/or" echo " FILE_NAME_ROOT automatically;" echo " optional if they are set explicitly)" echo "REPO_NAME - the name of the OpenJDK repository" echo " (needed to compute REPO_ROOT automatically;" echo " optional if REPO_ROOT is set explicitly)" echo "OPENJDK_URL - the URL to retrieve code from" echo " (defaults to ${OPENJDK_URL_DEFAULT})" echo "COMPRESSION - the compression type to use" echo " (defaults to ${COMPRESSION_DEFAULT})" echo "FILE_NAME_ROOT - name of the archive, minus extensions" echo " (defaults to PROJECT_NAME-VERSION)" echo "REPO_ROOT - the location of the Git repository to archive" echo " (defaults to OPENJDK_URL/PROJECT_NAME/REPO_NAME.git)" echo "JCONSOLE_PATCH - the path to a patch to fix non-availiability of" echo " jconsole.js (optional; defaults to ${JCONSOLE_PATCH_DEFAULT})" echo "BOOT_JDK - the bootstrap JDK to satisfy the configure run" echo " (defaults to packaged JDK version)" echo "WITH_TEMP - run in a temporary directory" echo " (defaults to disabled)" echo "OPENJDK_LATEST - deduce VERSION from most recent upstream tag" echo " (implies WITH_TEMP, computes everything else" echo " automatically; Note: accesses network to read" echo " tag list from remote Git repository)" exit 1; fi if [ "$OPENJDK_LATEST" != "" ] ; then FEATURE_VERSION=$(echo '%majorver' \ | rpmspec --shell ./*.spec 2>/dev/null \ | grep --after-context 1 majorver \ | tail --lines 1) PROJECT_NAME=openjdk REPO_NAME=shenandoah-jdk"${FEATURE_VERSION}"u # FIXME: Temporarily use private fork until main repository is in sync # Skip -ga tags since those are the same as the most recent non-ga tag, and # the non-ga tag is the one that is used to generated the official source # tarball. For example: # ca760c86642aa2e0d9b571aaabac054c0239fbdc refs/tags/jdk-17.0.10-ga^{} # 25a2e6c20c9a96853714284cabc6b456eb095070 refs/tags/jdk-17.0.10-ga # ca760c86642aa2e0d9b571aaabac054c0239fbdc refs/tags/jdk-17.0.10+7^{} # e49c5749b10f3e90274b72e9279f794fdd191d27 refs/tags/jdk-17.0.10+7 VERSION=$(git ls-remote --tags --refs --sort=-version:refname \ "${OPENJDK_URL_DEFAULT}/gnu-andrew/${REPO_NAME}.git" \ "shenandoah${FEATURE_VERSION}u*" \ | grep -v '\-ga$' \ | head --lines 1 | cut --characters 52-) FILE_NAME_ROOT=${VERSION} WITH_TEMP=1 fi if [ "$WITH_TEMP" != "" ] ; then pushd "$(mktemp --directory temp-generated-source-tarball-XXX)" fi if [ "$VERSION" = "" ] ; then echo "No VERSION specified" exit 2 fi echo "Version: ${VERSION}" NUM_VER=${VERSION##shenandoah} RELEASE_VER=${NUM_VER%%-b*} BUILD_VER=${NUM_VER##*-} MAJOR_VER=${RELEASE_VER%%u*} echo "Major version is ${MAJOR_VER}, release ${RELEASE_VER}, build ${BUILD_VER}" if [ "$BOOT_JDK" = "" ] ; then echo "No boot JDK specified". BOOT_JDK=/usr/lib/jvm/java-1.${MAJOR_VER}.0-openjdk; echo -n "Checking for ${BOOT_JDK}..."; if [ -d "${BOOT_JDK}" ] && [ -x "${BOOT_JDK}"/bin/java ] ; then echo "Boot JDK found at ${BOOT_JDK}"; else echo "Not found"; PREV_VER=$((MAJOR_VER - 1)); BOOT_JDK=/usr/lib/jvm/java-1.${PREV_VER}.0-openjdk; echo -n "Checking for ${BOOT_JDK}..."; if [ -d ${BOOT_JDK} ] && [ -x ${BOOT_JDK}/bin/java ] ; then echo "Boot JDK found at ${BOOT_JDK}"; else echo "Not found"; exit 4; fi fi else echo "Boot JDK: ${BOOT_JDK}"; fi if [ "$OPENJDK_URL" = "" ] ; then OPENJDK_URL=${OPENJDK_URL_DEFAULT} echo "No OpenJDK URL specified; defaulting to ${OPENJDK_URL}" else echo "OpenJDK URL: ${OPENJDK_URL}" fi if [ "$COMPRESSION" = "" ] ; then # rhel 5 needs tar.gz COMPRESSION=${COMPRESSION_DEFAULT} fi echo "Creating a tar.${COMPRESSION} archive" if [ "$FILE_NAME_ROOT" = "" ] ; then if [ "$PROJECT_NAME" = "" ] ; then echo "No PROJECT_NAME specified, needed by FILE_NAME_ROOT" exit 1 fi FILE_NAME_ROOT=${PROJECT_NAME}-${VERSION} echo "No file name root specified; default to ${FILE_NAME_ROOT}" fi if [ "$REPO_ROOT" = "" ] ; then if [ "$PROJECT_NAME" = "" ] ; then echo "No PROJECT_NAME specified, needed by REPO_ROOT" exit 1 fi if [ "$REPO_NAME" = "" ] ; then echo "No REPO_NAME specified, needed by REPO_ROOT" exit 3 fi REPO_ROOT="${OPENJDK_URL}/${PROJECT_NAME}/${REPO_NAME}.git" echo "No repository root specified; default to ${REPO_ROOT}" fi; echo -e "Settings:" echo -e "\tVERSION: ${VERSION}" echo -e "\tPROJECT_NAME: ${PROJECT_NAME}" echo -e "\tREPO_NAME: ${REPO_NAME}" echo -e "\tOPENJDK_URL: ${OPENJDK_URL}" echo -e "\tCOMPRESSION: ${COMPRESSION}" echo -e "\tFILE_NAME_ROOT: ${FILE_NAME_ROOT}" echo -e "\tREPO_ROOT: ${REPO_ROOT}" echo -e "\tJCONSOLE_PATCH: ${JCONSOLE_PATCH}" echo -e "\tBOOT_JDK: ${BOOT_JDK}" mkdir "${FILE_NAME_ROOT}" pushd "${FILE_NAME_ROOT}" echo "Cloning ${VERSION} root repository from ${REPO_ROOT}" git clone --depth=1 -b "${VERSION}" "${REPO_ROOT}" "${VERSION}" pushd "${VERSION}" TAR_TIME="$(git log --max-count 1 --format=%cI)" # UnderlineTaglet.java has a BSD license with a field-of-use restriction, making it non-Free if [ -d langtools ] ; then echo "Removing langtools test case with non-Free license" rm -vf langtools/test/tools/javadoc/api/basic/TagletPathTest.java rm -vf langtools/test/tools/javadoc/api/basic/taglets/UnderlineTaglet.java fi if [ -d jdk ]; then # jconsole.js has a BSD license with a field-of-use restriction, making it non-Free echo "Removing jconsole-plugin file with non-Free license" rm -vf jdk/src/share/demo/scripting/jconsole-plugin/src/resources/jconsole.js fi echo "Patching out use of jconsole.js" git apply --stat --apply -v -p1 "${JCONSOLE_PATCH}" find . -name '*.orig' -exec rm -vf '{}' ';' popd # Generate .src-rev so build has knowledge of the revision the tarball was # created from mkdir build pushd build sh "${PWD}"/../"${VERSION}"/configure --with-boot-jdk="${BOOT_JDK}" make store-source-revision popd rm -rf build # Remove commit checks echo "Removing $(find "${VERSION}" -name '.jcheck' -print)" find "${VERSION}" -name '.jcheck' -print0 | xargs -0 rm -r # Remove history and GHA echo "find ${VERSION} -name '.hgtags'" find "${VERSION}" -name '.hgtags' -exec rm -v '{}' '+' echo "find ${VERSION} -name '.hgignore'" find "${VERSION}" -name '.hgignore' -exec rm -v '{}' '+' echo "find ${VERSION} -name '.gitattributes'" find "${VERSION}" -name '.gitattributes' -exec rm -v '{}' '+' echo "find ${VERSION} -name '.gitignore'" find "${VERSION}" -name '.gitignore' -exec rm -v '{}' '+' # Work around some Git objects not having write permissions. echo "chmod --recursive u+w ${VERSION}/.git" chmod --recursive u+w "${VERSION}"/.git echo "find ${VERSION} -name '.git'" find "${VERSION}" -name '.git' -exec rm -rv '{}' '+' echo "find ${VERSION} -name '.github'" find "${VERSION}" -name '.github' -exec rm -rv '{}' '+' echo "Compressing remaining forest" if [ "$COMPRESSION" = "xz" ] ; then SWITCH=cJf else SWITCH=czf fi TARBALL_NAME=${FILE_NAME_ROOT}.tar.${COMPRESSION} XZ_OPT=${XZ_OPT-"-T0"} \ tar --mtime="${TAR_TIME}" --owner=root --group=root --sort=name \ --exclude-vcs -$SWITCH "${TARBALL_NAME}" "${VERSION}" mv "${TARBALL_NAME}" .. popd if [ "$WITH_TEMP" != "" ] ; then echo "Tarball is: $(realpath --relative-to=.. .)/${TARBALL_NAME}" popd else echo -n "Done. You may want to remove the uncompressed version" echo " - $FILE_NAME_ROOT" fi # Local Variables: # fill-column: 80 # compile-command: "shellcheck generate_source_tarball.sh" # End: