about summary refs log tree commit diff
path: root/pkgs/development/tools/java
diff options
context:
space:
mode:
authorSharzyL <me@sharzy.in>2023-07-02 20:51:36 +0800
committerSharzyL <me@sharzy.in>2023-07-02 21:00:23 +0800
commit8a6a09f620087fb3db9f4a8cd2de7de45de1c8f4 (patch)
treedfe38532183a1dd3f96090eb8ebe850f4b1738e2 /pkgs/development/tools/java
parent6ca2822b7ca4b43eb941e8ca3f5a61af37e3b397 (diff)
jextract: init at unstable-2023-04-14
Diffstat (limited to 'pkgs/development/tools/java')
-rw-r--r--pkgs/development/tools/java/jextract/default.nix99
1 files changed, 99 insertions, 0 deletions
diff --git a/pkgs/development/tools/java/jextract/default.nix b/pkgs/development/tools/java/jextract/default.nix
new file mode 100644
index 0000000000000..8302e02726e8c
--- /dev/null
+++ b/pkgs/development/tools/java/jextract/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, emptyDirectory
+, writeText
+, makeWrapper
+, gradle
+, jdk20
+, llvmPackages
+}:
+
+let
+  gradleInit = writeText "init.gradle" ''
+    logger.lifecycle 'Replacing Maven repositories with empty directory...'
+    gradle.projectsLoaded {
+      rootProject.allprojects {
+        buildscript {
+          repositories {
+            clear()
+            maven { url '${emptyDirectory}' }
+          }
+        }
+        repositories {
+          clear()
+          maven { url '${emptyDirectory}' }
+        }
+      }
+    }
+    settingsEvaluated { settings ->
+      settings.pluginManagement {
+        repositories {
+          maven { url '${emptyDirectory}' }
+        }
+      }
+    }
+  '';
+in
+
+stdenv.mkDerivation {
+  pname = "jextract";
+  version = "unstable-2023-04-14";
+
+  src = fetchFromGitHub {
+    owner = "openjdk";
+    repo = "jextract";
+    rev = "cf3afe9ca71592c8ebb32f219707285dd1d5b28a";
+    hash = "sha256-8qRD1Xg39vxtFAdguD8XvkQ8u7YzFU55MhyyJozVffo=";
+  };
+
+  nativeBuildInputs = [
+    gradle
+    makeWrapper
+  ];
+
+  env = {
+    ORG_GRADLE_PROJECT_llvm_home = llvmPackages.libclang.lib;
+    ORG_GRADLE_PROJECT_jdk20_home = jdk20;
+  };
+
+  buildPhase = ''
+    runHook preBuild
+
+    export GRADLE_USER_HOME=$(mktemp -d)
+    gradle --console plain --init-script "${gradleInit}" assemble
+
+    runHook postBuild
+  '';
+
+  doCheck = true;
+
+  checkPhase = ''
+    runHook preCheck
+    gradle --console plain --init-script "${gradleInit}" verify
+    runHook postCheck
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D --mode=0444 --target-directory="$out/share/java" \
+      ./build/libs/org.openjdk.jextract-unspecified.jar
+
+    runHook postInstall
+  '';
+
+  postFixup = ''
+    makeWrapper "${jdk20}/bin/java" "$out/bin/jextract" \
+      --add-flags "--enable-preview" \
+      --add-flags "--class-path $out/share/java/org.openjdk.jextract-unspecified.jar" \
+      --add-flags "org.openjdk.jextract.JextractTool"
+  '';
+
+  meta = with lib; {
+    description = "A tool which mechanically generates Java bindings from a native library headers";
+    homepage = "https://github.com/openjdk/jextract";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ sharzy ];
+  };
+}