File PKGBUILD of Package java25-openjdk

# Maintainer: Yukari Chiba <[email protected]>

pkgbase=java25-openjdk
pkgname=('jre25-openjdk' 'jdk25-openjdk' 'openjdk25-src' 'openjdk25-doc')
# on a majorver change, don't forget to update the misc files that come along this PKGBUILD
_majorver=25
_minorver=0
_securityver=4
_updatever=4
pkgver=$_majorver.$_minorver.$_securityver.u$_updatever
pkgrel=1
_git_tag=jdk-$_majorver.$_minorver.$_securityver+$_updatever
arch=(x86_64 aarch64 riscv64 loongarch64)
url='https://openjdk.java.net/'
license=('LicenseRef-Java')
makedepends=('java-environment>=24' 'java-environment<26' 'zip' 'libelf' 'libcups' 'alsa-lib'
             'graphviz' 'freetype2' 'libjpeg' 'giflib' 'libpng' 'lcms2'
             'bash' 'harfbuzz' 'linux-headers')
optdepends=(
  'gvfs: open links e.g. hyperlinks'
)             
source=(
  https://github.com/openjdk/jdk${_majorver}u/archive/$_git_tag.tar.gz
  use-mold.patch
  no-gen-icon.patch
  install_openjdk.sh
)
sha256sums=('02f5ded3059e3775965ec64a7592102e5ea29e95245cd75411176a4cee9c523c'
            '782d242981e9ae1e9b958ab3730538c4c14187b17cb8385157b0fe3381d2799d'
            'a83ec9e57d49008944fbfb800736f871120893726cc801269d8b93b951650933'
            '474c34747eb84f17be246580fe6c404b6878263647be54541ec16670b4de9b5d')

_jvmdir=/usr/lib/jvm/java-$_majorver-openjdk
_jdkdir=jdk${_majorver}u-${_git_tag//+/-}
_imgdir=$_jdkdir/build/linux-$CARCH-server-release/images

_commondeps=('ca-certificates-utils' 'nss' 'libjpeg'
           'lcms2' 'freetype2' 'harfbuzz' 'java-runtime-common')

prepare() {
  sed -i "s/%THIS_NAME%/java-${_majorver}-openjdk/" install_openjdk.sh

  _patch_ $_jdkdir
}

build() {
  cd $_jdkdir

  NUM_PROC_OPT=''
  MAKEFLAG_J=$(echo $MAKEFLAGS | sed -En 's/.*-j([0-9]+).*/\1/p')
  if [ -n "$MAKEFLAG_J" ]; then
    # http://hg.openjdk.java.net/jdk10/jdk10/file/85e6cb013b98/make/InitSupport.gmk#l105
    echo "Removing '-j$MAKEFLAG_J' from MAKEFLAGS to prevent build fail. Passing it directly to ./configure."
    export MAKEFLAGS=${MAKEFLAGS/-j$MAKEFLAG_J/}
    NUM_PROC_OPT="--with-num-cores=$MAKEFLAG_J"
  fi

  # Avoid optimization of HotSpot to be lowered from O3 to O2
  local _CFLAGS="${CFLAGS//-O2/-O3} $CPPFLAGS -fcommon"
  local _CXXFLAGS="${CXXFLAGS//-O2/-O3} $CPPFLAGS -fcommon"
  local _LDFLAGS=$LDFLAGS

  # TODO: Should be rechecked for the next releases
  # compiling with -fexceptions leads to:
  # /usr/bin/ld: /build/java-openjdk/src/jdk17u-jdk-17.0.3-2/build/linux-x86_64-server-release/hotspot/variant-server/libjvm/objs/zPhysicalMemory.o: in function `ZList<ZMemory>::~ZList()':
  # /build/java-openjdk/src/jdk17u-jdk-17.0.3-2/src/hotspot/share/gc/z/zList.hpp:54: undefined reference to `ZListNode<ZMemory>::~ZListNode()'
  # collect2: error: ld returned 1 exit status
  _CFLAGS=${CFLAGS/-fexceptions/}
  _CXXFLAGS=${CXXFLAGS/-fexceptions/}

  # CFLAGS, CXXFLAGS and LDFLAGS are ignored as shown by a warning
  # in the output of ./configure unless used like such:
  #  --with-extra-cflags="$CFLAGS"
  #  --with-extra-cxxflags="$CXXFLAGS"
  #  --with-extra-ldflags="$LDFLAGS"
  # See also paragraph "Configure Control Variables from "jdk${_majorver}-${_git_tag}/common/doc/building.md
  unset CFLAGS
  unset CXXFLAGS
  unset LDFLAGS

  if check_option "lto" "y"; then
    jvm_features="zgc,shenandoahgc,link-time-opt"
  else
    jvm_features="zgc,shenandoahgc"
  fi

  [ "$CARCH" == "loongarch64" ] && jvm_features="" # unsupported

  export HEADLESS=1

  bash configure \
    --with-toolchain-type=clang \
    --with-version-build="$_updatever" \
    --with-version-pre="" \
    --with-version-opt="" \
    --with-stdc++lib=dynamic \
    --with-extra-cflags="$_CFLAGS" \
    --with-extra-cxxflags="$_CXXFLAGS" \
    --with-extra-ldflags="$_LDFLAGS" \
    --with-libjpeg=system \
    --with-giflib=system \
    --with-libpng=system \
    --with-lcms=system \
    --with-zlib=system \
    --with-harfbuzz=system \
    --with-jvm-features="$jvm_features" \
    --with-native-debug-symbols=internal \
    --enable-unlimited-crypto \
    --disable-warnings-as-errors \
    --with-vendor-name="eweOS" \
    --enable-headless-only \
    $NUM_PROC_OPT
    #--disable-javac-server

  make images legacy-jre-image docs

  # https://bugs.openjdk.java.net/browse/JDK-8173610
  find "$srcdir/$_imgdir" -iname '*.so' -exec chmod +x {} \;
}

check() {
  cd $_jdkdir
  # TODO package jtreg
  # make -k check
}

_backup_files=(
  etc/$pkgbase/logging.properties
  etc/$pkgbase/management/jmxremote.access
  etc/$pkgbase/management/jmxremote.password.template
  etc/$pkgbase/management/management.properties
  etc/$pkgbase/net.properties
  etc/$pkgbase/security/java.policy
  etc/$pkgbase/security/java.security
  etc/$pkgbase/security/policy/README.txt
  etc/$pkgbase/security/policy/limited/default_US_export.policy
  etc/$pkgbase/security/policy/limited/default_local.policy
  etc/$pkgbase/security/policy/limited/exempt_local.policy
  etc/$pkgbase/security/policy/unlimited/default_US_export.policy
  etc/$pkgbase/security/policy/unlimited/default_local.policy
  etc/$pkgbase/sound.properties
)

_jre_provides=(
  "java-runtime=$_majorver"
  "java-runtime-openjdk=$_majorver"
  "jre$_majorver-openjdk=$pkgver-$pkgrel"
)

_jdk_provides=(
  "${_jre_provides[@]}"
  "java-environment=$_majorver"
  "java-environment-openjdk=$_majorver"
  "jdk$_majorver-openjdk=$pkgver-$pkgrel"
)

_install_common() {
  # Conf
  install -dm 755 "$pkgdir/etc"
  cp -r conf "$pkgdir/etc/$pkgbase"
  ln -s /etc/$pkgbase "$pkgdir/$_jvmdir/conf"

  # Legal
  install -dm 755 "$pkgdir/usr/share/licenses"
  cp -r legal "$pkgdir/usr/share/licenses/$pkgbase"
  ln -s $pkgbase "$pkgdir/usr/share/licenses/$pkgname"
  ln -s /usr/share/licenses/$pkgbase "$pkgdir/$_jvmdir/legal"

  # Man pages
  for f in bin/*; do
    f=$(basename "$f")
    _man=../jdk/man/man1/"$f.1"
    test -f "$_man" && install -Dm 644 "$_man" "$pkgdir/usr/share/man/man1/$f-openjdk$_majorver.1"
  done
  ln -s /usr/share/man "$pkgdir/$_jvmdir/man"

  # Link JKS keystore from ca-certificates-utils
  rm -f "$pkgdir$_jvmdir/lib/security/cacerts"
  ln -sf /etc/ssl/certs/java/cacerts "$pkgdir$_jvmdir/lib/security/cacerts"
}

package_jre25-openjdk() {
  pkgdesc="OpenJDK Java $_majorver runtime environment"
  depends=("${_commondeps[@]}")
  provides=("${_jre_provides[@]}")
  conflicts=("jdk25-openjdk")
  backup=("${_backup_files[@]}")
  install=install_openjdk.sh

  cd $_imgdir/jre

  install -dm 755 "$pkgdir$_jvmdir"

  cp -a bin lib \
    "$pkgdir$_jvmdir"

  _install_common
}

package_jdk25-openjdk() {
  pkgdesc="OpenJDK Java $_majorver development kit"
  depends=("${_commondeps[@]}" 'java-environment-common'
           'hicolor-icon-theme' 'libelf' 'giflib' 'libpng'
           'ca-certificates-utils' 'nss' 'libjpeg'
           'lcms2' 'freetype2' 'harfbuzz')
  optdepends=('alsa-lib: for basic sound support'
              'gtk3: for the Gtk+ 3 look and feel - desktop usage')

  provides=("${_jdk_provides[@]}")
  conflicts=("jre25-openjdk")
  backup=("${_backup_files[@]}")
  install=install_openjdk.sh

  cd $_imgdir/jdk

  install -dm 755 "$pkgdir$_jvmdir"

  cp -a bin demo include jmods lib release\
    "$pkgdir$_jvmdir"

  rm "$pkgdir$_jvmdir/lib/src.zip"
  
  _install_common
}

package_openjdk25-src() {
  pkgdesc="OpenJDK Java $_majorver sources"
  # Depends on JDK to get license files
  depends=("jdk$_majorver-openjdk=$pkgver-$pkgrel")
  provides=("openjdk$_majorver-src=$pkgver-$pkgrel")

  install -Dm 644 -t "$pkgdir$_jvmdir/lib" $_imgdir/jdk/lib/src.zip

  install -dm 755 "$pkgdir/usr/share/licenses"
  ln -s $pkgbase "$pkgdir/usr/share/licenses/$pkgname"
}

package_openjdk25-doc() {
  pkgdesc="OpenJDK Java $_majorver documentation"
  # Depends on JDK to get license files
  depends=("jdk$_majorver-openjdk=$pkgver-$pkgrel")
  provides=("openjdk$_majorver-doc=$pkgver-$pkgrel")

  install -dm 755 "$pkgdir/usr/share/doc"
  cp -r $_imgdir/docs "$pkgdir/usr/share/doc/$pkgbase"

  install -dm 755 "$pkgdir/usr/share/licenses"
  ln -s $pkgbase "$pkgdir/usr/share/licenses/$pkgname"
}