summary refs log tree commit diff
path: root/pkgs/applications/science/math/sage/default.nix
blob: 63b751b814ee1b7a0486f23fb1af36ff2d68a978 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
{ nixpkgs
, withDoc ? false
}:

let
  inherit (nixpkgs) fetchpatch fetchurl symlinkJoin 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;
  }