nixpkgs/pkgs/applications/science/math/sage/default.nix
Timo Kaufmann cad446513e ntl: 9.11.0 -> 11.2.1
ntl hasn't been updated in a while. So I'm doing that and adding myself
as the maintainer. I'm also adding some options and pinning the sage
dependency, since it is unfortunately not compatible with the latest ntl
yet.

I've also enabled the tests, since they don't take terribly long and are
worth the time in my opinion.
2018-07-18 14:58:38 +02:00

214 lines
7.7 KiB
Nix

{ nixpkgs
, withDoc ? false
}:
let
inherit (nixpkgs) fetchpatch fetchurl symlinkJoin fetchFromGitHub callPackage nodePackages_8_x;
# https://trac.sagemath.org/ticket/15980 for tracking of python3 support
python = nixpkgs.python2.override {
packageOverrides = self: super: {
cypari2 = super.cypari2.override { inherit pari; };
cysignals = super.cysignals.override { inherit pari; };
cvxopt = super.cvxopt.override { inherit glpk; };
# python packages that appear unmaintained and were not accepted into the nixpkgs
# tree because of that. These packages are only dependencies of the more-or-less
# deprecated sagenb. However sagenb is still a default dependency and the doctests
# depend on it.
# See https://github.com/NixOS/nixpkgs/pull/38787 for a discussion.
flask-oldsessions = self.callPackage ./flask-oldsessions.nix {};
flask-openid = self.callPackage ./flask-openid.nix {};
python-openid = self.callPackage ./python-openid.nix {};
pybrial = self.callPackage ./pybrial.nix {};
sagelib = self.callPackage ./sagelib.nix {
inherit flint ecl pari glpk eclib ntl arb;
inherit sage-src openblas-blas-pc openblas-cblas-pc openblas-lapack-pc pynac singular;
linbox = nixpkgs.linbox.override { withSage = true; };
};
sagenb = self.callPackage ./sagenb.nix {
mathjax = nodePackages_8_x.mathjax;
};
sagedoc = self.callPackage ./sagedoc.nix {
inherit sage-src;
};
env-locations = self.callPackage ./env-locations.nix {
inherit pari_data ecl pari;
inherit singular;
three = nodePackages_8_x.three;
mathjax = nodePackages_8_x.mathjax;
};
sage-env = self.callPackage ./sage-env.nix {
inherit sage-src python rWrapper openblas-cblas-pc glpk ecl singular eclib pari palp flint pynac pythonEnv giac ntl;
pkg-config = nixpkgs.pkgconfig; # not to confuse with pythonPackages.pkgconfig
};
sage-with-env = self.callPackage ./sage-with-env.nix {
inherit pari eclib pythonEnv ntl;
inherit sage-src openblas-blas-pc openblas-cblas-pc openblas-lapack-pc pynac singular giac;
pkg-config = nixpkgs.pkgconfig; # not to confuse with pythonPackages.pkgconfig
three = nodePackages_8_x.three;
};
sage = self.callPackage ./sage.nix { };
sage-wrapper = self.callPackage ./sage-wrapper.nix {
inherit sage-src withDoc;
};
};
};
openblas-blas-pc = callPackage ./openblas-pc.nix { name = "blas"; };
openblas-cblas-pc = callPackage ./openblas-pc.nix { name = "cblas"; };
openblas-lapack-pc = callPackage ./openblas-pc.nix { name = "lapack"; };
sage-src = callPackage ./sage-src.nix {};
pythonRuntimeDeps = with python.pkgs; [
sagelib
pybrial
sagenb
cvxopt
networkx
service-identity
psutil
sympy
fpylll
matplotlib
scipy
ipywidgets
rpy2
sphinx
typing
pillow
];
pythonEnv = python.buildEnv.override {
extraLibs = pythonRuntimeDeps;
ignoreCollisions = true;
} // { extraLibs = pythonRuntimeDeps; }; # make the libs accessible
# needs to be rWrapper, standard "R" doesn't include default packages
rWrapper = nixpkgs.rWrapper.override {
# https://trac.sagemath.org/ticket/25674
R = nixpkgs.R.overrideAttrs (attrs: rec {
name = "R-3.4.4";
src = fetchurl {
url = "http://cran.r-project.org/src/base/R-3/${name}.tar.gz";
sha256 = "0dq3jsnwsb5j3fhl0wi3p5ycv8avf8s5j1y4ap3d2mkjmcppvsdk";
};
});
};
# https://trac.sagemath.org/ticket/25532
ntl = nixpkgs.ntl.overrideAttrs (oldAttrs: rec {
name = "ntl-10.5.0";
sourceRoot = "${name}/src";
src = fetchurl {
url = "http://www.shoup.net/ntl/${name}.tar.gz";
sha256 = "1lmldaldgfr2b2a6585m3np5ds8bq1bis2s1ajycjm49vp4kc2xr";
};
});
giac = nixpkgs.giac.override { inherit ntl; };
arb = nixpkgs.arb.override { inherit flint; };
# update causes issues
# https://groups.google.com/forum/#!topic/sage-packaging/cS3v05Q0zso
# https://trac.sagemath.org/ticket/24735
singular = (nixpkgs.singular.override { inherit ntl flint; }).overrideAttrs (oldAttrs: {
name = "singular-4.1.0p3";
src = fetchurl {
url = "http://www.mathematik.uni-kl.de/ftp/pub/Math/Singular/SOURCES/4-1-0/singular-4.1.0p3.tar.gz";
sha256 = "105zs3zk46b1cps403ap9423rl48824ap5gyrdgmg8fma34680a4";
};
});
# *not* to confuse with the python package "pynac"
# https://trac.sagemath.org/ticket/24838 (depends on arb update)
pynac = nixpkgs.pynac.override { inherit singular flint; };
eclib = nixpkgs.eclib.override { inherit pari ntl; };
# With openblas (64 bit), the tests fail the same way as when sage is build with
# openblas instead of openblasCompat. Apparently other packages somehow use flints
# blas when it is available. Alternative would be to override flint to use
# openblasCompat.
flint = nixpkgs.flint.override { withBlas = false; inherit ntl; };
# Multiple palp dimensions need to be available and sage expects them all to be
# in the same folder.
palp = symlinkJoin {
name = "palp-${nixpkgs.palp.version}";
paths = [
(nixpkgs.palp.override { dimensions = 4; doSymlink = false; })
(nixpkgs.palp.override { dimensions = 5; doSymlink = false; })
(nixpkgs.palp.override { dimensions = 6; doSymlink = true; })
(nixpkgs.palp.override { dimensions = 11; doSymlink = false; })
];
};
# Sage expects those in the same directory.
pari_data = symlinkJoin {
name = "pari_data";
paths = with nixpkgs; [
pari-galdata
pari-seadata-small
];
};
# https://trac.sagemath.org/ticket/22191
ecl = nixpkgs.ecl_16_1_2;
# sage currently uses an unreleased version of pari
pari = (nixpkgs.pari.override { withThread = false; }).overrideAttrs (attrs: rec {
version = "2.10-1280-g88fb5b3"; # on update remove pari-stackwarn patch from `sage-src.nix`
src = fetchurl {
url = "mirror://sageupstream/pari/pari-${version}.tar.gz";
sha256 = "19gbsm8jqq3hraanbmsvzkbh88iwlqbckzbnga3y76r7k42akn7m";
};
});
# https://trac.sagemath.org/ticket/24824
glpk = nixpkgs.glpk.overrideAttrs (attrs: rec {
version = "4.63";
name = "glpk-${version}";
src = fetchurl {
url = "mirror://gnu/glpk/${name}.tar.gz";
sha256 = "1xp7nclmp8inp20968bvvfcwmz3mz03sbm0v3yjz8aqwlpqjfkci";
};
patches = (attrs.patches or []) ++ [
# Alternatively patch sage with debians
# https://sources.debian.org/data/main/s/sagemath/8.1-7/debian/patches/t-version-glpk-4.60-extra-hack-fixes.patch
# The header of that debian patch contains a good description of the issue. The gist of it:
# > If GLPK in Sage causes one error, and this is caught by Sage and recovered from, then
# > later (because upstream GLPK does not clear the "error" flag) Sage will append
# > all subsequent terminal output of GLPK into the error_message string but not
# > actually forward it to the user's terminal. This breaks some doctests.
(fetchpatch {
name = "error_recovery.patch";
url = "https://git.sagemath.org/sage.git/plain/build/pkgs/glpk/patches/error_recovery.patch?id=07d6c37d18811e2b377a9689790a7c5e24da16ba";
sha256 = "0z99z9gd31apb6x5n5n26411qzx0ma3s6dnznc4x61x86bhq31qf";
})
# Allow setting a exact verbosity level (OFF|ERR|ON|ALL|DBG)
(fetchpatch {
name = "exact_verbosity.patch";
url = "https://git.sagemath.org/sage.git/plain/build/pkgs/glpk/patches/glp_exact_verbosity.patch?id=07d6c37d18811e2b377a9689790a7c5e24da16ba";
sha256 = "15gm5i2alqla3m463i1qq6jx6c0ns6lip7njvbhp37pgxg4s9hx8";
})
];
});
in
python.pkgs.sage-wrapper // {
doc = python.pkgs.sagedoc;
lib = python.pkgs.sagelib;
}