nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 lib,
3 stdenv,
4 fetchurl,
5 fetchFromGitHub,
6 wrapGAppsHook3,
7 makeDesktopItem,
8 copyDesktopItems,
9 makeShellWrapper,
10 unzip,
11 zip,
12 xdg-utils,
13 gtk3,
14 jdk25,
15 openjfx25,
16 jre25_minimal,
17 gradle_9,
18 python3,
19 postgresql,
20 jbang,
21}:
22
23let
24 jdk = jdk25;
25 openjfx = openjfx25;
26 jre = jre25_minimal.override {
27 modules = [
28 "java.base"
29 "java.compiler"
30 "java.datatransfer"
31 "java.desktop"
32 "java.logging"
33 "java.management"
34 "java.naming"
35 "java.net.http"
36 "java.prefs"
37 "java.scripting"
38 "java.sql"
39 "java.sql.rowset"
40 "java.xml"
41 "jdk.httpserver"
42 "jdk.incubator.vector"
43 "jdk.jsobject"
44 "jdk.net"
45 "jdk.security.auth"
46 "jdk.unsupported"
47 "jdk.unsupported.desktop"
48 "jdk.xml.dom"
49 ];
50 };
51 gradle = gradle_9;
52 ltwaUrl = "https://www.issn.org/wp-content/uploads/2021/07/ltwa_20210702.csv";
53 ltwa = fetchurl {
54 url = ltwaUrl;
55 hash = "sha256-jnS8Y9x8eg2L3L3RPnS6INTs19mEtwzfNIjJUw6HtIY=";
56 };
57 kotlinDslVersion = "6.4.2";
58in
59stdenv.mkDerivation rec {
60 version = "6.0-alpha.4";
61 pname = "jabref";
62
63 src = fetchFromGitHub {
64 owner = "JabRef";
65 repo = "jabref";
66 tag = "v${version}";
67 hash = "sha256-ZhyWYZD8QT3dH6MwG2kMjTAjkxaVFIMR4C9aAvi3FJQ=";
68 fetchSubmodules = true;
69 };
70
71 desktopItems = [
72 (makeDesktopItem {
73 comment = meta.description;
74 name = "JabRef";
75 desktopName = "JabRef";
76 genericName = "BibTex Editor";
77 categories = [ "Office" ];
78 icon = "jabref";
79 exec = "JabRef %U";
80 startupWMClass = "org.jabref.gui.JabRefGUI";
81 mimeTypes = [ "text/x-bibtex" ];
82 })
83 ];
84
85 mitmCache = gradle.fetchDeps {
86 inherit pname;
87 data = ./deps.json;
88 };
89
90 postPatch = ''
91 sed -i -e '/vendor/d' -e '/JavaLanguageVersion/s/24/25/' build-logic/src/main/kotlin/org.jabref.gradle.feature.compile.gradle.kts
92 sed -i -e '/javafx-base/s/24.0.2/25/' build-support/src/main/java/*.java
93 sed -i -e 's/javafx = .*/javafx = "25"/' versions/build.gradle.kts
94
95 sed -i -e '1a //REPOS file://${mitmCache}/https/repo.maven.apache.org/maven2,file://${mitmCache}/https/plugins.gradle.org/m2' build-support/src/main/java/*.java
96
97 substituteInPlace build-logic/build.gradle.kts \
98 --replace-fail '`kotlin-dsl`' 'id("org.gradle.kotlin.kotlin-dsl") version "${kotlinDslVersion}"'
99
100 pushd jablib
101
102 # Disable update check
103 substituteInPlace src/main/java/org/jabref/logic/preferences/JabRefCliPreferences.java \
104 --replace-fail 'VERSION_CHECK_ENABLED, Boolean.TRUE' \
105 'VERSION_CHECK_ENABLED, Boolean.FALSE'
106
107 # Find OpenOffice/LibreOffice binary
108 substituteInPlace src/main/java/org/jabref/logic/openoffice/OpenOfficePreferences.java \
109 --replace-fail '/usr' '/run/current-system/sw'
110
111 sed -i -e '/setOutputRedirector/d' src/main/java/org/jabref/logic/search/PostgreServer.java
112
113 substituteInPlace build.gradle.kts \
114 --replace-fail '${ltwaUrl}' 'file://${ltwa}'
115
116 popd
117 '';
118
119 nativeBuildInputs = [
120 jdk
121 gradle
122 (jbang.override { inherit jdk; })
123 wrapGAppsHook3
124 copyDesktopItems
125 unzip
126 zip
127 makeShellWrapper
128 ];
129
130 buildInputs = [
131 gtk3
132 python3
133 ];
134
135 gradleFlags = [
136 "-PprojVersion=${version}"
137 "-Dorg.gradle.java.home=${jdk}"
138 ];
139
140 preBuild = ''
141 gradleFlagsArray+=(-PprojVersionInfo="${version} NixOS")
142 '';
143
144 dontWrapGApps = true;
145
146 installPhase = ''
147 runHook preInstall
148
149 install -dm755 $out/share/java/jabref
150 install -Dm644 LICENSE $out/share/licenses/jabref/LICENSE
151 install -Dm644 jabgui/src/main/resources/icons/jabref.svg $out/share/pixmaps/jabref.svg
152
153 # script to support browser extensions
154 install -Dm755 jabgui/buildres/linux/jabrefHost.py $out/lib/jabrefHost.py
155 patchShebangs $out/lib/jabrefHost.py
156 install -Dm644 jabgui/buildres/linux/native-messaging-host/firefox/org.jabref.jabref.json $out/lib/mozilla/native-messaging-hosts/org.jabref.jabref.json
157 sed -i -e "s|/opt/jabref|$out|" $out/lib/mozilla/native-messaging-hosts/org.jabref.jabref.json
158
159 # Resources in the jar can't be found, workaround copied from AUR
160 cp -r */build/resources $out/share/java/jabref
161
162 for tarball in */build/distributions/*.tar; do
163 tar xf $tarball -C $out --strip-components=1
164 done
165
166 # Replace .so files with the ones from nixpkgs
167 cp ${openjfx}/modules_libs/javafx.graphics/*.so $out/lib
168 # Temp fix: openjfx doesn't build with webkit
169 unzip $out/lib/javafx-web-*-*.jar libjfxwebkit.so -d $out/lib/
170
171 zip -d $out/lib/javafx-media-*-*.jar "*.so"
172 zip -d $out/lib/javafx-graphics-*-*.jar "*.so"
173 zip -d $out/lib/javafx-web-*-*.jar "*.so"
174
175 # Use postgresql from nixpkgs since the bundled binary doesn't work on NixOS
176 ARCH1=${if stdenv.isAarch64 then "arm64v8" else "amd64"}
177 ARCH2=${if stdenv.isAarch64 then "arm_64" else "x86_64"}
178 mkdir postgresql
179 cd postgresql
180 ln -s ${postgresql}/{lib,share} ./
181 mkdir -p bin
182 ln -s ${postgresql}/bin/{postgres,initdb} ./bin
183 # Wrap pg_ctl to workaround https://github.com/NixOS/nixpkgs/issues/83770
184 # Use custom wrap to workaround https://github.com/NixOS/nixpkgs/issues/330471
185 makeShellWrapper ${postgresql}/bin/pg_ctl ./bin/pg_ctl \
186 --add-flags '-o "-k /tmp"'
187 chmod +x ./bin/pg_ctl
188
189 jar=$(ls $out/lib/embedded-postgres-binaries-linux-$ARCH1-*.jar)
190
191 tar -cJf postgres-linux-$ARCH2.txz *
192 zip $jar postgres-linux-$ARCH2.txz
193 cd ..
194
195 runHook postInstall
196 '';
197
198 postFixup = ''
199 for bin in jabgui jabkit jabsrv-cli; do
200 DEFAULT_JVM_OPTS=$(sed -n -E "s/^DEFAULT_JVM_OPTS='(.*)'$/\1/p" $out/bin/$bin | sed -e 's/"//g')
201 MODULE_PATH=$(sed -n -E 's/^MODULE_PATH=(.*)$/\1/p' $out/bin/$bin | sed -e "s|\$APP_HOME|$out|g")
202 MODULE=$(sed -n -E 's/\s*--module (.*) \\/\1/p' $out/bin/$bin)
203 rm $out/bin/$bin*
204
205 # put this in postFixup because some gappsWrapperArgs are generated in gappsWrapperArgsHook in preFixup
206 makeWrapper ${jre}/bin/java $out/bin/$bin \
207 "''${gappsWrapperArgs[@]}" \
208 --suffix PATH : ${
209 lib.makeBinPath [
210 xdg-utils
211 postgresql
212 ]
213 } \
214 --add-flags "$DEFAULT_JVM_OPTS \
215 -Djava.library.path=$out/lib/ \
216 --module-path $MODULE_PATH \
217 --module $MODULE"
218 done
219
220 # lowercase alias (for convenience and required for browser extensions)
221 ln -sf $out/bin/jabgui $out/bin/jabref
222 ln -sf $out/bin/jabgui $out/bin/JabRef
223 '';
224
225 gradleUpdateScript = ''
226 # Add jbang deps to gradle
227 sed -n 's|//DEPS \(.*\)| implementation("\1")|p' build-support/src/main/java/*.java | sort -u | sed -i '/dependencies {/r /dev/stdin' build-logic/build.gradle.kts
228
229 gradle assemble -Dos.arch=amd64
230 gradle assemble -Dos.arch=aarch64
231 '';
232
233 meta = {
234 description = "Open source bibliography reference manager";
235 homepage = "https://www.jabref.org";
236 sourceProvenance = with lib.sourceTypes; [
237 fromSource
238 binaryBytecode # source bundles dependencies as jars
239 binaryNativeCode # source bundles dependencies as jars
240 ];
241 license = lib.licenses.mit;
242 platforms = [
243 "x86_64-linux"
244 "aarch64-linux"
245 ];
246 maintainers = with lib.maintainers; [
247 linsui
248 ];
249 };
250}