From 11692ab62c055388684748dce7293d2ec75db60c Mon Sep 17 00:00:00 2001 From: Olli Helenius Date: Sat, 30 Dec 2023 14:33:43 +0200 Subject: [PATCH 1/2] gradle: auto-detect nativeVersion Instead of having to know the version of native-platform at the Nix level, we use the file `lib/native-platform-.jar` to figure out the version of the library JAR to patch. --- .../tools/build-managers/gradle/default.nix | 39 ++++++++++++------- .../tools/build-managers/gradle/patching.sh | 29 ++++++++++++++ .../tools/build-managers/gradle/update.sh | 15 +------ 3 files changed, 54 insertions(+), 29 deletions(-) create mode 100644 pkgs/development/tools/build-managers/gradle/patching.sh diff --git a/pkgs/development/tools/build-managers/gradle/default.nix b/pkgs/development/tools/build-managers/gradle/default.nix index e3a8c11c8fc40..23f12b1aa3d3d 100644 --- a/pkgs/development/tools/build-managers/gradle/default.nix +++ b/pkgs/development/tools/build-managers/gradle/default.nix @@ -3,7 +3,7 @@ rec { gen = - { version, nativeVersion, hash, + { version, hash, # The default JDK/JRE that will be used for derived Gradle packages. # A current LTS version of a JDK is a good choice. @@ -36,6 +36,7 @@ rec { , testers , runCommand , writeText + , autoPatchelfHook # The JDK/JRE used for running Gradle. , java ? defaultJava @@ -57,8 +58,22 @@ rec { dontBuild = true; - nativeBuildInputs = [ makeWrapper unzip ]; - buildInputs = [ java ]; + nativeBuildInputs = [ + makeWrapper + unzip + ] ++ lib.optionals stdenv.isLinux [ + autoPatchelfHook + ]; + + buildInputs = [ + java + stdenv.cc.cc + ncurses5 + ncurses6 + ]; + + # We only need to patchelf some libs embedded in JARs. + dontAutoPatchelf = true; installPhase = with builtins; let @@ -87,16 +102,13 @@ rec { fixupPhase = let arch = if stdenv.is64bit then "amd64" else "i386"; in '' + . ${./patching.sh} + + nativeVersion="$(extractVersion native-platform $out/lib/gradle/lib/native-platform-*.jar)" for variant in "" "-ncurses5" "-ncurses6"; do - mkdir "patching$variant" - pushd "patching$variant" - jar xf $out/lib/gradle/lib/native-platform-linux-${arch}$variant-${nativeVersion}.jar - patchelf \ - --set-rpath "${stdenv.cc.cc.lib}/lib64:${lib.makeLibraryPath [ stdenv.cc.cc ncurses5 ncurses6 ]}" \ - net/rubygrapefruit/platform/linux-${arch}$variant/libnative-platform*.so - jar cf native-platform-linux-${arch}$variant-${nativeVersion}.jar . - mv native-platform-linux-${arch}$variant-${nativeVersion}.jar $out/lib/gradle/lib/ - popd + autoPatchelfInJar \ + $out/lib/gradle/lib/native-platform-linux-${arch}$variant-''${nativeVersion}.jar \ + "${stdenv.cc.cc.lib}/lib64:${lib.makeLibraryPath [ stdenv.cc.cc ncurses5 ncurses6 ]}" done # The scanner doesn't pick up the runtime dependency in the jar. @@ -162,21 +174,18 @@ rec { gradle_8 = gen { version = "8.10"; - nativeVersion = "0.22-milestone-26"; hash = "sha256-W5xes/n8LJSrrqV9kL14dHyhF927+WyFnTdBGBoSvyo="; defaultJava = jdk21; }; gradle_7 = gen { version = "7.6.4"; - nativeVersion = "0.22-milestone-25"; hash = "sha256-vtHaM8yg9VerE2kcd/OLtnOIEZ5HlNET4FEDm4Cvm7E="; defaultJava = jdk17; }; gradle_6 = gen { version = "6.9.4"; - nativeVersion = "0.22-milestone-20"; hash = "sha256-PiQCKFON6fGHcqV06ZoLqVnoPW7zUQFDgazZYxeBOJo="; defaultJava = jdk11; }; diff --git a/pkgs/development/tools/build-managers/gradle/patching.sh b/pkgs/development/tools/build-managers/gradle/patching.sh new file mode 100644 index 0000000000000..73659fad2f803 --- /dev/null +++ b/pkgs/development/tools/build-managers/gradle/patching.sh @@ -0,0 +1,29 @@ +extractVersion() { + local jar version + local prefix="$1" + shift + local candidates="$@" + + jar="$(basename -a $candidates | sort | head -n1)" + + version="${jar#$prefix-}" + + echo "${version%.jar}" +} + +autoPatchelfInJar() { + local file="$1" rpath="$2" + local work + + work="$(mktemp -dt patching.XXXXXXXXXX)" + pushd "$work" + + jar xf "$file" + rm "$file" + + autoPatchelf -- . + + jar cf "$file" . + + popd +} diff --git a/pkgs/development/tools/build-managers/gradle/update.sh b/pkgs/development/tools/build-managers/gradle/update.sh index 310c368405cb8..4e247954f0289 100755 --- a/pkgs/development/tools/build-managers/gradle/update.sh +++ b/pkgs/development/tools/build-managers/gradle/update.sh @@ -49,20 +49,7 @@ do read -d "\n" gradle_hash gradle_path < <(nix-prefetch-url --print-path $url) gradle_hash=$(nix-hash --to-sri --type sha256 "$gradle_hash") - # Prefix and suffix for "native-platform" dependency. - gradle_native_prefix="gradle-$v/lib/native-platform-" - gradle_native_suffix=".jar" - tmp=$(mktemp) - zipinfo -1 "$gradle_path" "$gradle_native_prefix*$gradle_native_suffix" > $tmp - gradle_native=$(cat $tmp | head -n1) - gradle_native=${gradle_native#"$gradle_native_prefix"} - gradle_native=${gradle_native%"$gradle_native_suffix"} - - # Supported architectures - #grep -Pho "(linux|osx)-\w+" $tmp | sort | uniq - rm -f $tmp - - echo -e "{\\n version = \"$v\";\\n nativeVersion = \"$gradle_native\";\\n sha256 = \"$gradle_hash\";\\n}" > $f + echo -e "{\\n version = \"$v\";\\n sha256 = \"$gradle_hash\";\\n}" > $f echo "$v DONE" done From bd244e7a4c391db5f065c2c5cbcc55b07b0cd290 Mon Sep 17 00:00:00 2001 From: Olli Helenius Date: Sat, 30 Dec 2023 14:45:12 +0200 Subject: [PATCH 2/2] gradle: also patch the native file-events library It depends on libstdc++, so add that to its RPATH. --- pkgs/development/tools/build-managers/gradle/default.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkgs/development/tools/build-managers/gradle/default.nix b/pkgs/development/tools/build-managers/gradle/default.nix index 23f12b1aa3d3d..a9827e7a0a7e2 100644 --- a/pkgs/development/tools/build-managers/gradle/default.nix +++ b/pkgs/development/tools/build-managers/gradle/default.nix @@ -111,6 +111,13 @@ rec { "${stdenv.cc.cc.lib}/lib64:${lib.makeLibraryPath [ stdenv.cc.cc ncurses5 ncurses6 ]}" done + # The file-events library _seems_ to follow the native-platform version, but + # we won’t assume that. + fileEventsVersion="$(extractVersion file-events $out/lib/gradle/lib/file-events-*.jar)" + autoPatchelfInJar \ + $out/lib/gradle/lib/file-events-linux-${arch}-''${fileEventsVersion}.jar \ + "${stdenv.cc.cc.lib}/lib64:${lib.makeLibraryPath [ stdenv.cc.cc ]}" + # The scanner doesn't pick up the runtime dependency in the jar. # Manually add a reference where it will be found. mkdir $out/nix-support