1{ lib
2, stdenv
3, fetchFromGitHub
4, emptyDirectory
5, writeText
6, makeWrapper
7, gradle
8, jdk20
9, llvmPackages
10}:
11
12let
13 gradleInit = writeText "init.gradle" ''
14 logger.lifecycle 'Replacing Maven repositories with empty directory...'
15 gradle.projectsLoaded {
16 rootProject.allprojects {
17 buildscript {
18 repositories {
19 clear()
20 maven { url '${emptyDirectory}' }
21 }
22 }
23 repositories {
24 clear()
25 maven { url '${emptyDirectory}' }
26 }
27 }
28 }
29 settingsEvaluated { settings ->
30 settings.pluginManagement {
31 repositories {
32 maven { url '${emptyDirectory}' }
33 }
34 }
35 }
36 '';
37in
38
39stdenv.mkDerivation {
40 pname = "jextract";
41 version = "unstable-2023-04-14";
42
43 src = fetchFromGitHub {
44 owner = "openjdk";
45 repo = "jextract";
46 rev = "cf3afe9ca71592c8ebb32f219707285dd1d5b28a";
47 hash = "sha256-8qRD1Xg39vxtFAdguD8XvkQ8u7YzFU55MhyyJozVffo=";
48 };
49
50 nativeBuildInputs = [
51 gradle
52 makeWrapper
53 ];
54
55 env = {
56 ORG_GRADLE_PROJECT_llvm_home = llvmPackages.libclang.lib;
57 ORG_GRADLE_PROJECT_jdk20_home = jdk20;
58 };
59
60 buildPhase = ''
61 runHook preBuild
62
63 export GRADLE_USER_HOME=$(mktemp -d)
64 gradle --console plain --init-script "${gradleInit}" assemble
65
66 runHook postBuild
67 '';
68
69 doCheck = true;
70
71 checkPhase = ''
72 runHook preCheck
73 gradle --console plain --init-script "${gradleInit}" verify
74 runHook postCheck
75 '';
76
77 installPhase = ''
78 runHook preInstall
79
80 mkdir -p $out/opt/
81 cp -r ./build/jextract $out/opt/jextract
82
83 runHook postInstall
84 '';
85
86 postFixup = ''
87 makeWrapper "$out/opt/jextract/bin/jextract" "$out/bin/jextract"
88 '';
89
90 meta = with lib; {
91 description = "A tool which mechanically generates Java bindings from a native library headers";
92 homepage = "https://github.com/openjdk/jextract";
93 license = licenses.gpl2Only;
94 maintainers = with maintainers; [ sharzy ];
95 };
96}