diff mbox series

[bug#56729,RFC,v3,31/32] gnu: Add python-sagemath-standard.

Message ID 3cad701f74519f5e7562e45d7a938cf2d7d52ae9.1685391448.git.guix@ikherbers.com
State New
Headers show
Series Add sagemath. | expand

Commit Message

vicvbcun May 29, 2023, 8:38 p.m. UTC
* gnu/packages/sagemath.scm (python-sagemath-standard): New variable.
---

Notes:
    sage currently uses python's `sys.prefix' as
    `SAGE_VENV' (i.e. `/gnu/store/…-python-…' instead of
    `/gnu/store/…-sagemath-…'), causing a warning to be printed when running as
    notebook.
    
    `sage' unsets the `SAGE_VENV' environment variable and later tests if it is
    set and if this predictably is not the case uses `sage-venv-config' to
    determine `SAGE_VENV'.  `sage-venv-config' itself uses `sys.prefix'
    unconditionally as `SAGE_VENV'.
    
    Therefore, wrapping `sage' with a the appropriate value for `SAGE_VENV' does
    not work and would need patching.

 gnu/packages/sagemath.scm | 199 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 198 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/gnu/packages/sagemath.scm b/gnu/packages/sagemath.scm
index dfe5874ed3..4f23a7b7a0 100644
--- a/gnu/packages/sagemath.scm
+++ b/gnu/packages/sagemath.scm
@@ -4,6 +4,7 @@ 
 ;;; Copyright © 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
 ;;; Copyright © 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2023 vicvbcun <guix@ikherbers.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -25,6 +26,7 @@  (define-module (gnu packages sagemath)
   #:use-module (guix build-system copy)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system python)
+  #:use-module (guix build-system pyproject)
   #:use-module (guix build-system trivial)
   #:use-module (guix download)
   #:use-module (guix gexp)
@@ -38,13 +40,22 @@  (define-module (gnu packages sagemath)
   #:use-module (gnu packages bdw-gc)
   #:use-module (gnu packages boost)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages freedesktop)
+  #:use-module (gnu packages gd)
+  #:use-module (gnu packages graph)
+  #:use-module (gnu packages graphics)
+  #:use-module (gnu packages guile)
   #:use-module (gnu packages image)
   #:use-module (gnu packages lisp)
+  #:use-module (gnu packages m4)
+  #:use-module (gnu packages maths)
   #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages popt)
   #:use-module (gnu packages python)
-  #:use-module (gnu packages python-xyz))
+  #:use-module (gnu packages python-science)
+  #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages sqlite))
 
 
 (define-public python-cypari2
@@ -493,3 +504,189 @@  (define-public sagemath-data-polytopes-db
     (synopsis "Lists of 2- and 3-dimensional reflexive polytopes")
     (description synopsis)
     (license #f)))
+
+(define-public python-sagemath-standard
+  (package
+    (name "python-sagemath-standard")
+    (version "10.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/sagemath/sage")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "01nfpp3zh43kil7pqyrdvxyawmny0sc656kbg833c2l1y6iwppyc"))))
+    (build-system pyproject-build-system)
+    (arguments
+     (list #:tests? #f               ; tests are run in the `sagemath' package
+           #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'unpack 'prepare-build
+                 (lambda _
+                   (setenv "SAGE_NUM_THREADS"
+                           (number->string (parallel-job-count)))
+                   (setenv "SAGE_VENV" #$output)
+
+                   (setenv "PYTHONPATH" (string-append (getcwd) "/pkgs/sage-setup"))
+
+                   ;; broken symlink we don't need
+                   (delete-file "pkgs/sage-conf/bin/sage-env-config")
+                   (delete-file "pkgs/sage-conf_pypi/sage_root/configure")
+
+                   ;; Run this before 'ensure-no-mtimes-pre-1980 so that there
+                   ;; are no broken symlinks
+                   (with-directory-excursion "build/pkgs/sagelib"
+                     (let
+                         ((original-path (getenv "PATH")))
+                       (setenv "PATH" (string-append original-path ":../../bin"))
+                       (invoke "sh" "./bootstrap")
+                       (setenv "PATH" original-path)))))
+               (add-before 'build 'cd-to-src
+                 (lambda _
+                   (chdir "pkgs/sagemath-standard")))
+               ;; `setuptools' replaces shebangs that match `#!.*python.*' by
+               ;; the intepreter running it.  Unfortunately this also matches
+               ;; `sage-python'.  But using `sage-python' prevents a weird bug
+               ;; where python's `multiprocessing.resource_tracker' would
+               ;; execute `sage-runtests' instead of `python'.
+               (add-after 'install 'fix-shebangs
+                 (lambda _
+                   (let*
+                       ((bin (string-append #$output "/bin"))
+                        (sage-python (string-append bin "/sage-python")))
+                     (substitute* (find-files bin
+                                              ;; don't touch these to prevent cycles
+                                              ;; sage-num-threads.py -> sage-env -> sage
+                                              ;; sage-venv-config -> sage-python -> sage
+                                              (negate
+                                               (file-name-predicate (string-join '("^sage-coverage$"
+                                                                                   "^sage-num-threads\\.py$"
+                                                                                   "^sage-venv-config$")
+                                                                                 "|"))))
+                       ;; be careful that we don't substitute the newline
+                       ;; character
+                       (("^#!.*python-toolchain[^\n]*") (string-append "#!" sage-python))))))
+               (add-after 'install 'remove-unnecessary-scripts
+                 (lambda _
+                   (for-each
+                    delete-file
+                    (find-files (string-append #$output "/bin") "^sage-rebase"))))
+               (replace 'wrap
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   (let*
+                       ((python-path (search-path-as-string->list (getenv "GUIX_PYTHONPATH")))
+                        (python (dirname (search-input-file inputs "/bin/python3")))
+                        (coreutils (dirname (search-input-file inputs "/bin/readlink")))
+                        (sed (dirname (search-input-file inputs "/bin/sed")))
+                        (xdg-open (dirname (search-input-file inputs "/bin/xdg-open")))
+                        (maxima-version #$(package-version (this-package-input "maxima")))
+                        (maxima-fas (search-input-file inputs
+                                                       (string-append "/lib/maxima/"
+                                                                      maxima-version
+                                                                      "/binary-ecl/maxima.fas")))
+                        (combinatorial-design (search-input-directory inputs "/share/combinatorial_designs"))
+                        (conway-polynomials (search-input-directory inputs "/share/conway_polynomials"))
+                        (ellcurve (search-input-directory inputs "/share/ellcurves"))
+                        (cremona-mini (search-input-directory inputs "/share/cremona"))
+                        (graphs (search-input-directory inputs "/share/graphs"))
+                        (polytope (search-input-directory inputs "/share/reflexive_polytopes"))
+                        (gap-lib (search-input-directory inputs "/lib/gap"))
+                        (gap-share (search-input-directory inputs "/share/gap")))
+                     ;; wrap everything possible, all things with shebang
+                     ;; #!*/sage-* are still covered, as sage-* itself will be
+                     ;; wrapped
+                     (for-each
+                      (lambda (file)
+                        (false-if-exception
+                         (wrap-script file
+                           `("GUIX_PYTHONPATH" = ,python-path)
+                           `("PATH" prefix (,(string-append #$output "/bin") ,coreutils ,python ,sed ,xdg-open))
+                           `("MAXIMA_FAS" = (,maxima-fas))
+                           `("COMBINATORIAL_DESIGN_DATA_DIR" = (,combinatorial-design))
+                           `("CONWAY_POLYNOMIALS_DATA_DIR" = (,conway-polynomials))
+                           `("ELLCURVE_DATA_DIR" = (,ellcurve))
+                           `("CREMONA_MINI_DATA_DIR" = (,cremona-mini))
+                           `("GRAPHS_DATA_DIR" = (,graphs))
+                           `("POLYTOPE_DATA_DIR" = (,polytope))
+                           `("GAP_LIB_DIR" = (,gap-lib))
+                           `("GAP_SHARE_DIR" = (,gap-share)))))
+                      (find-files (string-append #$output "/bin")))))))))
+    (inputs (list arb
+                  boost
+                  brial
+                  cliquer
+                  coreutils
+                  edge-addition-planarity-suite
+                  gd
+                  givaro
+                  glpk
+                  gmp
+                  guile-3.0             ; for wrap-script
+                  iml
+                  libbraiding
+                  libhomfly
+                  linbox
+                  m4ri
+                  m4rie
+                  mpc
+                  mpfi
+                  python-cypari2
+                  python-gmpy2
+                  python-jinja2
+                  python-jupyter-core
+                  python-memory-allocator
+                  python-numpy
+                  python-pplpy
+                  rw
+                  sagemath-data-combinatorial-designs
+                  sagemath-data-conway-polynomials
+                  sagemath-data-elliptic-curves
+                  sagemath-data-graphs
+                  sagemath-data-polytopes-db
+                  sed
+                  symmetrica
+                  xdg-utils
+                  zlib))
+    (native-inputs (list m4 pkg-config python-cython))
+    (propagated-inputs (list cddlib
+                             ecl        ; also buildtime
+                             eclib      ; also buildtime
+                             flint      ; also buildtime
+                             gap        ; also buildtime
+                             gfan
+                             giac       ; also buildtime
+                             gmp-ecm    ; also buildtime
+                             gsl        ; also buildtime
+                             lcalc      ; also buildtime
+                             maxima
+                             mpfr
+                             nauty
+                             ntl        ; also buildtime
+                             openblas   ; also buildtime
+                             palp
+                             pari-gp    ; also buildtime
+                             pkg-config ; also buildtime (native)
+                             python-fpylll
+                             python-ipython
+                             python-ipywidgets
+                             python-lrcalc
+                             python-networkx
+                             python-pkgconfig
+                             python-primecountpy
+                             python-scipy
+                             python-sympy
+                             singular   ; also buildtime
+                             sqlite
+                             sympow
+                             tachyon))
+    (home-page "https://www.sagemath.org")
+    (synopsis "Python-based computer algebra system")
+    (description
+     "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.")
+    (license license:gpl3)))