Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions doc/languages-frameworks/lua.section.md
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down
3 changes: 3 additions & 0 deletions nixos/doc/manual/release-notes/rl-2405.section.md
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down
1 change: 0 additions & 1 deletion pkgs/development/interpreters/lua-5/hooks/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

let
callPackage = lua.pkgs.callPackage;
luaInterpreter = lua.interpreter;
in {

lua-setup-hook = LuaPathSearchPaths: LuaCPathSearchPaths:
Expand Down
15 changes: 9 additions & 6 deletions pkgs/development/interpreters/lua-5/hooks/setup-hook.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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() {
Expand Down
25 changes: 10 additions & 15 deletions pkgs/development/interpreters/lua-5/interpreter.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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;
};

Expand All @@ -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/' \
Expand Down Expand Up @@ -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
'';
Expand All @@ -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
Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions pkgs/development/interpreters/lua-5/tests/assert.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
# Example:
# fail "It should have been but it wasn't to be"
function fail() {
echo "$1"
echo -e "$1"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

echo -e evaluates backslash escape sequences, did you mean to do >&2 to print to stderr?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nope, I wanted to echo the newlines. I am not sure what's best actually, do several fail calls or keep the newline ? anyway this patch made actually harder to look at teh differences because $1 and $2 now dont start on same line.
What I would like best is to show inline diffs. I know git diff can be used outside repos, not sure about enabling inline diffs, wether it's worth or not.

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
}

Expand Down
56 changes: 36 additions & 20 deletions pkgs/development/interpreters/lua-5/tests/default.nix
Original file line number Diff line number Diff line change
@@ -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];
Expand All @@ -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
]);

golden_LUA_PATHS = {

luaWithModule = lua.withPackages(ps: [
ps.lua-cjson
]);
# 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}"
'';
};

Expand Down
16 changes: 4 additions & 12 deletions pkgs/development/interpreters/luajit/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ let
else buildPackages.stdenv;

in
stdenv.mkDerivation rec {
stdenv.mkDerivation (finalAttrs: {
pname = "luajit";
inherit version src;

Expand All @@ -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;
Expand Down Expand Up @@ -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};
Expand All @@ -142,4 +134,4 @@ stdenv.mkDerivation rec {
];
maintainers = with maintainers; [ thoughtpolice smironov vcunat lblasc ];
} // extraMeta;
}
})