lol
at 23.11-beta 147 lines 5.3 kB view raw
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}