mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-01-21 20:34:06 +00:00
45eff9d9c7
This initially may look like a downgrade, but this is caused by how upstream is tagging versions. Before they would have the GraalVM having its own version (e.g. 22.3.1), and each version would support multiple JVM versions (e.g. 11, 17, 19). Now each release supports only one JVM version (e.g.: 21), and they track the same version as the JVM. They also changed packaging, making all sub-products (e.g.: GraalPy, GraalRuby, etc.) standalone, so they do not depend in GraalVM anymore and have their own version. Thanks to this change, we will need to repackage everything. To simplify, this commit will remove all sub-products and only care about the GraalVM/Native Image (that is back to GraalVM itself) part. Other commits will re-added each sub-product. Fix (partial): https://github.com/NixOS/nixpkgs/issues/257292
205 lines
5.5 KiB
Nix
205 lines
5.5 KiB
Nix
{ lib
|
|
, stdenv
|
|
, alsa-lib
|
|
, autoPatchelfHook
|
|
, cairo
|
|
, cups
|
|
, darwin
|
|
, fontconfig
|
|
, gcc
|
|
, glib
|
|
, glibc
|
|
, gtk3
|
|
, makeWrapper
|
|
, musl
|
|
, setJavaClassPath
|
|
, unzip
|
|
, writeShellScriptBin
|
|
, xorg
|
|
, zlib
|
|
# extra params
|
|
, extraCLibs ? [ ]
|
|
, gtkSupport ? stdenv.isLinux
|
|
, useMusl ? false
|
|
, ...
|
|
} @ args:
|
|
|
|
assert useMusl -> stdenv.isLinux;
|
|
let
|
|
extraArgs = builtins.removeAttrs args [
|
|
"alsa-lib"
|
|
"autoPatchelfHook"
|
|
"cairo"
|
|
"cups"
|
|
"darwin"
|
|
"fontconfig"
|
|
"gcc"
|
|
"glib"
|
|
"gtk3"
|
|
"lib"
|
|
"makeWrapper"
|
|
"musl"
|
|
"setJavaClassPath"
|
|
"stdenv"
|
|
"unzip"
|
|
"writeShellScriptBin"
|
|
"xorg"
|
|
"zlib"
|
|
"extraCLibs"
|
|
"gtkSupport"
|
|
"useMusl"
|
|
"passthru"
|
|
"meta"
|
|
];
|
|
|
|
cLibs = [ glibc zlib.static ]
|
|
++ lib.optionals (!useMusl) [ glibc.static ]
|
|
++ lib.optionals useMusl [ musl ]
|
|
++ extraCLibs;
|
|
|
|
# GraalVM 21.3.0+ expects musl-gcc as <system>-musl-gcc
|
|
musl-gcc = (writeShellScriptBin "${stdenv.hostPlatform.system}-musl-gcc" ''${lib.getDev musl}/bin/musl-gcc "$@"'');
|
|
binPath = lib.makeBinPath ([ gcc ] ++ lib.optionals useMusl [ musl-gcc ]);
|
|
|
|
runtimeLibraryPath = lib.makeLibraryPath
|
|
([ cups ] ++ lib.optionals gtkSupport [ cairo glib gtk3 ]);
|
|
|
|
graalvm-ce = stdenv.mkDerivation ({
|
|
pname = "graalvm-ce";
|
|
|
|
unpackPhase = ''
|
|
runHook preUnpack
|
|
|
|
mkdir -p "$out"
|
|
|
|
# The tarball on Linux has the following directory structure:
|
|
#
|
|
# graalvm-ce-java11-20.3.0/*
|
|
#
|
|
# while on Darwin it looks like this:
|
|
#
|
|
# graalvm-ce-java11-20.3.0/Contents/Home/*
|
|
#
|
|
# We therefor use --strip-components=1 vs 3 depending on the platform.
|
|
tar xf "$src" -C "$out" --strip-components=${
|
|
if stdenv.isLinux then "1" else "3"
|
|
}
|
|
|
|
# Sanity check
|
|
if [ ! -d "$out/bin" ]; then
|
|
echo "The `bin` is directory missing after extracting the graalvm"
|
|
echo "tarball, please compare the directory structure of the"
|
|
echo "tarball with what happens in the unpackPhase (in particular"
|
|
echo "with regards to the `--strip-components` flag)."
|
|
exit 1
|
|
fi
|
|
|
|
runHook postUnpack
|
|
'';
|
|
|
|
dontStrip = true;
|
|
|
|
nativeBuildInputs = [ unzip makeWrapper ]
|
|
++ lib.optional stdenv.isLinux autoPatchelfHook;
|
|
|
|
propagatedBuildInputs = [ setJavaClassPath zlib ]
|
|
++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.Foundation;
|
|
|
|
buildInputs = lib.optionals stdenv.isLinux [
|
|
alsa-lib # libasound.so wanted by lib/libjsound.so
|
|
fontconfig
|
|
stdenv.cc.cc.lib # libstdc++.so.6
|
|
xorg.libX11
|
|
xorg.libXext
|
|
xorg.libXi
|
|
xorg.libXrender
|
|
xorg.libXtst
|
|
];
|
|
|
|
postInstall = ''
|
|
# jni.h expects jni_md.h to be in the header search path.
|
|
ln -sf $out/include/linux/*_md.h $out/include/
|
|
|
|
# copy-paste openjdk's preFixup
|
|
# Set JAVA_HOME automatically.
|
|
mkdir -p $out/nix-support
|
|
cat > $out/nix-support/setup-hook << EOF
|
|
if [ -z "\''${JAVA_HOME-}" ]; then export JAVA_HOME=$out; fi
|
|
EOF
|
|
|
|
wrapProgram $out/bin/native-image \
|
|
--prefix PATH : ${binPath} \
|
|
${toString (map (l: "--add-flags '-H:CLibraryPath=${l}/lib'") cLibs)}
|
|
'';
|
|
|
|
preFixup = lib.optionalString (stdenv.isLinux) ''
|
|
for bin in $(find "$out/bin" -executable -type f); do
|
|
wrapProgram "$bin" --prefix LD_LIBRARY_PATH : "${runtimeLibraryPath}"
|
|
done
|
|
'';
|
|
|
|
doInstallCheck = true;
|
|
installCheckPhase = ''
|
|
runHook preInstallCheck
|
|
|
|
${# broken in darwin
|
|
lib.optionalString stdenv.isLinux ''
|
|
echo "Testing Jshell"
|
|
echo '1 + 1' | $out/bin/jshell
|
|
''}
|
|
|
|
echo ${lib.escapeShellArg ''
|
|
public class HelloWorld {
|
|
public static void main(String[] args) {
|
|
System.out.println("Hello World");
|
|
}
|
|
}
|
|
''} > HelloWorld.java
|
|
$out/bin/javac HelloWorld.java
|
|
|
|
# run on JVM with Graal Compiler
|
|
echo "Testing GraalVM"
|
|
$out/bin/java -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -XX:+UseJVMCICompiler HelloWorld | fgrep 'Hello World'
|
|
|
|
echo "Ahead-Of-Time compilation"
|
|
$out/bin/native-image -H:-CheckToolchain -H:+ReportExceptionStackTraces HelloWorld
|
|
./helloworld | fgrep 'Hello World'
|
|
|
|
${# --static is only available in Linux
|
|
lib.optionalString (stdenv.isLinux && !useMusl) ''
|
|
echo "Ahead-Of-Time compilation with -H:+StaticExecutableWithDynamicLibC"
|
|
$out/bin/native-image -H:+UnlockExperimentalVMOptions -H:+StaticExecutableWithDynamicLibC HelloWorld
|
|
./helloworld | fgrep 'Hello World'
|
|
|
|
echo "Ahead-Of-Time compilation with --static"
|
|
$out/bin/native-image --static HelloWorld
|
|
./helloworld | fgrep 'Hello World'
|
|
''}
|
|
|
|
${# --static is only available in Linux
|
|
lib.optionalString (stdenv.isLinux && useMusl) ''
|
|
echo "Ahead-Of-Time compilation with --static and --libc=musl"
|
|
$out/bin/native-image --static HelloWorld --libc=musl
|
|
./helloworld | fgrep 'Hello World'
|
|
''}
|
|
|
|
runHook postInstallCheck
|
|
'';
|
|
|
|
passthru = {
|
|
home = graalvm-ce;
|
|
updateScript = ./update.sh;
|
|
} // (args.passhtru or { });
|
|
|
|
meta = with lib; ({
|
|
homepage = "https://www.graalvm.org/";
|
|
description = "High-Performance Polyglot VM";
|
|
license = with licenses; [ upl gpl2Classpath bsd3 ];
|
|
sourceProvenance = with sourceTypes; [ binaryNativeCode ];
|
|
mainProgram = "java";
|
|
maintainers = with maintainers; teams.graalvm-ce.members ++ [ ];
|
|
} // (args.meta or { }));
|
|
} // extraArgs);
|
|
in
|
|
graalvm-ce
|