summary refs log tree commit diff
path: root/pkgs/development/lua-modules
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/lua-modules')
-rw-r--r--pkgs/development/lua-modules/lib.nix68
1 files changed, 68 insertions, 0 deletions
diff --git a/pkgs/development/lua-modules/lib.nix b/pkgs/development/lua-modules/lib.nix
index 9c31f9a5c53..0d429b3ba6d 100644
--- a/pkgs/development/lua-modules/lib.nix
+++ b/pkgs/development/lua-modules/lib.nix
@@ -60,4 +60,72 @@ rec {
         requiredLuaModules = requiredLuaModules drv.propagatedBuildInputs;
       };
     });
+
+  /* generate luarocks config
+
+  generateLuarocksConfig {
+    externalDeps = [ { name = "CRYPTO"; dep = pkgs.openssl; } ];
+    rocksSubdir = "subdir";
+  };
+  */
+  generateLuarocksConfig = {
+    externalDeps
+    , requiredLuaRocks
+    , extraVariables ? {}
+    , rocksSubdir
+    }: let
+      rocksTrees = lib.imap0
+        (i: dep: "{ name = [[dep-${toString i}]], root = '${dep}', rocks_dir = '${dep}/${dep.rocksSubdir}' }")
+        requiredLuaRocks;
+
+      # Explicitly point luarocks to the relevant locations for multiple-output
+      # derivations that are external dependencies, to work around an issue it has
+      # (https://github.com/luarocks/luarocks/issues/766)
+      depVariables = lib.concatMap ({name, dep}: [
+        "${name}_INCDIR='${lib.getDev dep}/include';"
+        "${name}_LIBDIR='${lib.getLib dep}/lib';"
+        "${name}_BINDIR='${lib.getBin dep}/bin';"
+      ]) externalDeps';
+
+      # example externalDeps': [ { name = "CRYPTO"; dep = pkgs.openssl; } ]
+      externalDeps' = lib.filter (dep: !lib.isDerivation dep) externalDeps;
+
+      externalDepsDirs = map
+        (x: "'${builtins.toString x}'")
+        (lib.filter (lib.isDerivation) externalDeps);
+
+      extraVariablesStr = lib.concatStringsSep "\n "
+        (lib.mapAttrsToList (k: v: "${k}='${v}';") extraVariables);
+  in ''
+    local_cache = ""
+    -- To prevent collisions when creating environments, we install the rock
+    -- files into per-package subdirectories
+    rocks_subdir = '${rocksSubdir}'
+    -- Then we need to tell luarocks where to find the rock files per
+    -- dependency
+    rocks_trees = {
+      ${lib.concatStringsSep "\n, " rocksTrees}
+    }
+  '' + lib.optionalString lua.pkgs.isLuaJIT ''
+    -- Luajit provides some additional functionality built-in; this exposes
+    -- that to luarock's dependency system
+    rocks_provided = {
+      jit='${lua.luaversion}-1';
+      ffi='${lua.luaversion}-1';
+      luaffi='${lua.luaversion}-1';
+      bit='${lua.luaversion}-1';
+    }
+  '' + ''
+    -- For single-output external dependencies
+    external_deps_dirs = {
+      ${lib.concatStringsSep "\n, " externalDepsDirs}
+    }
+    variables = {
+      -- Some needed machinery to handle multiple-output external dependencies,
+      -- as per https://github.com/luarocks/luarocks/issues/766
+      ${lib.optionalString (lib.length depVariables > 0) ''
+        ${lib.concatStringsSep "\n  " depVariables}''}
+      ${extraVariablesStr}
+    }
+  '';
 }