diff --git a/pkgs/development/interpreters/lua-5/default.nix b/pkgs/development/interpreters/lua-5/default.nix index 2fda54bef530f..ab922111084b5 100644 --- a/pkgs/development/interpreters/lua-5/default.nix +++ b/pkgs/development/interpreters/lua-5/default.nix @@ -70,7 +70,7 @@ let inherit executable luaversion; luaOnBuild = luaOnBuildForHost.override { inherit packageOverrides; self = luaOnBuild; }; - tests = callPackage ./tests { inherit (luaPackages) wrapLua; }; + tests = callPackage ./tests { lua = self; inherit (luaPackages) wrapLua; }; inherit luaAttr; }; diff --git a/pkgs/development/interpreters/lua-5/hooks/setup-hook.sh b/pkgs/development/interpreters/lua-5/hooks/setup-hook.sh index 1c445b82afded..b622db7525780 100644 --- a/pkgs/development/interpreters/lua-5/hooks/setup-hook.sh +++ b/pkgs/development/interpreters/lua-5/hooks/setup-hook.sh @@ -17,7 +17,7 @@ addToLuaSearchPathWithCustomDelimiter() { local topDir="${absPattern%%\?*}" # export only if the folder exists else LUA_PATH/LUA_CPATH grow too large - if [[ ! -d "$topDir" ]]; then return; fi + if [[ ! -d "$topDir" ]] && [[ ! "$absPattern" =~ ^\./ ]]; then return; fi # export only if we haven't already got this dir in the search path if [[ ${!varName-} == *"$absPattern"* ]]; then return; fi @@ -34,12 +34,22 @@ addToLuaPath() { fi cd "$dir" for pattern in @luapathsearchpaths@; do - addToLuaSearchPathWithCustomDelimiter LUA_PATH "$PWD/$pattern" + # handle relative paths at runtime + if [[ "$pattern" =~ ^\./ ]]; then + addToLuaSearchPathWithCustomDelimiter LUA_PATH "$pattern" + else + addToLuaSearchPathWithCustomDelimiter LUA_PATH "$PWD/$pattern" + fi done # LUA_CPATH for pattern in @luacpathsearchpaths@; do - addToLuaSearchPathWithCustomDelimiter LUA_CPATH "$PWD/$pattern" + # handle relative paths at runtime + if [[ "$pattern" =~ ^\./ ]]; then + addToLuaSearchPathWithCustomDelimiter LUA_CPATH "$pattern" + else + addToLuaSearchPathWithCustomDelimiter LUA_CPATH "$PWD/$pattern" + fi done cd - >/dev/null } diff --git a/pkgs/development/interpreters/lua-5/interpreter.nix b/pkgs/development/interpreters/lua-5/interpreter.nix index c262752991420..7805bf28aee4b 100644 --- a/pkgs/development/interpreters/lua-5/interpreter.nix +++ b/pkgs/development/interpreters/lua-5/interpreter.nix @@ -48,8 +48,8 @@ stdenv.mkDerivation (finalAttrs: sha256 = hash; }; - LuaPathSearchPaths = luaPackages.luaLib.luaPathList; - LuaCPathSearchPaths = luaPackages.luaLib.luaCPathList; + LuaPathSearchPaths = [ "./share/lua/${self.luaversion}/?.lua" "./?.lua" "./?/init.lua" ] ++ luaPackages.luaLib.luaPathList; + LuaCPathSearchPaths = [ "./lib/lua/${self.luaversion}/?.so" "./?.so" "./lib/lua/${self.luaversion}/loadall.so" ] ++ luaPackages.luaLib.luaCPathList; setupHook = luaPackages.lua-setup-hook finalAttrs.LuaPathSearchPaths finalAttrs.LuaCPathSearchPaths; @@ -60,16 +60,7 @@ 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 - '' + lib.optionalString (!stdenv.isDarwin && !staticOnly) '' + postPatch = lib.optionalString (!stdenv.isDarwin && !staticOnly) '' # Add a target for a shared library to the Makefile. sed -e '1s/^/LUA_SO = liblua.so/' \ -e 's/ALL_T *= */&$(LUA_SO) /' \ diff --git a/pkgs/development/interpreters/lua-5/tests/assert.sh b/pkgs/development/interpreters/lua-5/tests/assert.sh index fe5582a0b0623..c5783a24b2d7b 100644 --- a/pkgs/development/interpreters/lua-5/tests/assert.sh +++ b/pkgs/development/interpreters/lua-5/tests/assert.sh @@ -8,9 +8,14 @@ function fail() { } -function assertStringEqual { - +function assertStringEqual() { if ! diff <(echo "$1") <(echo "$2") ; then - fail "Strings differ" + fail "expected \"$1\" to be equal to \"$2\"" + fi +} + +function assertStringContains() { + if ! echo "$1" | grep -q "$2" ; then + fail "expected \"$1\" to contain \"$2\"" fi } diff --git a/pkgs/development/interpreters/lua-5/tests/default.nix b/pkgs/development/interpreters/lua-5/tests/default.nix index 38479af5f2070..46328b38014a7 100644 --- a/pkgs/development/interpreters/lua-5/tests/default.nix +++ b/pkgs/development/interpreters/lua-5/tests/default.nix @@ -8,7 +8,7 @@ let runTest = lua: { name, command }: - pkgs.runCommandLocal "test-${lua.name}" ({ + pkgs.runCommandLocal "test-${lua.name}-${name}" ({ nativeBuildInputs = [lua]; meta.platforms = lua.meta.platforms; }) ('' @@ -27,6 +27,10 @@ let wrapLuaPrograms ''; }); + + luaWithModule = lua.withPackages(ps: [ + ps.lua-cjson + ]); in pkgs.recurseIntoAttrs ({ @@ -36,15 +40,30 @@ in generated=$(lua -e 'print(package.path)') golden_LUA_PATH='./share/lua/${lua.luaversion}/?.lua;./?.lua;./?/init.lua' - assertStringEqual "$generated" "$golden_LUA_PATH" + assertStringContains "$generated" "$golden_LUA_PATH" ''; }; - checkWrapping = pkgs.runCommandLocal "test-${lua.name}" ({ + checkWrapping = pkgs.runCommandLocal "test-${lua.name}-wrapping" ({ }) ('' grep -- 'LUA_PATH=' ${wrappedHello}/bin/hello touch $out ''); + checkRelativeImports = pkgs.runCommandLocal "test-${lua.name}-relative-imports" ({ + }) ('' + source ${./assert.sh} + + lua_vanilla_package_path="$(${lua}/bin/lua -e "print(package.path)")" + lua_with_module_package_path="$(${luaWithModule}/bin/lua -e "print(package.path)")" + + assertStringContains "$lua_vanilla_package_path" "./?.lua" + assertStringContains "$lua_vanilla_package_path" "./?/init.lua" + + assertStringContains "$lua_with_module_package_path" "./?.lua" + assertStringContains "$lua_with_module_package_path" "./?/init.lua" + + touch $out + ''); }) diff --git a/pkgs/development/interpreters/luajit/default.nix b/pkgs/development/interpreters/luajit/default.nix index 211fa56e91197..477af583cbf8b 100644 --- a/pkgs/development/interpreters/luajit/default.nix +++ b/pkgs/development/interpreters/luajit/default.nix @@ -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; @@ -111,10 +102,10 @@ stdenv.mkDerivation rec { fi ''; - LuaPathSearchPaths = luaPackages.luaLib.luaPathList; - LuaCPathSearchPaths = luaPackages.luaLib.luaCPathList; + LuaPathSearchPaths = [ "./share/lua/${luaversion}/?.lua" "./?.lua" "./?/init.lua" ] ++ luaPackages.luaLib.luaPathList; + LuaCPathSearchPaths = [ "./lib/lua/${luaversion}/?.so" "./?.so" "./lib/lua/${luaversion}/loadall.so" ] ++ luaPackages.luaLib.luaCPathList; - setupHook = luaPackages.lua-setup-hook luaPackages.luaLib.luaPathList luaPackages.luaLib.luaCPathList; + setupHook = luaPackages.lua-setup-hook LuaPathSearchPaths LuaCPathSearchPaths; # copied from python passthru = let