1{ pkgs }:
2final: prev:
3with prev;
4{
5 ##########################################3
6 #### manual fixes for generated packages
7 ##########################################3
8 bit32 = prev.bit32.overrideAttrs(oa: {
9 # Small patch in order to no longer redefine a Lua 5.2 function that Luajit
10 # 2.1 also provides, see https://github.com/LuaJIT/LuaJIT/issues/325 for
11 # more
12 patches = [
13 ./bit32.patch
14 ];
15 });
16
17 busted = prev.busted.overrideAttrs(oa: {
18 nativeBuildInputs = oa.nativeBuildInputs ++ [
19 pkgs.installShellFiles
20 ];
21 postConfigure = ''
22 substituteInPlace ''${rockspecFilename} \
23 --replace "'lua_cliargs = 3.0-1'," "'lua_cliargs >= 3.0-1',"
24 '';
25 postInstall = ''
26 installShellCompletion --cmd busted \
27 --zsh completions/zsh/_busted \
28 --bash completions/bash/busted.bash
29 '';
30 });
31
32 cqueues = (prev.lib.overrideLuarocks prev.cqueues (drv: {
33 externalDeps = [
34 { name = "CRYPTO"; dep = pkgs.openssl; }
35 { name = "OPENSSL"; dep = pkgs.openssl; }
36 ];
37 disabled = luaOlder "5.1" || luaAtLeast "5.4";
38 })).overrideAttrs(oa: rec {
39 # Parse out a version number without the Lua version inserted
40 version = with pkgs.lib; let
41 version' = prev.cqueues.version;
42 rel = splitVersion version';
43 date = head rel;
44 rev = last (splitString "-" (last rel));
45 in "${date}-${rev}";
46
47 nativeBuildInputs = oa.nativeBuildInputs ++ [
48 pkgs.gnum4
49 ];
50
51 # Upstream rockspec is pointlessly broken into separate rockspecs, per Lua
52 # version, which doesn't work well for us, so modify it
53 postConfigure = let inherit (prev.cqueues) pname; in ''
54 # 'all' target auto-detects correct Lua version, which is fine for us as
55 # we only have the right one available :)
56 sed -Ei ''${rockspecFilename} \
57 -e 's|lua == 5.[[:digit:]]|lua >= 5.1, <= 5.3|' \
58 -e 's|build_target = "[^"]+"|build_target = "all"|' \
59 -e 's|version = "[^"]+"|version = "${version}"|'
60 specDir=$(dirname ''${rockspecFilename})
61 cp ''${rockspecFilename} "$specDir/${pname}-${version}.rockspec"
62 rockspecFilename="$specDir/${pname}-${version}.rockspec"
63 '';
64 });
65
66 cyrussasl = prev.lib.overrideLuarocks prev.cyrussasl (drv: {
67 externalDeps = [
68 { name = "LIBSASL"; dep = pkgs.cyrus_sasl; }
69 ];
70 });
71
72 http = prev.http.overrideAttrs(oa: {
73 patches = [
74 (pkgs.fetchpatch {
75 name = "invalid-state-progression.patch";
76 url = "https://github.com/daurnimator/lua-http/commit/cb7b59474a.diff";
77 sha256 = "1vmx039n3nqfx50faqhs3wgiw28ws416rhw6vh6srmh9i826dac7";
78 })
79 ];
80 /* TODO: separate docs derivation? (pandoc is heavy)
81 nativeBuildInputs = [ pandoc ];
82 makeFlags = [ "-C doc" "lua-http.html" "lua-http.3" ];
83 */
84 });
85
86 ldbus = prev.lib.overrideLuarocks prev.ldbus (drv: {
87 extraVariables = {
88 DBUS_DIR="${pkgs.dbus.lib}";
89 DBUS_ARCH_INCDIR="${pkgs.dbus.lib}/lib/dbus-1.0/include";
90 DBUS_INCDIR="${pkgs.dbus.dev}/include/dbus-1.0";
91 };
92 buildInputs = with pkgs; [
93 dbus
94 ];
95 });
96
97 ljsyscall = prev.lib.overrideLuarocks prev.ljsyscall (drv: rec {
98 version = "unstable-20180515";
99 # package hasn't seen any release for a long time
100 src = pkgs.fetchFromGitHub {
101 owner = "justincormack";
102 repo = "ljsyscall";
103 rev = "e587f8c55aad3955dddab3a4fa6c1968037b5c6e";
104 sha256 = "06v52agqyziwnbp2my3r7liv245ddmb217zmyqakh0ldjdsr8lz4";
105 };
106 knownRockspec = "rockspec/ljsyscall-scm-1.rockspec";
107 # actually library works fine with lua 5.2
108 preConfigure = ''
109 sed -i 's/lua == 5.1/lua >= 5.1, < 5.3/' ${knownRockspec}
110 '';
111 disabled = luaOlder "5.1" || luaAtLeast "5.3";
112
113 propagatedBuildInputs = with pkgs.lib; optional (!isLuaJIT) luaffi;
114 });
115
116 lgi = prev.lgi.overrideAttrs (oa: {
117 nativeBuildInputs = oa.nativeBuildInputs ++ [
118 pkgs.pkg-config
119 ];
120 buildInputs = [
121 pkgs.glib
122 pkgs.gobject-introspection
123 ];
124 patches = [
125 (pkgs.fetchpatch {
126 name = "lgi-find-cairo-through-typelib.patch";
127 url = "https://github.com/psychon/lgi/commit/46a163d9925e7877faf8a4f73996a20d7cf9202a.patch";
128 sha256 = "0gfvvbri9kyzhvq3bvdbj2l6mwvlz040dk4mrd5m9gz79f7w109c";
129 })
130 ];
131
132 # there is only a rockspec.in in the repo, the actual rockspec must be generated
133 preConfigure = ''
134 make rock
135 '';
136 });
137
138 lmathx = prev.lib.overrideLuarocks prev.lmathx (drv:
139 if luaAtLeast "5.1" && luaOlder "5.2" then {
140 version = "20120430.51-1";
141 knownRockspec = (pkgs.fetchurl {
142 url = "https://luarocks.org/lmathx-20120430.51-1.rockspec";
143 sha256 = "148vbv2g3z5si2db7rqg5bdily7m4sjyh9w6r3jnx3csvfaxyhp0";
144 }).outPath;
145 src = pkgs.fetchurl {
146 url = "https://web.tecgraf.puc-rio.br/~lhf/ftp/lua/5.1/lmathx.tar.gz";
147 sha256 = "0sa553d0zlxhvpsmr4r7d841f16yq4wr3fg7i07ibxkz6yzxax51";
148 };
149 } else
150 if luaAtLeast "5.2" && luaOlder "5.3" then {
151 version = "20120430.52-1";
152 knownRockspec = (pkgs.fetchurl {
153 url = "https://luarocks.org/lmathx-20120430.52-1.rockspec";
154 sha256 = "14rd625sipakm72wg6xqsbbglaxyjba9nsajsfyvhg0sz8qjgdya";
155 }).outPath;
156 src = pkgs.fetchurl {
157 url = "http://www.tecgraf.puc-rio.br/~lhf/ftp/lua/5.2/lmathx.tar.gz";
158 sha256 = "19dwa4z266l2njgi6fbq9rak4rmx2fsx1s0p9sl166ar3mnrdwz5";
159 };
160 } else
161 {
162 disabled = luaOlder "5.1" || luaAtLeast "5.5";
163 # works fine with 5.4 as well
164 postConfigure = ''
165 substituteInPlace ''${rockspecFilename} \
166 --replace 'lua ~> 5.3' 'lua >= 5.3, < 5.5'
167 '';
168 });
169
170 lmpfrlib = prev.lib.overrideLuarocks prev.lmpfrlib (drv: {
171 externalDeps = [
172 { name = "GMP"; dep = pkgs.gmp; }
173 { name = "MPFR"; dep = pkgs.mpfr; }
174 ];
175 unpackPhase = ''
176 cp $src $(stripHash $src)
177 '';
178 });
179
180 lrexlib-gnu = prev.lib.overrideLuarocks prev.lrexlib-gnu (drv: {
181 buildInputs = [
182 pkgs.gnulib
183 ];
184 });
185
186 lrexlib-pcre = prev.lib.overrideLuarocks prev.lrexlib-pcre (drv: {
187 externalDeps = [
188 { name = "PCRE"; dep = pkgs.pcre; }
189 ];
190 });
191
192 lrexlib-posix = prev.lib.overrideLuarocks prev.lrexlib-posix (drv: {
193 buildInputs = [
194 pkgs.glibc.dev
195 ];
196 });
197
198 lua-iconv = prev.lib.overrideLuarocks prev.lua-iconv (drv: {
199 buildInputs = [
200 pkgs.libiconv
201 ];
202 });
203
204 lua-lsp = prev.lua-lsp.overrideAttrs(oa: {
205 # until Alloyed/lua-lsp#28
206 postConfigure = ''
207 substituteInPlace ''${rockspecFilename} \
208 --replace '"dkjson ~> 2.5",' '"dkjson >= 2.5",'
209 '';
210 });
211
212 lua-zlib = prev.lib.overrideLuarocks prev.lua-zlib (drv: {
213 buildInputs = [
214 pkgs.zlib.dev
215 ];
216 disabled = luaOlder "5.1" || luaAtLeast "5.4";
217 });
218
219 luadbi-mysql = prev.lib.overrideLuarocks prev.luadbi-mysql (drv: {
220 extraVariables = {
221 # Can't just be /include and /lib, unfortunately needs the trailing 'mysql'
222 MYSQL_INCDIR="${pkgs.libmysqlclient.dev}/include/mysql";
223 MYSQL_LIBDIR="${pkgs.libmysqlclient}/lib/mysql";
224 };
225 buildInputs = [
226 pkgs.mariadb.client
227 pkgs.libmysqlclient
228 ];
229 });
230
231 luadbi-postgresql = prev.lib.overrideLuarocks prev.luadbi-postgresql (drv: {
232 buildInputs = [
233 pkgs.postgresql
234 ];
235 });
236
237 luadbi-sqlite3 = prev.lib.overrideLuarocks prev.luadbi-sqlite3 (drv: {
238 externalDeps = [
239 { name = "SQLITE"; dep = pkgs.sqlite; }
240 ];
241 });
242
243 luaevent = prev.lib.overrideLuarocks prev.luaevent (drv: {
244 propagatedBuildInputs = [
245 luasocket
246 ];
247 externalDeps = [
248 { name = "EVENT"; dep = pkgs.libevent; }
249 ];
250 disabled = luaOlder "5.1" || luaAtLeast "5.4";
251 });
252
253 luaexpat = prev.lib.overrideLuarocks prev.luaexpat (drv: {
254 externalDeps = [
255 { name = "EXPAT"; dep = pkgs.expat; }
256 ];
257 });
258
259 # TODO Somehow automatically amend buildInputs for things that need luaffi
260 # but are in luajitPackages?
261 luaffi = prev.lib.overrideLuarocks prev.luaffi (drv: {
262 # The packaged .src.rock version is pretty old, and doesn't work with Lua 5.3
263 src = pkgs.fetchFromGitHub {
264 owner = "facebook"; repo = "luaffifb";
265 rev = "532c757e51c86f546a85730b71c9fef15ffa633d";
266 sha256 = "1nwx6sh56zfq99rcs7sph0296jf6a9z72mxknn0ysw9fd7m1r8ig";
267 };
268 knownRockspec = with prev.luaffi; "${pname}-${version}.rockspec";
269 disabled = luaOlder "5.1" || luaAtLeast "5.4" || isLuaJIT;
270 });
271
272 luaossl = prev.lib.overrideLuarocks prev.luaossl (drv: {
273 externalDeps = [
274 { name = "CRYPTO"; dep = pkgs.openssl; }
275 { name = "OPENSSL"; dep = pkgs.openssl; }
276 ];
277 });
278
279 luasec = prev.lib.overrideLuarocks prev.luasec (drv: {
280 externalDeps = [
281 { name = "OPENSSL"; dep = pkgs.openssl; }
282 ];
283 });
284
285 luasql-sqlite3 = prev.lib.overrideLuarocks prev.luasql-sqlite3 (drv: {
286 externalDeps = [
287 { name = "SQLITE"; dep = pkgs.sqlite; }
288 ];
289 });
290
291 luasystem = prev.lib.overrideLuarocks prev.luasystem (drv: pkgs.lib.optionalAttrs pkgs.stdenv.isLinux {
292 buildInputs = [ pkgs.glibc.out ];
293 });
294
295 luazip = prev.lib.overrideLuarocks prev.luazip (drv: {
296 buildInputs = [
297 pkgs.zziplib
298 ];
299 });
300
301 lua-yajl = prev.lib.overrideLuarocks prev.lua-yajl (drv: {
302 buildInputs = [
303 pkgs.yajl
304 ];
305 });
306
307 luaunbound = prev.lib.overrideLuarocks prev.luaunbound(drv: {
308 externalDeps = [
309 { name = "libunbound"; dep = pkgs.unbound; }
310 ];
311 });
312
313 luuid = (prev.lib.overrideLuarocks prev.luuid (drv: {
314 externalDeps = [
315 { name = "LIBUUID"; dep = pkgs.libuuid; }
316 ];
317 disabled = luaOlder "5.1" || (luaAtLeast "5.4");
318 })).overrideAttrs(oa: {
319 meta = oa.meta // {
320 platforms = pkgs.lib.platforms.linux;
321 };
322 # Trivial patch to make it work in both 5.1 and 5.2. Basically just the
323 # tiny diff between the two upstream versions placed behind an #if.
324 # Upstreams:
325 # 5.1: http://webserver2.tecgraf.puc-rio.br/~lhf/ftp/lua/5.1/luuid.tar.gz
326 # 5.2: http://webserver2.tecgraf.puc-rio.br/~lhf/ftp/lua/5.2/luuid.tar.gz
327 patchFlags = [ "-p2" ];
328 patches = [
329 ./luuid.patch
330 ];
331 postConfigure = let inherit (prev.luuid) version pname; in ''
332 sed -Ei ''${rockspecFilename} -e 's|lua >= 5.2|lua >= 5.1,|'
333 '';
334 });
335
336
337 # as advised in https://github.com/luarocks/luarocks/issues/1402#issuecomment-1080616570
338 # we shouldn't use luarocks machinery to build complex cmake components
339 libluv = pkgs.stdenv.mkDerivation {
340
341 pname = "libluv";
342 inherit (prev.luv) version meta src;
343
344 cmakeFlags = [
345 "-DBUILD_SHARED_LIBS=ON"
346 "-DBUILD_MODULE=OFF"
347 "-DWITH_SHARED_LIBUV=ON"
348 "-DLUA_BUILD_TYPE=System"
349 "-DWITH_LUA_ENGINE=${if isLuaJIT then "LuaJit" else "Lua"}"
350 ];
351
352 # to make sure we dont use bundled deps
353 postUnpack = ''
354 rm -rf deps/lua deps/libuv
355 '';
356
357 buildInputs = [ pkgs.libuv final.lua ];
358
359 nativeBuildInputs = [ pkgs.pkg-config pkgs.cmake ]
360 ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.fixDarwinDylibNames ];
361 };
362
363 luv = prev.lib.overrideLuarocks prev.luv (drv: {
364
365 buildInputs = [ pkgs.pkg-config pkgs.libuv ];
366
367 # Use system libuv instead of building local and statically linking
368 extraVariables = {
369 "WITH_SHARED_LIBUV" = "ON";
370 };
371
372 # we unset the LUA_PATH since the hook erases the interpreter defaults (To fix)
373 # tests is not run since they are not part of the tarball anymore
374 preCheck = ''
375 unset LUA_PATH
376 rm tests/test-{dns,thread}.lua
377 '';
378
379 passthru.libluv = final.libluv;
380
381 });
382
383 lyaml = prev.lib.overrideLuarocks prev.lyaml (oa: {
384 buildInputs = [
385 pkgs.libyaml
386 ];
387 });
388
389 mpack = prev.lib.overrideLuarocks prev.mpack (drv: {
390 buildInputs = [ pkgs.libmpack ];
391 # the rockspec doesn't use the makefile so you may need to export more flags
392 USE_SYSTEM_LUA = "yes";
393 USE_SYSTEM_MPACK = "yes";
394 });
395
396 rapidjson = prev.rapidjson.overrideAttrs(oa: {
397 preBuild = ''
398 sed -i '/set(CMAKE_CXX_FLAGS/d' CMakeLists.txt
399 sed -i '/set(CMAKE_C_FLAGS/d' CMakeLists.txt
400 '';
401 });
402
403 readline = (prev.lib.overrideLuarocks prev.readline (drv: {
404 unpackCmd = ''
405 unzip "$curSrc"
406 tar xf *.tar.gz
407 '';
408 propagatedBuildInputs = prev.readline.propagatedBuildInputs ++ [ pkgs.readline.out ];
409 extraVariables = rec {
410 READLINE_INCDIR = "${pkgs.readline.dev}/include";
411 HISTORY_INCDIR = READLINE_INCDIR;
412 };
413 })).overrideAttrs (old: {
414 # Without this, source root is wrongly set to ./readline-2.6/doc
415 setSourceRoot = ''
416 sourceRoot=./readline-${pkgs.lib.versions.majorMinor old.version}
417 '';
418 });
419
420 sqlite = prev.lib.overrideLuarocks prev.sqlite (drv: {
421
422 doCheck = true;
423 checkInputs = [ final.plenary-nvim pkgs.neovim-unwrapped ];
424
425 # we override 'luarocks test' because otherwise neovim doesn't find/load the plenary plugin
426 checkPhase = ''
427 export LIBSQLITE="${pkgs.sqlite.out}/lib/libsqlite3.so"
428 export HOME="$TMPDIR";
429
430 nvim --headless -i NONE \
431 -u test/minimal_init.vim --cmd "set rtp+=${pkgs.vimPlugins.plenary-nvim}" \
432 -c "PlenaryBustedDirectory test/auto/ { minimal_init = './test/minimal_init.vim' }"
433 '';
434
435 });
436
437 std-_debug = prev.std-_debug.overrideAttrs(oa: {
438 # run make to generate lib/std/_debug/version.lua
439 preConfigure = ''
440 make all
441 '';
442 });
443
444 std-normalize = prev.std-normalize.overrideAttrs(oa: {
445 # run make to generate lib/std/_debug/version.lua
446 preConfigure = ''
447 make all
448 '';
449 });
450
451 # TODO just while testing, remove afterwards
452 # toVimPlugin should do it instead
453 gitsigns-nvim = prev.gitsigns-nvim.overrideAttrs(oa: {
454 nativeBuildInputs = oa.nativeBuildInputs or [] ++ [ pkgs.vimUtils.vimGenDocHook ];
455 });
456
457 # aliases
458 cjson = prev.lua-cjson;
459}