#!/bin/bash
# Slackware build script to repackage JDK binaries
# Copyright 2026 Geoff Lewis, Victoria, AU
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program 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 for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
if [ $(id -u) -ne 0 ]; then
echo "Must be root in order to run this SlackBuild."
exit 1
fi
cd $(dirname $0) ; CWD=$(pwd)
BUILD=${BUILD:-1}
# Ensure TMP isn't a relative path.
TMP=${TMP:-/tmp}
TMP=$(realpath $TMP)
PKG=$TMP/package-java
rm -rf $PKG
mkdir -p $TMP $PKG
# If a Java archive was given as an argument to this script, use it.
# Otherwise, we'll use an archive found in the current directory if
# there is exactly one such archive.
if [ ! -z "$1" ]; then
if [ -r "$(readlink -f $1)" ]; then
SOURCETGZ="$(readlink -f $1)"
else
echo "JDK distribution $1 was not found."
exit 1
fi
else
for file in $CWD/*jdk-*.tar.gz ; do
if [ -n "$SOURCETGZ" ]; then
ERR="Multiple JDK distributions found!"
break
elif [ -r $file ]; then
SOURCETGZ=$file
fi
done
if [ -z "$SOURCETGZ" ]; then
ERR="No JDK distribution found!"
fi
if [ -n "$ERR" ]; then
echo "$ERR"
echo
echo "Please make sure there is exactly one JDK archive in this"
echo "directory and then run this script again, or else specify a Java"
echo "archive on the command line like this:"
echo
echo " ./java.SlackBuild /path/to/jdk-25_linux-x64_bin.tar.gz"
echo
exit 1
fi
fi
# Oracle -> jdk
# OpenJDK -> openjdk
PKGNAM=$(basename $SOURCETGZ | cut -f 1 -d -)
if [ "$PKGNAM" = "jdk" ]; then
# Oracle JDK
# Get the actual version from the directory name of the first file
# in the tar ball.
VERSION=$(tar tf $SOURCETGZ | head -1 | cut -f 1 -d / | cut -f 2 -d -)
JAVA_ARCH=$(basename $SOURCETGZ | cut -f 3 -d - | cut -f 1 -d _)
elif [ "$PKGNAM" = "openjdk" ]; then
# OpenJDK
# Get the version from the filename.
# openjdk-_linux-_bin.tar.gz
VERSION=$(basename $SOURCETGZ | cut -f 2 -d - | cut -f 1 -d _)
JAVA_ARCH=$(basename $SOURCETGZ | cut -f 3 -d - | cut -f 1 -d _)
else
echo "Unexpected package name: $PKGNAM"
echo "Package name must be 'jdk' or 'openjdk'"
exit 1
fi
if [ "$JAVA_ARCH" = "x64" ]; then
ARCH=x86_64
LIBDIRSUFFIX="64"
elif [ "$JAVA_ARCH" = "aarch64" ]; then
ARCH=aarch64
LIBDIRSUFFIX="64"
else
echo "Oracle & OpenJDK only provide x64 and aarch64 Linux archives"
exit 1
fi
set -e
cd $PKG
mkdir -p usr/lib${LIBDIRSUFFIX}
cd usr/lib${LIBDIRSUFFIX}
tar xvf $SOURCETGZ || exit 1
# All variants unpack to the directory named "jdk-".
# Replace possible version underscore with plus.
JDKDIR=jdk-${VERSION/_/+}
# Sanity check before continuing.
if [ ! -d "$JDKDIR" ]; then
echo "Expected ${SOURCETGZ##*/} to unpack to $JDKDIR"
exit 1
fi
# Create /usr/lib64/java symlink to $JDKDIR for use as JAVA_HOME.
ln -s $JDKDIR java
## In $PKG/usr/lib64
chown -R root:root $JDKDIR
find -L $JDKDIR \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
-o -perm 511 \) -exec chmod 755 {} \; -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
## In $PKG/usr/lib64
find $JDKDIR -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
## In $PKG/usr/lib64
find $JDKDIR/man -type f -exec gzip -9q {} \; 2> /dev/null || true
## In $PKG/usr/lib64
ln -sf $JDKDIR/lib/libjawt.so
ln -sf $JDKDIR/lib/server/libjvm.so
ln -sf $JDKDIR/lib/libjava.so
ln -sf $JDKDIR/lib/libawt.so
ln -sf $JDKDIR/lib/libawt_xawt.so
ln -sf $JDKDIR/lib/libverify.so
cd $PKG
## In $PKG
# /usr/lib64/java/man is a default path in /etc/man_db.conf so we shouldn't
# need to set MANPATH.
mkdir -p etc/profile.d
cat > etc/profile.d/$PKGNAM.sh << EOF
#!/bin/sh
export JAVA_HOME=/usr/lib${LIBDIRSUFFIX}/java
export PATH=\${PATH}:\${JAVA_HOME}/bin
EOF
cat > etc/profile.d/$PKGNAM.csh << EOF
#!/bin/csh
setenv JAVA_HOME /usr/lib${LIBDIRSUFFIX}/java
setenv PATH \${PATH}:\${JAVA_HOME}/bin
EOF
chmod 755 etc/profile.d/*
## In $PKG
mkdir install
cat $CWD/slack-desc.$PKGNAM > install/slack-desc
## In $PKG
# If openjdk, docs go in /usr/doc/openjdk-VERSION
DOCDIR=${JDKDIR/jdk/$PKGNAM}
mkdir -p usr/doc/$DOCDIR
cd usr/doc/$DOCDIR
ln -s ../../lib${LIBDIRSUFFIX}/$JDKDIR/release
ln -s ../../lib${LIBDIRSUFFIX}/$JDKDIR/legal
# Only Oracle JDK has README
if [ "$PKGNAM" = "jdk" ]; then
ln -s ../../lib${LIBDIRSUFFIX}/$JDKDIR/README
fi
cat $CWD/$(basename $0) > java.SlackBuild
cp ../../../install/slack-desc .
cd $PKG
rm -f $TMP/$PKGNAM-$VERSION-$ARCH-$BUILD.txz
/sbin/makepkg -l y -c n $TMP/$PKGNAM-$VERSION-$ARCH-$BUILD.txz