Commit 2ea757a0 authored by Matthieu C.'s avatar Matthieu C.
Browse files

luaPackages.luarocks: generate luarocks as well

When installing a lua package that depends on luarocks, luarocks was not
capable of recognizing the luarocks module: https://github.com/NixOS/nixpkgs/issues/316009 .

As explained here https://github.com/luarocks/luarocks/issues/1659,
luarocks needs a manifest to recognize the package.
I first attempted to generate a manifest with `luarocks-admin
make-manifest` on our current manual luarocks derivation but this ended
up being too hackish as the `make-manifest` requires a .rockspec or
.rock to work, which we had not.

It seemed simpled to just rename the current manual luarocks derivation to luarocks_bootstrap
in order to break cyclic dependencies in buildLuarocksPackage and add a
generated luarocks derivation. Previously it was impossible to test
luarocks because of the cyclic dependency but we will now be able to
test the generated derivation.
parent 5ceeafa4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ lualogging,,,,,,
luaossl,,,,,5.1,
luaposix,,,,34.1.1-1,,vyp lblasc
luarepl,,,,,,
luarocks,,,,,,mrcjkb teto
luarocks-build-rust-mlua,,,,,,mrcjkb
luarocks-build-treesitter-parser,,,,,,mrcjkb
luasec,,,,,,flosse
+3 −3
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
{ lib
, lua
, wrapLua
, luarocks
, luarocks_bootstrap
, writeTextFile

# Whether the derivation provides a lua module or not.
@@ -91,7 +91,7 @@ let
  nativeBuildInputs = [
    lua  # for lua.h
    wrapLua
    luarocks
    luarocks_bootstrap
  ];

  inherit doCheck extraConfig rockspecFilename knownRockspec externalDeps nativeCheckInputs;
@@ -99,7 +99,7 @@ let
  buildInputs = let
    # example externalDeps': [ { name = "CRYPTO"; dep = pkgs.openssl; } ]
    externalDeps' = lib.filter (dep: !lib.isDerivation dep) self.externalDeps;
    in [ lua.pkgs.luarocks ]
    in [ luarocks_bootstrap ]
      ++ buildInputs
      ++ lib.optionals self.doCheck ([ luarocksCheckHook ] ++ self.nativeCheckInputs)
      ++ (map (d: d.dep) externalDeps')
+24 −0
Original line number Diff line number Diff line
@@ -1913,6 +1913,30 @@ buildLuarocksPackage {
  };
}) {};

luarocks = callPackage({ buildLuarocksPackage, fetchFromGitHub, fetchurl }:
buildLuarocksPackage {
  pname = "luarocks";
  version = "3.11.0-1";
  knownRockspec = (fetchurl {
    url    = "mirror://luarocks/luarocks-3.11.0-1.rockspec";
    sha256 = "0pi55445dskpw6nhrq52589h4v39fsf23c0kp8d4zg2qaf6y2n38";
  }).outPath;
  src = fetchFromGitHub {
    owner = "luarocks";
    repo = "luarocks";
    rev = "v3.11.0";
    hash = "sha256-mSwwBuLWoMT38iYaV/BTdDmmBz4heTRJzxBHC0Vrvc4=";
  };


  meta = {
    homepage = "http://www.luarocks.org";
    description = "A package manager for Lua modules.";
    maintainers = with lib.maintainers; [ mrcjkb teto ];
    license.fullName = "MIT";
  };
}) {};

luarocks-build-rust-mlua = callPackage({ buildLuarocksPackage, fetchFromGitHub, fetchurl }:
buildLuarocksPackage {
  pname = "luarocks-build-rust-mlua";
+30 −0
Original line number Diff line number Diff line
@@ -54,6 +54,8 @@
, vimPlugins
, vimUtils
, yajl
, zip
, unzip
, zlib
, zziplib
}:
@@ -407,6 +409,34 @@ in
    ];
  });


  # As a nix user, use this derivation instead of "luarocks_bootstrap"
  luarocks = prev.luarocks.overrideAttrs (oa: {

    nativeBuildInputs = oa.nativeBuildInputs ++ [ installShellFiles lua unzip ];
    # cmake is just to compile packages with "cmake" buildType, not luarocks itself
    dontUseCmakeConfigure = true;

    propagatedBuildInputs = [ zip unzip cmake ];

    postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
      installShellCompletion --cmd luarocks \
        --bash <($out/bin/luarocks completion bash) \
        --fish <($out/bin/luarocks completion fish) \
        --zsh <($out/bin/luarocks completion zsh)

      installShellCompletion --cmd luarocks-admin \
        --bash <($out/bin/luarocks-admin completion bash) \
        --fish <($out/bin/luarocks-admin completion fish) \
        --zsh <($out/bin/luarocks-admin completion zsh)
    '';

    meta = oa.meta // {
      mainProgram = "luarocks";
    };

  });

  luasec = prev.luasec.overrideAttrs (oa: {
    externalDeps = [
      { name = "OPENSSL"; dep = openssl; }
+9 −0
Original line number Diff line number Diff line
/*
This is a minimal/manual luarocks derivation used by `buildLuarocksPackage` to install lua packages.

As a nix user, you should use the generated lua.pkgs.luarocks that contains a luarocks manifest
which makes it recognizable to luarocks.
Generating the manifest for luarocks_bootstrap seemed too hackish, which is why we end up
with two "luarocks" derivations.

*/
{ lib
, stdenv
, fetchFromGitHub
Loading