2023-09-12 17:45:18 +01:00
{
2024-06-30 16:58:29 +01:00
lua ,
lib ,
fennel ,
stdenv ,
2023-09-12 17:45:18 +01:00
}:
2024-06-30 16:58:29 +01:00
name :
2023-09-12 17:45:18 +01:00
{
2024-06-30 16:58:29 +01:00
packages ? [ ] ,
2024-08-24 23:19:46 +01:00
macros ? [ ] ,
2023-09-12 17:45:18 +01:00
correlate ? false ,
2024-06-30 16:58:29 +01:00
mainFunction ? null ,
}:
source :
let
2024-09-07 22:31:44 +01:00
inherit ( builtins ) concatStringsSep replaceStrings map ;
2024-08-24 23:19:46 +01:00
luapath = map (
2024-06-30 16:58:29 +01:00
f : " ${ f } /share/lua/ ${ lua . luaversion } /?.lua;" + " ${ f } /share/lua/ ${ lua . luaversion } /?/init.lua;"
) packages ;
2024-08-24 23:19:46 +01:00
luacpath = map ( f : " ${ f } /lib/lua/ ${ lua . luaversion } /?.so;" ) packages ;
2025-02-10 21:55:08 +00:00
macropath = concatStringsSep ";" ( map ( f : " ${ f } /share/lua/ ${ lua . luaversion } /?.fnl" ) macros );
2024-06-30 16:58:29 +01:00
luaFlags = lib . optionalString ( mainFunction != null ) "-e dofile(arg[0]). ${ mainFunction } ()" ;
2025-02-10 21:55:08 +00:00
quoteString = string : "' ${ replaceStrings [ "'" ] [ "' \\ ''" ] string } '" ;
2024-06-30 16:58:29 +01:00
in
stdenv . mkDerivation {
inherit name ;
src = ./. ;
nativeBuildInputs = [ fennel ];
buildPhase = ''
(
echo "#! ${ lua } /bin/lua ${ luaFlags } "
2024-09-07 22:31:44 +01:00
echo "package.path = ${ quoteString ( concatStringsSep "" luapath ) } .. package.path"
echo "package.cpath = ${ quoteString ( concatStringsSep "" luacpath ) } .. package.cpath"
echo "local ok, stdlib = pcall(require,'posix.stdlib'); if ok then stdlib.setenv('PATH', ${ quoteString ( lib . makeBinPath packages ) } .. \":\" .. os.getenv('PATH')) end"
echo "local ok, ll = pcall(require,'lualinux'); if ok then ll.setenv('PATH', ${ quoteString ( lib . makeBinPath packages ) } .. \":\" .. os.getenv('PATH')) end"
2025-02-10 21:55:08 +00:00
fennel ${ if macropath != "" then "--add-macro-path ${ quoteString macropath } " else "" } ${
if correlate then "--correlate" else ""
} --compile ${ source }
2024-06-30 16:58:29 +01:00
) > ${ name } .lua
2024-08-24 23:19:46 +01:00
2024-06-30 16:58:29 +01:00
'' ;
installPhase = ''
cp ${ name } .lua $out
chmod +x $out
'' ;
}