171 lines
5.5 KiB
Nix
171 lines
5.5 KiB
Nix
{
|
|
lib,
|
|
stdenv,
|
|
buildPackages,
|
|
version,
|
|
src,
|
|
substituteAll,
|
|
extraMeta ? { },
|
|
self,
|
|
packageOverrides ? (final: prev: { }),
|
|
pkgsBuildBuild,
|
|
pkgsBuildHost,
|
|
pkgsBuildTarget,
|
|
pkgsHostHost,
|
|
pkgsTargetTarget,
|
|
passthruFun,
|
|
enableFFI ? true,
|
|
enableJIT ? true,
|
|
enableJITDebugModule ? enableJIT,
|
|
enableGC64 ? true,
|
|
enable52Compat ? false,
|
|
enableValgrindSupport ? false,
|
|
valgrind ? null,
|
|
enableGDBJITSupport ? false,
|
|
enableAPICheck ? false,
|
|
enableVMAssertions ? false,
|
|
enableRegisterAllocationRandomization ? false,
|
|
useSystemMalloc ? false,
|
|
# Upstream generates randomized string id's by default for security reasons
|
|
# https://github.com/LuaJIT/LuaJIT/issues/626. Deterministic string id's should
|
|
# never be needed for correctness (that should be fixed in the lua code),
|
|
# but may be helpful when you want to embed jit-compiled raw lua blobs in
|
|
# binaries that you want to be reproducible.
|
|
deterministicStringIds ? false,
|
|
luaAttr ? "luajit_${lib.versions.major version}_${lib.versions.minor version}",
|
|
}@inputs:
|
|
assert enableJITDebugModule -> enableJIT;
|
|
assert enableGDBJITSupport -> enableJIT;
|
|
assert enableValgrindSupport -> valgrind != null;
|
|
let
|
|
|
|
luaPackages = self.pkgs;
|
|
|
|
XCFLAGS =
|
|
lib.optional (!enableFFI) "-DLUAJIT_DISABLE_FFI"
|
|
++ lib.optional (!enableJIT) "-DLUAJIT_DISABLE_JIT"
|
|
++ lib.optional enable52Compat "-DLUAJIT_ENABLE_LUA52COMPAT"
|
|
++ lib.optional (!enableGC64) "-DLUAJIT_DISABLE_GC64"
|
|
++ lib.optional useSystemMalloc "-DLUAJIT_USE_SYSMALLOC"
|
|
++ lib.optional enableValgrindSupport "-DLUAJIT_USE_VALGRIND"
|
|
++ lib.optional enableGDBJITSupport "-DLUAJIT_USE_GDBJIT"
|
|
++ lib.optional enableAPICheck "-DLUAJIT_USE_APICHECK"
|
|
++ lib.optional enableVMAssertions "-DLUAJIT_USE_ASSERT"
|
|
++ lib.optional enableRegisterAllocationRandomization "-DLUAJIT_RANDOM_RA"
|
|
++ lib.optional deterministicStringIds "-DLUAJIT_SECURITY_STRID=0";
|
|
|
|
# LuaJIT requires build for 32bit architectures to be build on x86 not x86_64
|
|
# TODO support also other build architectures. The ideal way would be to use
|
|
# stdenv_32bit but that doesn't work due to host platform mismatch:
|
|
# https://github.com/NixOS/nixpkgs/issues/212494
|
|
buildStdenv =
|
|
if buildPackages.stdenv.hostPlatform.isx86_64 && stdenv.hostPlatform.is32bit then
|
|
buildPackages.pkgsi686Linux.buildPackages.stdenv
|
|
else
|
|
buildPackages.stdenv;
|
|
|
|
in
|
|
stdenv.mkDerivation (finalAttrs: {
|
|
pname = "luajit";
|
|
inherit version src;
|
|
|
|
luaversion = "5.1";
|
|
|
|
postPatch = ''
|
|
substituteInPlace Makefile --replace ldconfig :
|
|
if test -n "''${dontStrip-}"; then
|
|
# CCDEBUG must be non-empty or everything will be stripped, -g being
|
|
# passed by nixpkgs CC wrapper is insufficient on its own
|
|
substituteInPlace src/Makefile --replace-fail "#CCDEBUG= -g" "CCDEBUG= -g"
|
|
fi
|
|
'';
|
|
|
|
dontConfigure = true;
|
|
|
|
buildInputs = lib.optional enableValgrindSupport valgrind;
|
|
|
|
buildFlags = [
|
|
"amalg" # Build highly optimized version
|
|
];
|
|
makeFlags =
|
|
[
|
|
"PREFIX=$(out)"
|
|
"DEFAULT_CC=cc"
|
|
"CROSS=${stdenv.cc.targetPrefix}"
|
|
"HOST_CC=${buildStdenv.cc}/bin/cc"
|
|
]
|
|
++ lib.optional enableJITDebugModule "INSTALL_LJLIBD=$(INSTALL_LMOD)"
|
|
++ lib.optional stdenv.hostPlatform.isStatic "BUILDMODE=static";
|
|
enableParallelBuilding = true;
|
|
env.NIX_CFLAGS_COMPILE = toString XCFLAGS;
|
|
|
|
postInstall = ''
|
|
mkdir -p $out/nix-support
|
|
cp ${
|
|
substituteAll {
|
|
src = ../lua-5/utils.sh;
|
|
luapathsearchpaths = lib.escapeShellArgs finalAttrs.LuaPathSearchPaths;
|
|
luacpathsearchpaths = lib.escapeShellArgs finalAttrs.LuaCPathSearchPaths;
|
|
}
|
|
} $out/nix-support/utils.sh
|
|
( cd "$out/include"; ln -s luajit-*/* . )
|
|
ln -s "$out"/bin/luajit-* "$out"/bin/lua
|
|
if [[ ! -e "$out"/bin/luajit ]]; then
|
|
ln -s "$out"/bin/luajit* "$out"/bin/luajit
|
|
fi
|
|
'';
|
|
|
|
LuaPathSearchPaths = luaPackages.luaLib.luaPathList;
|
|
LuaCPathSearchPaths = luaPackages.luaLib.luaCPathList;
|
|
|
|
setupHook = builtins.toFile "lua-setup-hook" ''
|
|
source @out@/nix-support/utils.sh
|
|
addEnvHooks "$hostOffset" luaEnvHook
|
|
'';
|
|
|
|
# copied from python
|
|
passthru =
|
|
let
|
|
# When we override the interpreter we also need to override the spliced versions of the interpreter
|
|
inputs' = lib.filterAttrs (n: v: !lib.isDerivation v && n != "passthruFun") inputs;
|
|
override =
|
|
attr:
|
|
let
|
|
lua = attr.override (inputs' // { self = lua; });
|
|
in
|
|
lua;
|
|
in
|
|
passthruFun rec {
|
|
inherit self packageOverrides luaAttr;
|
|
inherit (finalAttrs) luaversion;
|
|
executable = "lua";
|
|
luaOnBuildForBuild = override pkgsBuildBuild.${luaAttr};
|
|
luaOnBuildForHost = override pkgsBuildHost.${luaAttr};
|
|
luaOnBuildForTarget = override pkgsBuildTarget.${luaAttr};
|
|
luaOnHostForHost = override pkgsHostHost.${luaAttr};
|
|
luaOnTargetForTarget = lib.optionalAttrs (lib.hasAttr luaAttr pkgsTargetTarget) (
|
|
override pkgsTargetTarget.${luaAttr}
|
|
);
|
|
};
|
|
|
|
meta =
|
|
with lib;
|
|
{
|
|
description = "High-performance JIT compiler for Lua 5.1";
|
|
homepage = "https://luajit.org/";
|
|
license = licenses.mit;
|
|
platforms = platforms.linux ++ platforms.darwin;
|
|
badPlatforms = [
|
|
"riscv64-linux"
|
|
"riscv64-linux" # See https://github.com/LuaJIT/LuaJIT/issues/628
|
|
"powerpc64le-linux" # `#error "No support for PPC64"`
|
|
];
|
|
maintainers = with maintainers; [
|
|
thoughtpolice
|
|
smironov
|
|
vcunat
|
|
lblasc
|
|
];
|
|
}
|
|
// extraMeta;
|
|
})
|