summary refs log tree commit diff
path: root/pkgs/applications/science/math/sage/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/applications/science/math/sage/default.nix')
-rw-r--r--pkgs/applications/science/math/sage/default.nix423
1 files changed, 202 insertions, 221 deletions
diff --git a/pkgs/applications/science/math/sage/default.nix b/pkgs/applications/science/math/sage/default.nix
index 7f101bac147e..9ad112213ffd 100644
--- a/pkgs/applications/science/math/sage/default.nix
+++ b/pkgs/applications/science/math/sage/default.nix
@@ -1,230 +1,211 @@
-# TODO
-# - consider writing a script to convert spkgs to nix packages, similar to vim
-#   or cabal2nix. This would allow a more efficient and "cleaner" build, greater
-#   flexibility and the possibility to select which dependencies to add and which
-#   to remove. It would also allow to use system packages for some dependencies
-#   and recompile others (optimized for the system) without recompiling everything.
-# - add optdeps:
-#   - imagemagick
-#   - texlive full for documentation
-#   - ...
-# - further seperate build outputs. Also maybe run `make doc`.
-#   Configure flags like --bindir and --libdir oculd also be used for that, see
-#   ./configure --help`.
-
-# Other resources:
-# - https://wiki.debian.org/DebianScience/Sage
-# - https://github.com/cschwan/sage-on-gentoo
-# - https://git.archlinux.org/svntogit/community.git/tree/trunk?h=packages/sagemath
-
-{ stdenv
-, bash
-, fetchurl
-, perl
-, gfortran6
-, python
-, autoreconfHook
-, gettext
-, which
-, texlive
-, texinfo
-, hevea
-, buildDocs ? false
-, optimize ? false # optimize sage to the current system (obviously impure)
+{ nixpkgs
+, withDoc ? false
 }:
 
-stdenv.mkDerivation rec {
-  version = "8.1";
-  name = "sage-${version}";
-
-  # Modified version of patchShebangs that patches to the sage-internal version if possible
-  # and falls back to the system version if not.
-  patchSageShebangs = ./patchSageShebangs.sh;
-  src = fetchurl {
-    # Note that the source is *not* fetched from github, since that doesn't
-    # the upstream folder with all the source tarballs of the spkgs.
-    # If those are not present they are fetched at build time, which breaks
-    # when building in a sandbox (and probably only works if you install the
-    # latest sage version).
-    urls = [
-      "http://mirrors.mit.edu/sage/src/sage-${version}.tar.gz"
-      "ftp://ftp.fu-berlin.de/unix/misc/sage/src/sage-${version}.tar.gz"
-      "http://sagemath.polytechnic.edu.na/src/sage-${version}.tar.gz"
-      "ftp://ftp.sun.ac.za/pub/mirrors/www.sagemath.org/src/sage-${version}.tar.gz"
-      "http://sagemath.mirror.ac.za/src/sage-${version}.tar.gz"
-      "https://ftp.leg.uct.ac.za/pub/packages/sage/src/sage-${version}.tar.gz"
-      "http://mirror.ufs.ac.za/sagemath/src/sage-${version}.tar.gz"
-      "https://mirrors-usa.go-parts.com/sage/sagemath/src/sage-${version}.tar.gz"
-      "http://www.cecm.sfu.ca/sage/src/sage-${version}.tar.gz"
-      "http://files.sagemath.org/src/sage-${version}.tar.gz"
-      "https://mirrors.xmission.com/sage/src/sage-${version}.tar.gz"
-      "http://sagemath.c3sl.ufpr.br/src/sage-${version}.tar.gz"
-      "http://linorg.usp.br/sage/src/sage-${version}.tar.gz"
-      "http://mirror.hust.edu.cn/sagemath/src/sage-${version}.tar.gz"
-      "https://ftp.iitm.ac.in/sage/src/sage-${version}.tar.gz"
-      "http://ftp.kaist.ac.kr/sage/src/sage-${version}.tar.gz"
-      "https://ftp.riken.jp/sagemath/src/sage-${version}.tar.gz"
-      "https://mirrors.tuna.tsinghua.edu.cn/sagemath/src/sage-${version}.tar.gz"
-      "https://mirrors.ustc.edu.cn/sagemath/src/sage-${version}.tar.gz"
-      "http://ftp.tsukuba.wide.ad.jp/software/sage/src/sage-${version}.tar.gz"
-      "https://ftp.yz.yamagata-u.ac.jp/pub/math/sage/src/sage-${version}.tar.gz"
-      "https://mirror.yandex.ru/mirrors/sage.math.washington.edu/src/sage-${version}.tar.gz"
-      "https://mirror.aarnet.edu.au/pub/sage/src/sage-${version}.tar.gz"
-      "https://sage.mirror.garr.it/mirrors/sage/src/sage-${version}.tar.gz"
-      "https://www.mirrorservice.org/sites/www.sagemath.org/src/sage-${version}.tar.gz"
-      "http://mirror.switch.ch/mirror/sagemath/src/sage-${version}.tar.gz"
-      "https://mirrors.up.pt/pub/sage/src/sage-${version}.tar.gz"
-      "http://www-ftp.lip6.fr/pub/math/sagemath/src/sage-${version}.tar.gz"
-      "http://ftp.ntua.gr/pub/sagemath/src/sage-${version}.tar.gz"
-    ];
-    sha256 = "1cpcs1mr0yii64s152xmxyd450bfzjb22jjj0zh9y3n6g9alzpyq";
+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; };
+
+      # https://github.com/sagemath/sagenb/issues/437
+      flask-babel = super.flask-babel.overridePythonAttrs (attrs: rec {
+        version = "0.9";
+        src = attrs.src.override {
+          inherit version;
+          sha256 = "0k7vk4k54y55ma0nx2k5s0phfqbriwslhy5shh3b0d046q7ibzaa";
+        };
+        doCheck = false;
+      });
+
+      # 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;
+        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;
+        pkg-config = nixpkgs.pkgconfig; # not to confuse with pythonPackages.pkgconfig
+      };
+
+      sage-with-env = self.callPackage ./sage-with-env.nix {
+        inherit pari eclib pythonEnv;
+        inherit sage-src openblas-blas-pc openblas-cblas-pc openblas-lapack-pc pynac singular;
+        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;
+      };
+    };
   };
 
-  postPatch = ''
-    substituteAllInPlace src/bin/sage-env
-    bash=${bash} substituteAllInPlace build/bin/sage-spkg
-  '';
-
-  installPhase = ''
-    # Sage installs during first `make`, `make install` is no-op and just takes time.
-  '';
-
-  outputs = [ "out" ] ++ stdenv.lib.optionals (buildDocs) [ "doc" ];
-
-  buildInputs = [
-    bash # needed for the build
-    perl # needed for the build
-    python # needed for the build
-    gfortran6 # needed to build giac, openblas
-    autoreconfHook # needed to configure sage with prefix
-    gettext # needed to build the singular spkg
-    which # needed in configure of mpir
-    texinfo # needed to build maxima
-  ] ++ stdenv.lib.optionals(buildDocs) [
-    hevea # needed to build the docs of the giac spkg
-    (texlive.combine { inherit (texlive)
-      scheme-basic
-      collection-pstricks # needed by giac
-      times # font needed by giac
-      stmaryrd # needed by giac
-      babel-greek # optional for giac, otherwise throws a bunch of latex command not founds
-      ;
-    })
-  ];
-
-  nativeBuildInputs = [ gfortran6 perl which ];
-
-  patches = [
-    # fix usages of /bin/rm
-    ./spkg-singular.patch
-    # help python find the crypt library
-    # patches python3 and indirectly python2, since those installation files are symlinked
-    ./spkg-python.patch
-    # fix usages of /usr/bin/perl
-    ./spkg-git.patch
-    # fix usages of /bin/cp and add necessary argument to function call
-    ./spkg-giac.patch
-    # environment
-    ./env.patch
-    # adjust wrapper shebang and patch shebangs after each spkg build
-    ./shebangs.patch
+  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
   ];
 
-  enableParallelBuilding = true;
+  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";
+      };
+    });
+  };
 
-  hardeningDisable = [
-    "format" # needed to build palp, for lines like `printf(ctime(&_NFL->TIME))`
-    # TODO could be patched with `sed s|printf(ctime(\(.*\)))|%s... or fixed upstream
-  ];
+  # update causes issues
+  # https://groups.google.com/forum/#!topic/sage-packaging/cS3v05Q0zso
+  # https://trac.sagemath.org/ticket/24735
+  singular = nixpkgs.singular.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; };
+
+  eclib = nixpkgs.eclib.override { inherit pari; };
+
+  # 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; };
+
+  # 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; })
+    ];
+  };
 
-  configureFlags = stdenv.lib.optionals(buildDocs) [ "--docdir=$(doc)" ];
-  preConfigure = ''
-    export SAGE_NUM_THREADS="$NIX_BUILD_CORES"
-
-    export HOME=/tmp/sage-home
-    export SAGE_ROOT="$PWD"
-    export SAGE_SRC="$PWD"
-
-    mkdir -p "$HOME"
-    mkdir -p "$out"
-
-    # we need to keep the source around
-    dir="$PWD"
-    cd ..
-    mv "$dir" "$out/sage-root"
-
-    export SAGE_SPKG_INSTALL_DOCS='no'
-    cd "$out/sage-root" # build in target dir, since `make` is also `make install`
-  ''
-  + stdenv.lib.optionalString (buildDocs) ''
-    mkdir -p "$doc"
-    export SAGE_DOC="$doc"
-    export SAGE_DOCBUILD_OPTS="--no-pdf-links -k"
-  ''
-  + stdenv.lib.optionalString (!optimize) ''
-    export SAGE_FAT_BINARY=yes
-  '';
-
-  buildFlags = if (buildDocs) then "doc" else "build";
-
-  # for reference: http://doc.sagemath.org/html/en/installation/source.html
-  preBuild = ''
-    # symlink python to make sure the shebangs are patched to the sage path
-    # while still being able to use python before building it
-    # (this is important because otherwise sage will try to install python
-    # packages globally later on)
-    ln -s "${python}/bin/python2" $out/bin/python2
-    ln -s "$out/bin/python2" $out/bin/python
-    touch $out/bin/python3
-    bash $patchSageShebangs .
-  '';
-
-  postBuild = ''
-    # Clean up
-    rm -r "$out/sage-root/upstream" # don't keep the sources of all the spkgs
-    rm -rf "$out/sage-root/src/build"
-    rm -rf "$out/sage-root/src/autom4te.cache"
-    rm -rf "$out/sage-root/src/config"
-    rm -rf "$out/sage-root/src/m4"
-    rm -rf "$out/sage-root/.git"
-    rm -r "$out/sage-root/logs"
-    rm -r "$out"/lib/python*/test
-    # Fix dependency cycle between out and doc
-    rm -f "$out/sage-root/config.log"
-    rm -f "$out/sage-root/config.status"
-    rm -f "$out/sage-root/build/make/Makefile-auto"
-    rm -f "$out/sage-home/.sage/gap/libgap-workspace-"*
-    # Make sure unnessessary packages don't end up in the build closure
-    find "$out" \
-        -iname 'config.log' \
-        -delete \
-        -or -iname 'Makefile' \
-        -delete
-    rm -f "$out/lib/R/etc/Renviron"
-    # Make sure all shebangs are properly patched
-    bash $patchSageShebangs $out
-  '';
-
-  # TODO there are some doctest failures, which seem harmless.
-  # We should figure out a way to fix the failures or ignore only those tests.
-  doCheck = false;
-
-  checkTarget = "ptestalllong"; # all long tests in parallell
-  preCheck = ''
-    export SAGE_TIMEOUT=0 # no timeout
-    export SAGE_TIMEOUT_LONG=0 # no timeout
-  '';
-
-  meta = {
-    homepage = http://www.sagemath.org;
-    description = "A free open source mathematics software system";
-    # taken from the homepage
-    longDescription = ''
-      SageMath is a free open-source mathematics software system licensed under the GPL. It builds on top of many existing open-source packages: NumPy, SciPy, matplotlib, Sympy, Maxima, GAP, FLINT, R and many more. Access their combined power through a common, Python-based language or directly via interfaces or wrappers.
-      Mission: Creating a viable free open source alternative to Magma, Maple, Mathematica and Matlab.
-    '';
-    license = stdenv.lib.licenses.gpl2Plus;
-    platforms = ["x86_64-linux" "i686-linux"];
-    maintainers = with stdenv.lib.maintainers; [ timokau ];
+  # 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;
+  }