openjdk: init 19.0.1

as usual this is mostly copy-pasted from 18, so this commit is best
reviewed with '--find-copies-harder'

stop exposing openjdk 18 since it was not a long-term support release

change the default openjdk from 17 to 19 since nixpkgs is a
rolling-release repository

drop the ceremony around bootstrapping via adoptopenjdk for 64-bit
builds vs. via earlier openjdk builds for 32-bit, because, to be
frank, since we're using temurin now, it's not a simple copy-paste
job.  :-/  if someone needs a 32-bit openjdk, that work can be done
separately.

JavaFX revs from 17 to 19; it looks like 18 was never packaged along
with JDK 18.

* the gradle invocation used to build JavaFX must still be done with
  Java 18, as gradle does not yet support running itself on Java 19.

* a couple of patches need to be applied, since a new State enum was
  introduced in the JDK that collides with one in JavaFX.

* the hash of the gradle dependencies has not changed, which is
  surprising, but as far as I can tell correct.

One application (libreoffice) doesn't work with 19 yet, so pin it to
jdk 17 for now.

Co-authored-by: Mario Rodas <marsam@users.noreply.github.com>
This commit is contained in:
Matt McHenry 2022-10-28 14:49:31 -04:00
parent 0e33de85ae
commit e7cfa26a86
6 changed files with 397 additions and 13 deletions

View file

@ -32,12 +32,12 @@
, which
, icu
, boost
, jdk
, jdk17
, ant
, cups
, xorg
, fontforge
, jre_minimal
, jre17_minimal
, openssl
, gperf
, cppunit
@ -121,7 +121,7 @@ let
getDev getLib
optional optionals optionalString;
jre' = jre_minimal.override {
jre' = jre17_minimal.override {
modules = [ "java.base" "java.desktop" "java.logging" "java.sql" ];
};
@ -460,7 +460,7 @@ in
bison
fontforge
gdb
jdk
jdk17
libtool
pkg-config
]

View file

@ -0,0 +1,169 @@
{ stdenv, lib, fetchurl, fetchFromGitHub, bash, pkg-config, autoconf, cpio
, file, which, unzip, zip, perl, cups, freetype, alsa-lib, libjpeg, giflib
, libpng, zlib, lcms2, libX11, libICE, libXrender, libXext, libXt, libXtst
, libXi, libXinerama, libXcursor, libXrandr, fontconfig, openjdk19-bootstrap
, ensureNewerSourcesForZipFilesHook
, setJavaClassPath
, headless ? false
, enableJavaFX ? openjfx.meta.available, openjfx
, enableGnome2 ? true, gtk3, gnome_vfs, glib, GConf
}:
let
version = {
feature = "19";
interim = ".0.1";
build = "10";
};
openjdk = stdenv.mkDerivation {
pname = "openjdk" + lib.optionalString headless "-headless";
version = "${version.feature}${version.interim}+${version.build}";
src = fetchFromGitHub {
owner = "openjdk";
repo = "jdk${version.feature}u";
rev = "jdk-${version.feature}${version.interim}+${version.build}";
hash = "sha256-IS6ABnVdW1qJ4gu4YSgMVFXBTNdtWFdbNNz+kMaiyk8=";
};
nativeBuildInputs = [ pkg-config autoconf unzip ensureNewerSourcesForZipFilesHook ];
buildInputs = [
cpio file which zip perl zlib cups freetype alsa-lib libjpeg giflib
libpng zlib lcms2 libX11 libICE libXrender libXext libXtst libXt libXtst
libXi libXinerama libXcursor libXrandr fontconfig openjdk19-bootstrap
] ++ lib.optionals (!headless && enableGnome2) [
gtk3 gnome_vfs GConf glib
];
patches = [
./fix-java-home-jdk10.patch
./read-truststore-from-env-jdk10.patch
./currency-date-range-jdk10.patch
./increase-javadoc-heap-jdk13.patch
./ignore-LegalNoticeFilePlugin-jdk18.patch
# -Wformat etc. are stricter in newer gccs, per
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79677
# so grab the work-around from
# https://src.fedoraproject.org/rpms/java-openjdk/pull-request/24
(fetchurl {
url = "https://src.fedoraproject.org/rpms/java-openjdk/raw/06c001c7d87f2e9fe4fedeef2d993bcd5d7afa2a/f/rh1673833-remove_removal_of_wformat_during_test_compilation.patch";
sha256 = "082lmc30x64x583vqq00c8y0wqih3y4r0mp1c4bqq36l22qv6b6r";
})
] ++ lib.optionals (!headless && enableGnome2) [
./swing-use-gtk-jdk13.patch
];
postPatch = ''
chmod +x configure
patchShebangs --build configure
'';
configureFlags = [
"--with-boot-jdk=${openjdk19-bootstrap.home}"
"--with-version-build=${version.build}"
"--with-version-opt=nixos"
"--with-version-pre="
"--enable-unlimited-crypto"
"--with-native-debug-symbols=internal"
"--with-libjpeg=system"
"--with-giflib=system"
"--with-libpng=system"
"--with-zlib=system"
"--with-lcms=system"
"--with-stdc++lib=dynamic"
] ++ lib.optional stdenv.isx86_64 "--with-jvm-features=zgc"
++ lib.optional headless "--enable-headless-only"
++ lib.optional (!headless && enableJavaFX) "--with-import-modules=${openjfx}";
separateDebugInfo = true;
NIX_CFLAGS_COMPILE = "-Wno-error";
NIX_LDFLAGS = toString (lib.optionals (!headless) [
"-lfontconfig" "-lcups" "-lXinerama" "-lXrandr" "-lmagic"
] ++ lib.optionals (!headless && enableGnome2) [
"-lgtk-3" "-lgio-2.0" "-lgnomevfs-2" "-lgconf-2"
]);
# -j flag is explicitly rejected by the build system:
# Error: 'make -jN' is not supported, use 'make JOBS=N'
# Note: it does not make build sequential. Build system
# still runs in parallel.
enableParallelBuilding = false;
buildFlags = [ "images" ];
installPhase = ''
mkdir -p $out/lib
mv build/*/images/jdk $out/lib/openjdk
# Remove some broken manpages.
rm -rf $out/lib/openjdk/man/ja*
# Mirror some stuff in top-level.
mkdir -p $out/share
ln -s $out/lib/openjdk/include $out/include
ln -s $out/lib/openjdk/man $out/share/man
# IDEs use the provided src.zip to navigate the Java codebase (https://github.com/NixOS/nixpkgs/pull/95081)
ln -s $out/lib/openjdk/lib/src.zip $out/lib/src.zip
# jni.h expects jni_md.h to be in the header search path.
ln -s $out/include/linux/*_md.h $out/include/
# Remove crap from the installation.
rm -rf $out/lib/openjdk/demo
${lib.optionalString headless ''
rm $out/lib/openjdk/lib/{libjsound,libfontmanager}.so
''}
ln -s $out/lib/openjdk/bin $out/bin
'';
preFixup = ''
# Propagate the setJavaClassPath setup hook so that any package
# that depends on the JDK has $CLASSPATH set up properly.
mkdir -p $out/nix-support
#TODO or printWords? cf https://github.com/NixOS/nixpkgs/pull/27427#issuecomment-317293040
echo -n "${setJavaClassPath}" > $out/nix-support/propagated-build-inputs
# Set JAVA_HOME automatically.
mkdir -p $out/nix-support
cat <<EOF > $out/nix-support/setup-hook
if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out/lib/openjdk; fi
EOF
'';
postFixup = ''
# Build the set of output library directories to rpath against
LIBDIRS=""
for output in $outputs; do
if [ "$output" = debug ]; then continue; fi
LIBDIRS="$(find $(eval echo \$$output) -name \*.so\* -exec dirname {} \+ | sort -u | tr '\n' ':'):$LIBDIRS"
done
# Add the local library paths to remove dependencies on the bootstrap
for output in $outputs; do
if [ "$output" = debug ]; then continue; fi
OUTPUTDIR=$(eval echo \$$output)
BINLIBS=$(find $OUTPUTDIR/bin/ -type f; find $OUTPUTDIR -name \*.so\*)
echo "$BINLIBS" | while read i; do
patchelf --set-rpath "$LIBDIRS:$(patchelf --print-rpath "$i")" "$i" || true
patchelf --shrink-rpath "$i" || true
done
done
'';
disallowedReferences = [ openjdk19-bootstrap ];
meta = import ./meta.nix lib version.feature;
passthru = {
architecture = "";
home = "${openjdk}/lib/openjdk";
inherit gtk3;
};
};
in openjdk

View file

@ -0,0 +1,81 @@
{ lib, stdenv, fetchurl, unzip, setJavaClassPath }:
let
# Details from https://www.azul.com/downloads/?version=java-19-sts&os=macos&package=jdk
# Note that the latest build may differ by platform
dist = {
x86_64-darwin = {
arch = "x64";
zuluVersion = "19.30.11";
jdkVersion = "19.0.1";
sha256 = "1h0qj0xgpxjy506ikbgdn74pi4860lsnh5n3q3bayfmn0pxc5ksn";
};
aarch64-darwin = {
arch = "aarch64";
zuluVersion = "19.30.11";
jdkVersion = "19.0.1";
sha256 = "0g8i371h5fv686xhiff0431sgvdk80lbp2lkz86jpfdv9lgg0qnk";
};
}."${stdenv.hostPlatform.system}";
jce-policies = fetchurl {
# Ugh, unversioned URLs... I hope this doesn't change often enough to cause pain before we move to a Darwin source build of OpenJDK!
url = "http://cdn.azul.com/zcek/bin/ZuluJCEPolicies.zip";
sha256 = "0nk7m0lgcbsvldq2wbfni2pzq8h818523z912i7v8hdcij5s48c0";
};
jdk = stdenv.mkDerivation rec {
pname = "zulu${dist.zuluVersion}-ca-jdk";
version = dist.jdkVersion;
src = fetchurl {
url = "https://cdn.azul.com/zulu/bin/zulu${dist.zuluVersion}-ca-jdk${dist.jdkVersion}-macosx_${dist.arch}.tar.gz";
inherit (dist) sha256;
curlOpts = "-H Referer:https://www.azul.com/downloads/zulu/";
};
nativeBuildInputs = [ unzip ];
installPhase = ''
mkdir -p $out
mv * $out
unzip ${jce-policies}
mv -f ZuluJCEPolicies/*.jar $out/lib/security/
# jni.h expects jni_md.h to be in the header search path.
ln -s $out/include/darwin/*_md.h $out/include/
if [ -f $out/LICENSE ]; then
install -D $out/LICENSE $out/share/zulu/LICENSE
rm $out/LICENSE
fi
'';
preFixup = ''
# Propagate the setJavaClassPath setup hook from the JDK so that
# any package that depends on the JDK has $CLASSPATH set up
# properly.
mkdir -p $out/nix-support
printWords ${setJavaClassPath} > $out/nix-support/propagated-build-inputs
# Set JAVA_HOME automatically.
cat <<EOF >> $out/nix-support/setup-hook
if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out; fi
EOF
'';
# fixupPhase is moving the man to share/man which breaks it because it's a
# relative symlink.
postFixup = ''
ln -nsf ../zulu-${lib.versions.major version}.jdk/Contents/Home/man $out/share/man
'';
passthru = {
home = jdk;
};
meta = import ./meta.nix lib version;
};
in
jdk

View file

@ -0,0 +1,123 @@
{ stdenv, lib, fetchFromGitHub, fetchpatch, writeText, openjdk17_headless
, openjdk19_headless, gradle_7, pkg-config, perl, cmake, gperf, gtk2, gtk3, libXtst
, libXxf86vm, glib, alsa-lib, ffmpeg_4, python3, ruby, icu68 }:
let
major = "19";
update = "";
build = "+11";
repover = "${major}${update}${build}";
gradle_ = (gradle_7.override {
# note: gradle does not yet support running on 19
java = openjdk17_headless;
});
makePackage = args: stdenv.mkDerivation ({
version = "${major}${update}${build}";
src = fetchFromGitHub {
owner = "openjdk";
repo = "jfx";
rev = repover;
hash = "sha256-UXTaXtJ8py83V7IQK9wACIEWDAMRUaYNgH9e/Aeyuzc=";
};
patches = [
# 8295962: Reference to State in Task.java is ambiguous when building with JDK 19
(fetchpatch {
url = "https://github.com/openjdk/jfx/pull/933/commits/cfaee2a52350eff39dd4352484c892716076d3de.patch";
hash = "sha256-hzJMenhvtmHs/6BJj8GfaLp14myV8VCXCLLC8n32yEw=";
})
# ditto
(fetchpatch {
url = "https://github.com/openjdk/jfx/pull/933/commits/bd46ce12df0a93a56fe0d58d3653d08e58409b7f.patch";
hash = "sha256-o9908uw9vYvULmAh/lbfyHhgxz6jpgPq2fcAltWsYoU=";
})
];
buildInputs = [ gtk2 gtk3 libXtst libXxf86vm glib alsa-lib ffmpeg_4 icu68 ];
nativeBuildInputs = [ gradle_ perl pkg-config cmake gperf python3 ruby ];
dontUseCmakeConfigure = true;
config = writeText "gradle.properties" (''
CONF = Release
JDK_HOME = ${openjdk19_headless.home}
'' + args.gradleProperties or "");
buildPhase = ''
runHook preBuild
export GRADLE_USER_HOME=$(mktemp -d)
ln -s $config gradle.properties
export NIX_CFLAGS_COMPILE="$(pkg-config --cflags glib-2.0) $NIX_CFLAGS_COMPILE"
gradle --no-daemon $gradleFlags sdk
runHook postBuild
'';
} // args);
# Fake build to pre-download deps into fixed-output derivation.
# We run nearly full build because I see no other way to download everything that's needed.
# Anyone who knows a better way?
deps = makePackage {
pname = "openjfx-deps";
# perl code mavenizes pathes (com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar -> com/squareup/okio/okio/1.13.0/okio-1.13.0.jar)
installPhase = ''
find $GRADLE_USER_HOME -type f -regex '.*/modules.*\.\(jar\|pom\)' \
| perl -pe 's#(.*/([^/]+)/([^/]+)/([^/]+)/[0-9a-f]{30,40}/([^/\s]+))$# ($x = $2) =~ tr|\.|/|; "install -Dm444 $1 \$out/$x/$3/$4/$5" #e' \
| sh
rm -rf $out/tmp
'';
outputHashAlgo = "sha256";
outputHashMode = "recursive";
# suspiciously the same as for openjfx 17 ...
# could they really not have changed any of their dependencies?
# or did we miss changing another upstream hash when copy-pasting?
outputHash = "sha256-dV7/U5GpFxhI13smZ587C6cVE4FRNPY0zexZkYK4Yqo=";
};
in makePackage {
pname = "openjfx-modular-sdk";
gradleProperties = ''
COMPILE_MEDIA = true
COMPILE_WEBKIT = false
'';
preBuild = ''
swtJar="$(find ${deps} -name org.eclipse.swt\*.jar)"
substituteInPlace build.gradle \
--replace 'mavenCentral()' 'mavenLocal(); maven { url uri("${deps}") }' \
--replace 'name: SWT_FILE_NAME' "files('$swtJar')"
'';
installPhase = ''
cp -r build/modular-sdk $out
'';
stripDebugList = [ "." ];
postFixup = ''
# Remove references to bootstrap.
export openjdkOutPath='${openjdk19_headless.outPath}'
find "$out" -name \*.so | while read lib; do
new_refs="$(patchelf --print-rpath "$lib" | perl -pe 's,:?\Q$ENV{openjdkOutPath}\E[^:]*,,')"
patchelf --set-rpath "$new_refs" "$lib"
done
'';
disallowedReferences = [ openjdk17_headless openjdk19_headless ];
passthru.deps = deps;
meta = with lib; {
homepage = "https://openjdk.org/projects/openjfx/";
license = licenses.gpl2Classpath;
description = "The next-generation Java client toolkit";
maintainers = with maintainers; [ abbradar ];
platforms = platforms.unix;
};
}

View file

@ -14356,15 +14356,14 @@ with pkgs;
openjdk16-bootstrap = javaPackages.compiler.openjdk16-bootstrap;
openjdk18-bootstrap = javaPackages.compiler.openjdk18-bootstrap;
openjdk18 = javaPackages.compiler.openjdk18;
openjdk18_headless = javaPackages.compiler.openjdk18.headless;
jdk18 = openjdk18;
jdk18_headless = openjdk18_headless;
openjdk19 = javaPackages.compiler.openjdk19;
openjdk19_headless = javaPackages.compiler.openjdk19.headless;
jdk19 = openjdk19;
jdk19_headless = openjdk19_headless;
/* default JDK */
jdk = jdk17;
jdk_headless = jdk17_headless;
jdk = jdk19;
jdk_headless = jdk19_headless;
# Since the introduction of the Java Platform Module System in Java 9, Java
# no longer ships a separate JRE package.
@ -14376,6 +14375,9 @@ with pkgs;
jre = jdk;
jre_headless = jdk_headless;
jre17_minimal = callPackage ../development/compilers/openjdk/jre.nix {
jdk = jdk17;
};
jre_minimal = callPackage ../development/compilers/openjdk/jre.nix { };
openjdk = jdk;
@ -29524,7 +29526,7 @@ with pkgs;
};
jabref = callPackage ../applications/office/jabref {
jdk = jdk18;
jdk = javaPackages.compiler.openjdk18;
};
jack_capture = callPackage ../applications/audio/jack-capture { };

View file

@ -9,11 +9,12 @@ let
openjfx11 = callPackage ../development/compilers/openjdk/openjfx/11.nix { };
openjfx15 = callPackage ../development/compilers/openjdk/openjfx/15.nix { };
openjfx17 = callPackage ../development/compilers/openjdk/openjfx/17.nix { };
openjfx19 = callPackage ../development/compilers/openjdk/openjfx/19.nix { };
mavenfod = callPackage ../development/java-modules/maven-fod.nix { };
in {
inherit mavenbuild mavenfod fetchMaven openjfx11 openjfx15 openjfx17;
inherit mavenbuild mavenfod fetchMaven openjfx11 openjfx15 openjfx17 openjfx19;
compiler = let
@ -198,6 +199,14 @@ in {
openjfx = openjfx17;
};
openjdk19 = mkOpenjdk
../development/compilers/openjdk/19.nix
../development/compilers/openjdk/darwin/19.nix
{
openjdk19-bootstrap = temurin-bin.jdk-19;
openjfx = openjfx19;
};
temurin-bin = recurseIntoAttrs (callPackage (
if stdenv.isLinux
then ../development/compilers/temurin-bin/jdk-linux.nix