Merge pull request #286822 from teto/lua-interpreters-fusion
luajit: adjust defaults LUA_(C)PATH
This commit is contained in:
commit
0c20124901
8 changed files with 67 additions and 56 deletions
|
@ -17,6 +17,9 @@ The main package set contains aliases to these package sets, e.g.
|
|||
`luaPackages` refers to `lua5_1.pkgs` and `lua52Packages` to
|
||||
`lua5_2.pkgs`.
|
||||
|
||||
Note that nixpkgs patches the non-luajit interpreters to avoid referring to
|
||||
`/usr` and have `;;` (a [placeholder](https://www.lua.org/manual/5.1/manual.html#pdf-package.path) replaced with the default LUA_PATH) work correctly.
|
||||
|
||||
### Installing Lua and packages {#installing-lua-and-packages}
|
||||
|
||||
#### Lua environment defined in separate `.nix` file {#lua-environment-defined-in-separate-.nix-file}
|
||||
|
|
|
@ -58,6 +58,9 @@ In addition to numerous new and upgraded packages, this release has the followin
|
|||
}
|
||||
```
|
||||
|
||||
- lua interpreters default LUA_PATH and LUA_CPATH are not overriden by nixpkgs
|
||||
anymore, we patch LUA_ROOT instead which is more respectful to upstream.
|
||||
|
||||
- Plasma 6 is now available and can be installed with `services.xserver.desktopManager.plasma6.enable = true;`. Plasma 5 will likely be deprecated in the next release (24.11). Note that Plasma 6 runs as Wayland by default, and the X11 session needs to be explicitly selected if necessary.
|
||||
|
||||
## New Services {#sec-release-24.05-new-services}
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
let
|
||||
callPackage = lua.pkgs.callPackage;
|
||||
luaInterpreter = lua.interpreter;
|
||||
in {
|
||||
|
||||
lua-setup-hook = LuaPathSearchPaths: LuaCPathSearchPaths:
|
||||
|
|
|
@ -13,11 +13,6 @@ nix_debug() {
|
|||
addToLuaSearchPathWithCustomDelimiter() {
|
||||
local varName="$1"
|
||||
local absPattern="$2"
|
||||
# delete longest match starting from the lua placeholder '?'
|
||||
local topDir="${absPattern%%\?*}"
|
||||
|
||||
# export only if the folder exists else LUA_PATH/LUA_CPATH grow too large
|
||||
if [[ ! -d "$topDir" ]]; then return; fi
|
||||
|
||||
# export only if we haven't already got this dir in the search path
|
||||
if [[ ${!varName-} == *"$absPattern"* ]]; then return; fi
|
||||
|
@ -27,7 +22,15 @@ addToLuaSearchPathWithCustomDelimiter() {
|
|||
# allowing relative modules to be used even when there are system modules.
|
||||
if [[ ! -v "${varName}" ]]; then export "${varName}=;;"; fi
|
||||
|
||||
export "${varName}=${!varName:+${!varName};}${absPattern}"
|
||||
# export only if the folder contains lua files
|
||||
shopt -s globstar
|
||||
|
||||
for _file in ${absPattern/\?/\*\*}; do
|
||||
export "${varName}=${!varName:+${!varName};}${absPattern}"
|
||||
shopt -u globstar
|
||||
return;
|
||||
done
|
||||
shopt -u globstar
|
||||
}
|
||||
|
||||
addToLuaPath() {
|
||||
|
|
|
@ -22,7 +22,7 @@ stdenv.mkDerivation (finalAttrs:
|
|||
let
|
||||
luaPackages = self.pkgs;
|
||||
|
||||
luaversion = lib.versions.majorMinor version;
|
||||
luaversion = lib.versions.majorMinor finalAttrs.version;
|
||||
|
||||
plat = if (stdenv.isLinux && lib.versionOlder self.luaversion "5.4") then "linux"
|
||||
else if (stdenv.isLinux && lib.versionAtLeast self.luaversion "5.4") then "linux-readline"
|
||||
|
@ -45,7 +45,7 @@ stdenv.mkDerivation (finalAttrs:
|
|||
outputs = [ "out" "doc" ];
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://www.lua.org/ftp/${finalAttrs.pname}-${finalAttrs.version}.tar.gz";
|
||||
url = "https://www.lua.org/ftp/lua-${finalAttrs.version}.tar.gz";
|
||||
sha256 = hash;
|
||||
};
|
||||
|
||||
|
@ -60,16 +60,11 @@ stdenv.mkDerivation (finalAttrs:
|
|||
|
||||
inherit patches;
|
||||
|
||||
# we can't pass flags to the lua makefile because for portability, everything is hardcoded
|
||||
postPatch = ''
|
||||
{
|
||||
echo -e '
|
||||
#undef LUA_PATH_DEFAULT
|
||||
#define LUA_PATH_DEFAULT "./share/lua/${luaversion}/?.lua;./?.lua;./?/init.lua"
|
||||
#undef LUA_CPATH_DEFAULT
|
||||
#define LUA_CPATH_DEFAULT "./lib/lua/${luaversion}/?.so;./?.so;./lib/lua/${luaversion}/loadall.so"
|
||||
'
|
||||
} >> src/luaconf.h
|
||||
sed -i "s@#define LUA_ROOT[[:space:]]*\"/usr/local/\"@#define LUA_ROOT \"$out/\"@g" src/luaconf.h
|
||||
|
||||
# abort if patching didn't work
|
||||
grep $out src/luaconf.h
|
||||
'' + lib.optionalString (!stdenv.isDarwin && !staticOnly) ''
|
||||
# Add a target for a shared library to the Makefile.
|
||||
sed -e '1s/^/LUA_SO = liblua.so/' \
|
||||
|
@ -102,8 +97,8 @@ stdenv.mkDerivation (finalAttrs:
|
|||
makeFlagsArray+=(${lib.optionalString stdenv.isDarwin "CC=\"$CC\""}${lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform) " 'AR=${stdenv.cc.targetPrefix}ar rcu'"})
|
||||
|
||||
installFlagsArray=( TO_BIN="lua luac" INSTALL_DATA='cp -d' \
|
||||
TO_LIB="${if stdenv.isDarwin then "liblua.${version}.dylib"
|
||||
else ("liblua.a" + lib.optionalString (!staticOnly) " liblua.so liblua.so.${luaversion} liblua.so.${version}" )}" )
|
||||
TO_LIB="${if stdenv.isDarwin then "liblua.${finalAttrs.version}.dylib"
|
||||
else ("liblua.a" + lib.optionalString (!staticOnly) " liblua.so liblua.so.${luaversion} liblua.so.${finalAttrs.version}" )}" )
|
||||
|
||||
runHook postConfigure
|
||||
'';
|
||||
|
@ -128,7 +123,7 @@ stdenv.mkDerivation (finalAttrs:
|
|||
|
||||
Name: Lua
|
||||
Description: An Extensible Extension Language
|
||||
Version: ${version}
|
||||
Version: ${finalAttrs.version}
|
||||
Requires:
|
||||
Libs: -L$out/lib -llua
|
||||
Cflags: -I$out/include
|
||||
|
@ -138,7 +133,7 @@ stdenv.mkDerivation (finalAttrs:
|
|||
ln -s "$out/lib/pkgconfig/lua.pc" "$out/lib/pkgconfig/lua${lib.replaceStrings [ "." ] [ "" ] luaversion}.pc"
|
||||
|
||||
# Make documentation outputs of different versions co-installable.
|
||||
mv $out/share/doc/lua $out/share/doc/lua-${version}
|
||||
mv $out/share/doc/lua $out/share/doc/lua-${finalAttrs.version}
|
||||
'';
|
||||
|
||||
# copied from python
|
||||
|
|
|
@ -3,14 +3,14 @@
|
|||
# Example:
|
||||
# fail "It should have been but it wasn't to be"
|
||||
function fail() {
|
||||
echo "$1"
|
||||
echo -e "$1"
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
function assertStringEqual() {
|
||||
if ! diff <(echo "$1") <(echo "$2") ; then
|
||||
fail "expected \"$1\" to be equal to \"$2\""
|
||||
fail "Actual value: \"$1\"\nExpected value: \"$2\""
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
{ lua
|
||||
, hello
|
||||
, wrapLua
|
||||
, lib, fetchFromGitHub
|
||||
, fetchFromGitLab
|
||||
, lib
|
||||
, pkgs
|
||||
}:
|
||||
let
|
||||
|
||||
runTest = lua: { name, command }:
|
||||
pkgs.runCommandLocal "test-${lua.name}-${name}" ({
|
||||
nativeBuildInputs = [lua];
|
||||
|
@ -18,29 +16,47 @@ let
|
|||
+ "touch $out"
|
||||
);
|
||||
|
||||
wrappedHello = hello.overrideAttrs(oa: {
|
||||
propagatedBuildInputs = [
|
||||
wrapLua
|
||||
lua.pkgs.cjson
|
||||
];
|
||||
postFixup = ''
|
||||
wrapLuaPrograms
|
||||
'';
|
||||
});
|
||||
wrappedHello = hello.overrideAttrs(oa: {
|
||||
propagatedBuildInputs = [
|
||||
wrapLua
|
||||
lua.pkgs.cjson
|
||||
];
|
||||
postFixup = ''
|
||||
wrapLuaPrograms
|
||||
'';
|
||||
});
|
||||
|
||||
luaWithModule = lua.withPackages(ps: [
|
||||
ps.lua-cjson
|
||||
]);
|
||||
luaWithModule = lua.withPackages(ps: [
|
||||
ps.lua-cjson
|
||||
]);
|
||||
|
||||
golden_LUA_PATHS = {
|
||||
|
||||
# Looking at lua interpreter 'setpath' code
|
||||
# for instance https://github.com/lua/lua/blob/69ea087dff1daba25a2000dfb8f1883c17545b7a/loadlib.c#L599
|
||||
# replace ";;" by ";LUA_PATH_DEFAULT;"
|
||||
"5.1" = ";./?.lua;${lua}/share/lua/5.1/?.lua;${lua}/share/lua/5.1/?/init.lua;${lua}/lib/lua/5.1/?.lua;${lua}/lib/lua/5.1/?/init.lua;";
|
||||
"5.2" = ";${lua}/share/lua/5.2/?.lua;${lua}/share/lua/5.2/?/init.lua;${lua}/lib/lua/5.2/?.lua;${lua}/lib/lua/5.2/?/init.lua;./?.lua;";
|
||||
"5.3" = ";${lua}/share/lua/5.3/?.lua;${lua}/share/lua/5.3/?/init.lua;${lua}/lib/lua/5.3/?.lua;${lua}/lib/lua/5.3/?/init.lua;./?.lua;./?/init.lua;";
|
||||
# lua5.4 seems to be smarter about it and dont add the lua separators when nothing left or right
|
||||
"5.4" = "${lua}/share/lua/5.4/?.lua;${lua}/share/lua/5.4/?/init.lua;${lua}/lib/lua/5.4/?.lua;${lua}/lib/lua/5.4/?/init.lua;./?.lua;./?/init.lua";
|
||||
|
||||
# luajit versions
|
||||
"2.0" = ";./?.lua;${lua}/share/luajit-2.0/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;${lua}/share/lua/5.1/?.lua;${lua}/share/lua/5.1/?/init.lua;";
|
||||
"2.1" = ";./?.lua;${lua}/share/luajit-2.1/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;${lua}/share/lua/5.1/?.lua;${lua}/share/lua/5.1/?/init.lua;";
|
||||
};
|
||||
in
|
||||
pkgs.recurseIntoAttrs ({
|
||||
|
||||
checkAliases = runTest lua {
|
||||
name = "check-aliases";
|
||||
checkInterpreterPatch = let
|
||||
golden_LUA_PATH = golden_LUA_PATHS.${lib.versions.majorMinor lua.version};
|
||||
in
|
||||
runTest lua {
|
||||
name = "check-default-lua-path";
|
||||
command = ''
|
||||
export LUA_PATH=";;"
|
||||
generated=$(lua -e 'print(package.path)')
|
||||
golden_LUA_PATH='./share/lua/${lua.luaversion}/?.lua;./?.lua;./?/init.lua'
|
||||
|
||||
assertStringContains "$generated" "$golden_LUA_PATH"
|
||||
assertStringEqual "$generated" "${golden_LUA_PATH}"
|
||||
'';
|
||||
};
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ let
|
|||
else buildPackages.stdenv;
|
||||
|
||||
in
|
||||
stdenv.mkDerivation rec {
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "luajit";
|
||||
inherit version src;
|
||||
|
||||
|
@ -75,15 +75,6 @@ stdenv.mkDerivation rec {
|
|||
# passed by nixpkgs CC wrapper is insufficient on its own
|
||||
substituteInPlace src/Makefile --replace "#CCDEBUG= -g" "CCDEBUG= -g"
|
||||
fi
|
||||
|
||||
{
|
||||
echo -e '
|
||||
#undef LUA_PATH_DEFAULT
|
||||
#define LUA_PATH_DEFAULT "./share/lua/${luaversion}/?.lua;./?.lua;./?/init.lua"
|
||||
#undef LUA_CPATH_DEFAULT
|
||||
#define LUA_CPATH_DEFAULT "./lib/lua/${luaversion}/?.so;./?.so;./lib/lua/${luaversion}/loadall.so"
|
||||
'
|
||||
} >> src/luaconf.h
|
||||
'';
|
||||
|
||||
dontConfigure = true;
|
||||
|
@ -122,7 +113,8 @@ stdenv.mkDerivation rec {
|
|||
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 luaversion packageOverrides luaAttr;
|
||||
inherit self packageOverrides luaAttr;
|
||||
inherit (finalAttrs) luaversion;
|
||||
executable = "lua";
|
||||
luaOnBuildForBuild = override pkgsBuildBuild.${luaAttr};
|
||||
luaOnBuildForHost = override pkgsBuildHost.${luaAttr};
|
||||
|
@ -142,4 +134,4 @@ stdenv.mkDerivation rec {
|
|||
];
|
||||
maintainers = with maintainers; [ thoughtpolice smironov vcunat lblasc ];
|
||||
} // extraMeta;
|
||||
}
|
||||
})
|
||||
|
|
Loading…
Reference in a new issue