nixpkgs/pkgs/applications/science/machine-learning/torch/torch-distro.nix

330 lines
9.2 KiB
Nix

{ luarocks, lib , stdenv, writeText , readline, makeWrapper,
less, ncurses, cmake, openblas, coreutils, fetchgit, libuuid, czmq, openssl,
gnuplot, fetchurl, lua, src, libjpeg, libpng
} :
let
common_meta = {
homepage = http://torch.ch;
license = stdenv.lib.licenses.bsd3;
maintainers = with stdenv.lib.maintainers; [ smironov ];
platforms = stdenv.lib.platforms.gnu;
};
distro_src = src;
default_luarocks = luarocks;
pkgs_gnuplot = gnuplot;
luapkgs = rec {
luarocks = default_luarocks.override {
inherit lua;
};
buildLuaRocks = { rockspec ? "", luadeps ? [] , buildInputs ? []
, preBuild ? "" , postInstall ? ""
, runtimeDeps ? [] , ... }@args :
let
luadeps_ =
luadeps ++
(lib.concatMap (d : if d ? luadeps then d.luadeps else []) luadeps);
runtimeDeps_ =
runtimeDeps ++
(lib.concatMap (d : if d ? runtimeDeps then d.runtimeDeps else []) luadeps) ++
[ lua coreutils ];
mkcfg = ''
export LUAROCKS_CONFIG=config.lua
cat >config.lua <<EOF
rocks_trees = {
{ name = [[system]], root = [[${luarocks}]] }
${lib.concatImapStrings (i : dep : ", { name = [[dep${toString i}]], root = [[${dep}]] }") luadeps_}
};
variables = {
LUA_BINDIR = "$out/bin";
LUA_INCDIR = "$out/include";
LUA_LIBDIR = "$out/lib/lua/${lua.luaversion}";
};
EOF
'';
in
stdenv.mkDerivation (args // {
inherit preBuild postInstall;
inherit luadeps runtimeDeps;
phases = [ "unpackPhase" "patchPhase" "buildPhase"];
buildInputs = runtimeDeps ++ buildInputs ++ [ makeWrapper lua ];
buildPhase = ''
eval "$preBuild"
${mkcfg}
eval "`${luarocks}/bin/luarocks --deps-mode=all --tree=$out path`"
${luarocks}/bin/luarocks make --deps-mode=all --tree=$out ${rockspec}
for p in $out/bin/*; do
wrapProgram $p \
--suffix LD_LIBRARY_PATH ';' "${lib.makeLibraryPath runtimeDeps_}" \
--suffix PATH ';' "${lib.makeBinPath runtimeDeps_}" \
--suffix LUA_PATH ';' "\"$LUA_PATH\"" \
--suffix LUA_PATH ';' "\"$out/share/lua/${lua.luaversion}/?.lua;$out/share/lua/${lua.luaversion}/?/init.lua\"" \
--suffix LUA_CPATH ';' "\"$LUA_CPATH\"" \
--suffix LUA_CPATH ';' "\"$out/lib/lua/${lua.luaversion}/?.so;$out/lib/lua/${lua.luaversion}/?/init.so\""
done
eval "$postInstall"
'';
});
# FIXME: doesn't installs lua-files for some reason
# lua-cjson = buildLuaPackage {
# name = "lua-cjson";
# src = ./extra/lua-cjson;
# rockspec = "lua-cjson-2.1devel-1.rockspec";
# };
lua-cjson = stdenv.mkDerivation rec {
name = "lua-cjson";
src = "${distro_src}/extra/lua-cjson";
preConfigure = ''
makeFlags="PREFIX=$out LUA_LIBRARY=$out/lib/lua"
'';
buildInputs = [lua];
installPhase = ''
make install-extra $makeFlags
'';
};
luafilesystem = buildLuaRocks {
name = "filesystem";
src = "${distro_src}/extra/luafilesystem";
luadeps = [lua-cjson];
rockspec = "rockspecs/luafilesystem-1.6.3-1.rockspec";
};
penlight = buildLuaRocks {
name = "penlight";
src = "${distro_src}/extra/penlight";
luadeps = [luafilesystem];
};
luaffifb = buildLuaRocks {
name = "luaffifb";
src = "${distro_src}/extra/luaffifb";
};
sundown = buildLuaRocks rec {
name = "sundown";
src = "${distro_src}/pkg/sundown";
rockspec = "rocks/${name}-scm-1.rockspec";
};
cwrap = buildLuaRocks rec {
name = "cwrap";
src = "${distro_src}/pkg/cwrap";
rockspec = "rocks/${name}-scm-1.rockspec";
};
paths = buildLuaRocks rec {
name = "paths";
src = "${distro_src}/pkg/paths";
buildInputs = [cmake];
rockspec = "rocks/${name}-scm-1.rockspec";
};
torch = buildLuaRocks rec {
name = "torch";
src = "${distro_src}/pkg/torch";
luadeps = [ paths cwrap ];
buildInputs = [ cmake ];
rockspec = "rocks/torch-scm-1.rockspec";
preBuild = ''
substituteInPlace ${rockspec} \
--replace '"sys >= 1.0"' ' '
export LUA_PATH="$src/?.lua;$LUA_PATH"
'';
meta = common_meta // {
description = "Torch is a machine-learning library";
longDescription = ''
Torch is the main package in [Torch7](http://torch.ch) where data
structures for multi-dimensional tensors and mathematical operations
over these are defined. Additionally, it provides many utilities for
accessing files, serializing objects of arbitrary types and other
useful utilities.
'';
};
};
dok = buildLuaRocks rec {
name = "dok";
src = "${distro_src}/pkg/dok";
luadeps = [sundown];
rockspec = "rocks/${name}-scm-1.rockspec";
};
sys = buildLuaRocks rec {
name = "sys";
luadeps = [torch];
buildInputs = [readline cmake];
src = "${distro_src}/pkg/sys";
rockspec = "sys-1.1-0.rockspec";
preBuild = ''
export Torch_DIR=${torch}/share/cmake/torch
'';
};
xlua = buildLuaRocks rec {
name = "xlua";
luadeps = [torch sys];
src = "${distro_src}/pkg/xlua";
rockspec = "xlua-1.0-0.rockspec";
};
nn = buildLuaRocks rec {
name = "nn";
luadeps = [torch luaffifb];
buildInputs = [cmake];
src = "${distro_src}/extra/nn";
rockspec = "rocks/nn-scm-1.rockspec";
preBuild = ''
export Torch_DIR=${torch}/share/cmake/torch
'';
};
graph = buildLuaRocks rec {
name = "graph";
luadeps = [ torch ];
buildInputs = [cmake];
src = "${distro_src}/extra/graph";
rockspec = "rocks/graph-scm-1.rockspec";
preBuild = ''
export Torch_DIR=${torch}/share/cmake/torch
'';
};
nngraph = buildLuaRocks rec {
name = "nngraph";
luadeps = [ torch nn graph ];
buildInputs = [cmake];
src = "${distro_src}/extra/nngraph";
preBuild = ''
export Torch_DIR=${torch}/share/cmake/torch
'';
};
image = buildLuaRocks rec {
name = "image";
luadeps = [ torch dok sys xlua ];
buildInputs = [cmake libjpeg libpng];
src = "${distro_src}/pkg/image";
rockspec = "image-1.1.alpha-0.rockspec";
preBuild = ''
export Torch_DIR=${torch}/share/cmake/torch
'';
};
optim = buildLuaRocks rec {
name = "optim";
luadeps = [ torch ];
buildInputs = [cmake];
src = "${distro_src}/pkg/optim";
rockspec = "optim-1.0.5-0.rockspec";
preBuild = ''
export Torch_DIR=${torch}/share/cmake/torch
'';
};
gnuplot = buildLuaRocks rec {
name = "gnuplot";
luadeps = [ torch paths ];
runtimeDeps = [ pkgs_gnuplot less ];
src = "${distro_src}/pkg/gnuplot";
rockspec = "rocks/gnuplot-scm-1.rockspec";
};
unsup = buildLuaRocks rec {
name = "unsup";
luadeps = [ torch xlua optim ];
buildInputs = [ cmake ];
src = fetchgit {
url = "https://github.com/koraykv/unsup";
rev = "1d4632e716dc3c82feecc7dd4b22549df442859f";
sha256 = "0npjq3y1cfmk026sdijcw3f766innrmb3qggnxsz62grczhfvgls";
};
rockspec = "unsup-0.1-0.rockspec";
preBuild = ''
export Torch_DIR=${torch}/share/cmake/torch
'';
};
trepl = buildLuaRocks rec {
name = "trepl";
luadeps = [torch gnuplot paths penlight graph nn nngraph image gnuplot optim sys dok unsup];
runtimeDeps = [ ncurses readline ];
src = "${distro_src}/exe/trepl";
meta = common_meta // {
description = "A pure Lua REPL for Lua(JIT), with heavy support for Torch types.";
};
};
lbase64 = buildLuaRocks rec {
name = "lbase64";
src = fetchgit {
url = "https://github.com/LuaDist2/lbase64";
rev = "1e9e4f1e0bf589a0ed39f58acc185ec5e213d207";
sha256 = "1i1fpy9v6r4w3lrmz7bmf5ppq65925rv90gx39b3pykfmn0hcb9c";
};
};
luuid = stdenv.mkDerivation rec {
name = "luuid";
src = fetchgit {
url = "https://github.com/LuaDist/luuid";
sha256 = "062gdf1rild11jg46vry93hcbb36b4527pf1dy7q9fv89f7m2nav";
};
preConfigure = ''
cmakeFlags="-DLUA_LIBRARY=${lua}/lib/lua/${lua.luaversion} -DINSTALL_CMOD=$out/lib/lua/${lua.luaversion} -DINSTALL_MOD=$out/lib/lua/${lua.luaversion}"
'';
buildInputs = [cmake libuuid lua];
meta = {
# FIXME: set the exact revision for src
broken = true;
};
};
# Doesn't work due to missing deps (according to luarocs).
itorch = buildLuaRocks rec {
name = "itorch";
luadeps = [torch gnuplot paths penlight graph nn nngraph image gnuplot
optim sys dok lbase64 lua-cjson luuid];
buildInputs = [czmq openssl];
src = "${distro_src}/extra/iTorch";
meta = {
# FIXME: figure out whats wrong with deps
broken = true;
};
};
};
in
luapkgs