diff options
author | Matthieu Coudron <coudron@iij.ad.jp> | 2019-01-30 23:13:15 +0900 |
---|---|---|
committer | Michael Raskin <7c6f434c@mail.ru> | 2019-01-30 14:13:15 +0000 |
commit | c4519cf8a6bfdb21ced8b053953d2a8fa68c615c (patch) | |
tree | 3ea0dac7056b81a28f024d1db2df0ce97354a240 /pkgs/development/interpreters | |
parent | 16ab34c37b7ead2266ae24ebcf5d6e9f5cd5ab59 (diff) |
lua: add withPackages function (#54460)
* lua: add withPackages function First step towards more automation similar to the haskell backend. Follow up of https://github.com/NixOS/nixpkgs/pull/33903
Diffstat (limited to 'pkgs/development/interpreters')
-rw-r--r-- | pkgs/development/interpreters/lua-5/5.1.nix | 22 | ||||
-rw-r--r-- | pkgs/development/interpreters/lua-5/5.2.nix | 26 | ||||
-rw-r--r-- | pkgs/development/interpreters/lua-5/5.3.nix | 24 | ||||
-rw-r--r-- | pkgs/development/interpreters/lua-5/build-rocks.nix | 0 | ||||
-rw-r--r-- | pkgs/development/interpreters/lua-5/build-rockspec.nix | 0 | ||||
-rw-r--r-- | pkgs/development/interpreters/lua-5/setup-hook.nix | 15 | ||||
-rw-r--r-- | pkgs/development/interpreters/lua-5/setup-hook.sh | 47 | ||||
-rw-r--r-- | pkgs/development/interpreters/lua-5/with-packages.nix | 4 | ||||
-rw-r--r-- | pkgs/development/interpreters/lua-5/wrapper.nix | 73 | ||||
-rw-r--r-- | pkgs/development/interpreters/luajit/2.0.nix | 10 | ||||
-rw-r--r-- | pkgs/development/interpreters/luajit/2.1.nix | 7 | ||||
-rw-r--r-- | pkgs/development/interpreters/luajit/default.nix | 121 |
12 files changed, 286 insertions, 63 deletions
diff --git a/pkgs/development/interpreters/lua-5/5.1.nix b/pkgs/development/interpreters/lua-5/5.1.nix index 09af492490cf2..b2948b392d5e2 100644 --- a/pkgs/development/interpreters/lua-5/5.1.nix +++ b/pkgs/development/interpreters/lua-5/5.1.nix @@ -1,4 +1,8 @@ -{ stdenv, fetchurl, readline }: +{ stdenv, fetchurl, readline +, self +, callPackage +, packageOverrides ? (self: super: {}) +}: let dsoPatch = fetchurl { @@ -6,6 +10,7 @@ let sha256 = "11fcyb4q55p4p7kdb8yp85xlw8imy14kzamp2khvcyxss4vw8ipw"; name = "lua-arch.patch"; }; + luaPackages = callPackage ../../lua-modules {lua=self; overrides=packageOverrides;}; in stdenv.mkDerivation rec { name = "lua-${version}"; @@ -17,6 +22,10 @@ stdenv.mkDerivation rec { sha256 = "2640fc56a795f29d28ef15e13c34a47e223960b0240e8cb0a82d9b0738695333"; }; + LuaPathSearchPaths = luaPackages.getLuaPathList luaversion; + LuaCPathSearchPaths = luaPackages.getLuaCPathList luaversion; + setupHook = luaPackages.lua-setup-hook LuaPathSearchPaths LuaCPathSearchPaths; + buildInputs = [ readline ]; patches = (if stdenv.isDarwin then [ ./5.1.darwin.patch ] else [ dsoPatch ]) @@ -39,6 +48,16 @@ stdenv.mkDerivation rec { rmdir $out/{share,lib}/lua/5.1 $out/{share,lib}/lua ''; + passthru = rec { + buildEnv = callPackage ./wrapper.nix { + lua=self; + inherit (luaPackages) requiredLuaModules; + }; + withPackages = import ./with-packages.nix { inherit buildEnv luaPackages;}; + pkgs = luaPackages; + interpreter = "${self}/bin/lua"; + }; + meta = { homepage = http://www.lua.org; description = "Powerful, fast, lightweight, embeddable scripting language"; @@ -51,6 +70,7 @@ stdenv.mkDerivation rec { for configuration, scripting, and rapid prototyping. ''; license = stdenv.lib.licenses.mit; + platforms = with stdenv.lib.platforms; linux ++ darwin; hydraPlatforms = stdenv.lib.platforms.linux; }; } diff --git a/pkgs/development/interpreters/lua-5/5.2.nix b/pkgs/development/interpreters/lua-5/5.2.nix index a8badf647c0c2..e89a2cbece6d1 100644 --- a/pkgs/development/interpreters/lua-5/5.2.nix +++ b/pkgs/development/interpreters/lua-5/5.2.nix @@ -1,4 +1,10 @@ -{ stdenv, fetchurl, readline, compat ? false }: +{ stdenv, fetchurl, readline +# compiles compatibility layer with lua5.1 +, compat ? false +, callPackage +, self +, packageOverrides ? (self: super: {}) +}: let dsoPatch = fetchurl { @@ -6,12 +12,17 @@ let sha256 = "1by1dy4ql61f5c6njq9ibf9kaqm3y633g2q8j54iyjr4cxvqwqz9"; name = "lua-arch.patch"; }; + luaPackages = callPackage ../../lua-modules {lua=self; overrides=packageOverrides;}; in stdenv.mkDerivation rec { name = "lua-${version}"; luaversion = "5.2"; version = "${luaversion}.4"; + LuaPathSearchPaths = luaPackages.getLuaPathList luaversion; + LuaCPathSearchPaths = luaPackages.getLuaCPathList luaversion; + setupHook = luaPackages.lua-setup-hook LuaPathSearchPaths LuaCPathSearchPaths; + src = fetchurl { url = "https://www.lua.org/ftp/${name}.tar.gz"; sha256 = "0jwznq0l8qg9wh5grwg07b5cy3lzngvl5m2nl1ikp6vqssmf9qmr"; @@ -21,6 +32,19 @@ stdenv.mkDerivation rec { patches = if stdenv.isDarwin then [ ./5.2.darwin.patch ] else [ dsoPatch ]; + + passthru = rec { + buildEnv = callPackage ./wrapper.nix { + lua = self; + inherit (luaPackages) requiredLuaModules; + }; + withPackages = import ./with-packages.nix { inherit buildEnv luaPackages;}; + pkgs = luaPackages; + interpreter = "${self}/bin/lua"; + }; + + enableParallelBuilding = true; + configurePhase = if stdenv.isDarwin then '' diff --git a/pkgs/development/interpreters/lua-5/5.3.nix b/pkgs/development/interpreters/lua-5/5.3.nix index eb34391e1993c..c1fdc0fd9904a 100644 --- a/pkgs/development/interpreters/lua-5/5.3.nix +++ b/pkgs/development/interpreters/lua-5/5.3.nix @@ -1,5 +1,11 @@ -{ stdenv, fetchurl, readline, compat ? false }: - +{ stdenv, fetchurl, readline, compat ? false +, callPackage +, self +, packageOverrides ? (self: super: {}) +}: +let + luaPackages = callPackage ../../lua-modules {lua=self; overrides=packageOverrides;}; +in stdenv.mkDerivation rec { name = "lua-${version}"; luaversion = "5.3"; @@ -10,6 +16,10 @@ stdenv.mkDerivation rec { sha256 = "0c2eed3f960446e1a3e4b9a1ca2f3ff893b6ce41942cf54d5dd59ab4b3b058ac"; }; + LuaPathSearchPaths = luaPackages.getLuaPathList luaversion; + LuaCPathSearchPaths = luaPackages.getLuaCPathList luaversion; + setupHook = luaPackages.lua-setup-hook LuaPathSearchPaths LuaCPathSearchPaths; + buildInputs = [ readline ]; patches = if stdenv.isDarwin then [ ./5.2.darwin.patch ] else []; @@ -54,6 +64,16 @@ stdenv.mkDerivation rec { ln -s "$out/lib/pkgconfig/lua.pc" "$out/lib/pkgconfig/lua${luaversion}.pc" ''; + passthru = rec { + buildEnv = callPackage ./wrapper.nix { + lua = self; + inherit (luaPackages) requiredLuaModules; + }; + withPackages = import ./with-packages.nix { inherit buildEnv luaPackages;}; + pkgs = luaPackages; + interpreter = "${self}/bin/lua"; + }; + meta = { homepage = http://www.lua.org; description = "Powerful, fast, lightweight, embeddable scripting language"; diff --git a/pkgs/development/interpreters/lua-5/build-rocks.nix b/pkgs/development/interpreters/lua-5/build-rocks.nix new file mode 100644 index 0000000000000..e69de29bb2d1d --- /dev/null +++ b/pkgs/development/interpreters/lua-5/build-rocks.nix diff --git a/pkgs/development/interpreters/lua-5/build-rockspec.nix b/pkgs/development/interpreters/lua-5/build-rockspec.nix new file mode 100644 index 0000000000000..e69de29bb2d1d --- /dev/null +++ b/pkgs/development/interpreters/lua-5/build-rockspec.nix diff --git a/pkgs/development/interpreters/lua-5/setup-hook.nix b/pkgs/development/interpreters/lua-5/setup-hook.nix new file mode 100644 index 0000000000000..62caffd8d8a0f --- /dev/null +++ b/pkgs/development/interpreters/lua-5/setup-hook.nix @@ -0,0 +1,15 @@ +{ runCommand, lib, }: + +LuaPathSearchPaths: LuaCPathSearchPaths: + +let + hook = ./setup-hook.sh; +in runCommand "lua-setup-hook.sh" { + # hum doesn't seem to like caps !! BUG ? + luapathsearchpaths=lib.escapeShellArgs LuaPathSearchPaths; + luacpathsearchpaths=lib.escapeShellArgs LuaCPathSearchPaths; +} '' + cp ${hook} hook.sh + substituteAllInPlace hook.sh + mv hook.sh $out +'' diff --git a/pkgs/development/interpreters/lua-5/setup-hook.sh b/pkgs/development/interpreters/lua-5/setup-hook.sh new file mode 100644 index 0000000000000..a015f35e7cefb --- /dev/null +++ b/pkgs/development/interpreters/lua-5/setup-hook.sh @@ -0,0 +1,47 @@ +# set -e + +nix_print() { + if (( "${NIX_DEBUG:-0}" >= $1 )); then + echo "$2" + fi +} + +nix_debug() { + nix_print 3 "$1" +} + +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 grows too big + if [ ! -d "$topDir" ]; then return; fi + + export "${varName}=${!varName:+${!varName};}${absPattern}" +} + +addToLuaPath() { + local dir="$1" + + if [[ ! -d "$dir" ]]; then + nix_debug "$dir not a directory abort" + return 0 + fi + cd "$dir" + for pattern in @luapathsearchpaths@; + do + addToLuaSearchPathWithCustomDelimiter LUA_PATH "$PWD/$pattern" + done + + # LUA_CPATH + for pattern in @luacpathsearchpaths@; + do + addToLuaSearchPathWithCustomDelimiter LUA_CPATH "$PWD/$pattern" + done + cd - +} + +addEnvHooks "$hostOffset" addToLuaPath + diff --git a/pkgs/development/interpreters/lua-5/with-packages.nix b/pkgs/development/interpreters/lua-5/with-packages.nix new file mode 100644 index 0000000000000..0e0fbd3973583 --- /dev/null +++ b/pkgs/development/interpreters/lua-5/with-packages.nix @@ -0,0 +1,4 @@ +{ buildEnv, luaPackages }: + +# this is a function that returns a function that returns an environment +f: let packages = f luaPackages; in buildEnv.override { extraLibs = packages; } diff --git a/pkgs/development/interpreters/lua-5/wrapper.nix b/pkgs/development/interpreters/lua-5/wrapper.nix new file mode 100644 index 0000000000000..9abbd77d575ef --- /dev/null +++ b/pkgs/development/interpreters/lua-5/wrapper.nix @@ -0,0 +1,73 @@ +{ stdenv, lua, buildEnv, makeWrapper +, extraLibs ? [] +, extraOutputsToInstall ? [] +, postBuild ? "" +, ignoreCollisions ? false +, lib +, requiredLuaModules +, makeWrapperArgs ? [] +}: + +# Create a lua executable that knows about additional packages. +let + env = let + paths = requiredLuaModules (extraLibs ++ [ lua ] ); + in buildEnv { + name = "${lua.name}-env"; + + inherit paths; + inherit ignoreCollisions; + extraOutputsToInstall = [ "out" ] ++ extraOutputsToInstall; + + # we create wrapper for the binaries in the different packages + postBuild = '' + + . "${makeWrapper}/nix-support/setup-hook" + + # get access to lua functions + . ${lua}/nix-support/setup-hook + + if [ -L "$out/bin" ]; then + unlink "$out/bin" + fi + mkdir -p "$out/bin" + + addToLuaPath "$out" + + # take every binary from lua packages and put them into the env + for path in ${stdenv.lib.concatStringsSep " " paths}; do + nix_debug "looking for binaries in path = $path" + if [ -d "$path/bin" ]; then + cd "$path/bin" + for prg in *; do + if [ -f "$prg" ]; then + rm -f "$out/bin/$prg" + if [ -x "$prg" ]; then + nix_debug "Making wrapper $prg" + makeWrapper "$path/bin/$prg" "$out/bin/$prg" --suffix LUA_PATH ';' "$LUA_PATH" --suffix LUA_CPATH ';' "$LUA_CPATH" ${stdenv.lib.concatStringsSep " " makeWrapperArgs} + fi + fi + done + fi + done + '' + postBuild; + + inherit (lua) meta; + + passthru = lua.passthru // { + interpreter = "${env}/bin/lua"; + inherit lua; + env = stdenv.mkDerivation { + name = "interactive-${lua.name}-environment"; + nativeBuildInputs = [ env ]; + + buildCommand = '' + echo >&2 "" + echo >&2 "*** lua 'env' attributes are intended for interactive nix-shell sessions, not for building! ***" + echo >&2 "" + exit 1 + ''; + }; + }; + }; +in env diff --git a/pkgs/development/interpreters/luajit/2.0.nix b/pkgs/development/interpreters/luajit/2.0.nix new file mode 100644 index 0000000000000..0889b7fefe685 --- /dev/null +++ b/pkgs/development/interpreters/luajit/2.0.nix @@ -0,0 +1,10 @@ +{ self, callPackage, lib }: +callPackage ./default.nix { + inherit self; + version = "2.0.5"; + isStable = true; + sha256 = "0yg9q4q6v028bgh85317ykc9whgxgysp76qzaqgq55y6jy11yjw7"; + extraMeta = { + platforms = lib.filter (p: p != "aarch64-linux") lib.meta.platforms; + }; +} diff --git a/pkgs/development/interpreters/luajit/2.1.nix b/pkgs/development/interpreters/luajit/2.1.nix new file mode 100644 index 0000000000000..0f223963132ef --- /dev/null +++ b/pkgs/development/interpreters/luajit/2.1.nix @@ -0,0 +1,7 @@ +{ self, callPackage, lib }: +callPackage ./default.nix { + inherit self; + version = "2.1.0-beta3"; + isStable = false; + sha256 = "1hyrhpkwjqsv54hnnx4cl8vk44h9d6c9w0fz1jfjz00w255y7lhs"; +} diff --git a/pkgs/development/interpreters/luajit/default.nix b/pkgs/development/interpreters/luajit/default.nix index 9ee628f498ee6..c95b9e8b8e37e 100644 --- a/pkgs/development/interpreters/luajit/default.nix +++ b/pkgs/development/interpreters/luajit/default.nix @@ -1,71 +1,74 @@ -{ stdenv, lib, fetchurl }: -rec { +{ stdenv, lib, fetchurl +, name ? "luajit-${version}" +, isStable +, sha256 +, version +, extraMeta ? {} +, callPackage +, self +, packageOverrides ? (self: super: {}) +}: +let + luaPackages = callPackage ../../lua-modules {lua=self; overrides=packageOverrides;}; +in +stdenv.mkDerivation rec { + inherit name version; + src = fetchurl { + url = "http://luajit.org/download/LuaJIT-${version}.tar.gz"; + inherit sha256; + }; - luajit = luajit_2_1; + luaversion = "5.1"; - luajit_2_0 = generic { - version = "2.0.5"; - isStable = true; - sha256 = "0yg9q4q6v028bgh85317ykc9whgxgysp76qzaqgq55y6jy11yjw7"; - meta = genericMeta // { - platforms = lib.filter (p: p != "aarch64-linux") genericMeta.platforms; - }; - }; + patchPhase = '' + substituteInPlace Makefile \ + --replace /usr/local "$out" + + substituteInPlace src/Makefile --replace gcc cc + '' + stdenv.lib.optionalString (stdenv.cc.libc != null) + '' + substituteInPlace Makefile \ + --replace ldconfig ${stdenv.cc.libc.bin or stdenv.cc.libc}/bin/ldconfig + ''; + + configurePhase = false; - luajit_2_1 = generic { - version = "2.1.0-beta3"; - isStable = false; - sha256 = "1hyrhpkwjqsv54hnnx4cl8vk44h9d6c9w0fz1jfjz00w255y7lhs"; + buildFlags = [ "amalg" ]; # Build highly optimized version + enableParallelBuilding = true; + + installPhase = '' + make install PREFIX="$out" + ( cd "$out/include"; ln -s luajit-*/* . ) + ln -s "$out"/bin/luajit-* "$out"/bin/lua + '' + + stdenv.lib.optionalString (!isStable) '' + ln -s "$out"/bin/luajit-* "$out"/bin/luajit + ''; + + LuaPathSearchPaths = [ + "lib/lua/${luaversion}/?.lua" "share/lua/${luaversion}/?.lua" + "share/lua/${luaversion}/?/init.lua" "lib/lua/${luaversion}/?/init.lua" + "share/${name}/?.lua" + ]; + LuaCPathSearchPaths = [ "lib/lua/${luaversion}/?.so" "share/lua/${luaversion}/?.so" ]; + setupHook = luaPackages.lua-setup-hook LuaPathSearchPaths LuaCPathSearchPaths; + + passthru = rec { + buildEnv = callPackage ../lua-5/wrapper.nix { + lua = self; + inherit (luaPackages) requiredLuaModules; + }; + withPackages = import ../lua-5/with-packages.nix { inherit buildEnv luaPackages;}; + pkgs = luaPackages; + interpreter = "${self}/bin/lua"; }; - genericMeta = with stdenv.lib; { + meta = with stdenv.lib; extraMeta // { description = "High-performance JIT compiler for Lua 5.1"; homepage = http://luajit.org; license = licenses.mit; platforms = platforms.linux ++ platforms.darwin; maintainers = with maintainers; [ thoughtpolice smironov vcunat andir ]; }; - - generic = - { version, sha256 ? null, isStable - , name ? "luajit-${version}" - , src ? - (fetchurl { - url = "http://luajit.org/download/LuaJIT-${version}.tar.gz"; - inherit sha256; - }) - , meta ? genericMeta - }: - - stdenv.mkDerivation rec { - inherit name version src meta; - - luaversion = "5.1"; - - patchPhase = '' - substituteInPlace Makefile \ - --replace /usr/local "$out" - - substituteInPlace src/Makefile --replace gcc cc - '' + stdenv.lib.optionalString (stdenv.cc.libc != null) - '' - substituteInPlace Makefile \ - --replace ldconfig ${stdenv.cc.libc.bin or stdenv.cc.libc}/bin/ldconfig - ''; - - configurePhase = false; - - buildFlags = [ "amalg" ]; # Build highly optimized version - enableParallelBuilding = true; - - installPhase = '' - make install PREFIX="$out" - ( cd "$out/include"; ln -s luajit-*/* . ) - ln -s "$out"/bin/luajit-* "$out"/bin/lua - '' - + stdenv.lib.optionalString (!isStable) - '' - ln -s "$out"/bin/luajit-* "$out"/bin/luajit - ''; - }; } + |