lol
1{ lib
2, stdenv
3, fetchFromGitHub
4, buildPackages
5, version
6, src
7, extraMeta ? { }
8, callPackage
9, self
10, packageOverrides ? (final: prev: {})
11, pkgsBuildBuild
12, pkgsBuildHost
13, pkgsBuildTarget
14, pkgsHostHost
15, pkgsTargetTarget
16, passthruFun
17, enableFFI ? true
18, enableJIT ? true
19, enableJITDebugModule ? enableJIT
20, enableGC64 ? true
21, enable52Compat ? false
22, enableValgrindSupport ? false
23, valgrind ? null
24, enableGDBJITSupport ? false
25, enableAPICheck ? false
26, enableVMAssertions ? false
27, enableRegisterAllocationRandomization ? false
28, useSystemMalloc ? false
29# Upstream generates randomized string id's by default for security reasons
30# https://github.com/LuaJIT/LuaJIT/issues/626. Deterministic string id's should
31# never be needed for correctness (that should be fixed in the lua code),
32# but may be helpful when you want to embed jit-compiled raw lua blobs in
33# binaries that you want to be reproducible.
34, deterministicStringIds ? false
35, luaAttr ? "luajit_${lib.versions.major version}_${lib.versions.minor version}"
36} @ inputs:
37assert enableJITDebugModule -> enableJIT;
38assert enableGDBJITSupport -> enableJIT;
39assert enableValgrindSupport -> valgrind != null;
40let
41
42 luaPackages = self.pkgs;
43
44 XCFLAGS = with lib;
45 optional (!enableFFI) "-DLUAJIT_DISABLE_FFI"
46 ++ optional (!enableJIT) "-DLUAJIT_DISABLE_JIT"
47 ++ optional enable52Compat "-DLUAJIT_ENABLE_LUA52COMPAT"
48 ++ optional (!enableGC64) "-DLUAJIT_DISABLE_GC64"
49 ++ optional useSystemMalloc "-DLUAJIT_USE_SYSMALLOC"
50 ++ optional enableValgrindSupport "-DLUAJIT_USE_VALGRIND"
51 ++ optional enableGDBJITSupport "-DLUAJIT_USE_GDBJIT"
52 ++ optional enableAPICheck "-DLUAJIT_USE_APICHECK"
53 ++ optional enableVMAssertions "-DLUAJIT_USE_ASSERT"
54 ++ optional enableRegisterAllocationRandomization "-DLUAJIT_RANDOM_RA"
55 ++ optional deterministicStringIds "-DLUAJIT_SECURITY_STRID=0"
56 ;
57
58 # LuaJIT requires build for 32bit architectures to be build on x86 not x86_64
59 # TODO support also other build architectures. The ideal way would be to use
60 # stdenv_32bit but that doesn't work due to host platform mismatch:
61 # https://github.com/NixOS/nixpkgs/issues/212494
62 buildStdenv = if buildPackages.stdenv.isx86_64 && stdenv.is32bit
63 then buildPackages.pkgsi686Linux.buildPackages.stdenv
64 else buildPackages.stdenv;
65
66in
67stdenv.mkDerivation rec {
68 pname = "luajit";
69 inherit version src;
70
71 luaversion = "5.1";
72
73 postPatch = ''
74 substituteInPlace Makefile --replace ldconfig :
75 if test -n "''${dontStrip-}"; then
76 # CCDEBUG must be non-empty or everything will be stripped, -g being
77 # passed by nixpkgs CC wrapper is insufficient on its own
78 substituteInPlace src/Makefile --replace "#CCDEBUG= -g" "CCDEBUG= -g"
79 fi
80
81 {
82 echo -e '
83 #undef LUA_PATH_DEFAULT
84 #define LUA_PATH_DEFAULT "./share/lua/${luaversion}/?.lua;./?.lua;./?/init.lua"
85 #undef LUA_CPATH_DEFAULT
86 #define LUA_CPATH_DEFAULT "./lib/lua/${luaversion}/?.so;./?.so;./lib/lua/${luaversion}/loadall.so"
87 '
88 } >> src/luaconf.h
89 '';
90
91 dontConfigure = true;
92
93 buildInputs = lib.optional enableValgrindSupport valgrind;
94
95 buildFlags = [
96 "amalg" # Build highly optimized version
97 ];
98 makeFlags = [
99 "PREFIX=$(out)"
100 "DEFAULT_CC=cc"
101 "CROSS=${stdenv.cc.targetPrefix}"
102 "HOST_CC=${buildStdenv.cc}/bin/cc"
103 ] ++ lib.optional enableJITDebugModule "INSTALL_LJLIBD=$(INSTALL_LMOD)"
104 ++ lib.optional stdenv.hostPlatform.isStatic "BUILDMODE=static";
105 enableParallelBuilding = true;
106 env.NIX_CFLAGS_COMPILE = toString XCFLAGS;
107
108 postInstall = ''
109 ( cd "$out/include"; ln -s luajit-*/* . )
110 ln -s "$out"/bin/luajit-* "$out"/bin/lua
111 if [[ ! -e "$out"/bin/luajit ]]; then
112 ln -s "$out"/bin/luajit* "$out"/bin/luajit
113 fi
114 '';
115
116 LuaPathSearchPaths = luaPackages.luaLib.luaPathList;
117 LuaCPathSearchPaths = luaPackages.luaLib.luaCPathList;
118
119 setupHook = luaPackages.lua-setup-hook luaPackages.luaLib.luaPathList luaPackages.luaLib.luaCPathList;
120
121 # copied from python
122 passthru = let
123 # When we override the interpreter we also need to override the spliced versions of the interpreter
124 inputs' = lib.filterAttrs (n: v: ! lib.isDerivation v && n != "passthruFun") inputs;
125 override = attr: let lua = attr.override (inputs' // { self = lua; }); in lua;
126 in passthruFun rec {
127 inherit self luaversion packageOverrides luaAttr;
128 executable = "lua";
129 luaOnBuildForBuild = override pkgsBuildBuild.${luaAttr};
130 luaOnBuildForHost = override pkgsBuildHost.${luaAttr};
131 luaOnBuildForTarget = override pkgsBuildTarget.${luaAttr};
132 luaOnHostForHost = override pkgsHostHost.${luaAttr};
133 luaOnTargetForTarget = lib.optionalAttrs (lib.hasAttr luaAttr pkgsTargetTarget) (override pkgsTargetTarget.${luaAttr});
134 };
135
136 meta = with lib; {
137 description = "High-performance JIT compiler for Lua 5.1";
138 homepage = "https://luajit.org/";
139 license = licenses.mit;
140 platforms = platforms.linux ++ platforms.darwin;
141 badPlatforms = [
142 "riscv64-linux" "riscv64-linux" # See https://github.com/LuaJIT/LuaJIT/issues/628
143 "powerpc64le-linux" # `#error "No support for PPC64"`
144 ];
145 maintainers = with maintainers; [ thoughtpolice smironov vcunat lblasc ];
146 } // extraMeta;
147}