gnu: atlas: Try to fix build on MIPS.
[jackhill/guix/guix.git] / gnu / packages / maths.scm
index 7746863..cc068b9 100644 (file)
@@ -3,6 +3,8 @@
 ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2014 John Darrington <jmd@gnu.org>
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2014 Federico Beffa <beffa@fbengineering.ch>
+;;; Copyright © 2014 Mathieu Lirzin <mathieu.lirzin@openmailbox.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,9 +22,9 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages maths)
+  #:use-module (ice-9 regex)
   #:use-module (gnu packages)
-  #:use-module ((guix licenses)
-                #:renamer (symbol-prefix-proc 'license:))
+  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix utils)
@@ -58,6 +60,7 @@
   #:use-module (gnu packages python)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages tcsh)
+  #:use-module (gnu packages tcl)
   #:use-module (gnu packages texinfo)
   #:use-module (gnu packages texlive)
   #:use-module (gnu packages xml))
@@ -83,6 +86,29 @@ effectively as a scientific calculator.")
    (license license:gpl3+)
    (home-page "http://www.gnu.org/software/units/")))
 
+(define-public dionysus
+  (package
+    (name "dionysus")
+    (version "1.3.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/dionysus/dionysus-" version
+                                  ".tar.gz"))
+              (sha256
+               (base32
+                "1aqnvw6z33bzqgd1ga571pnx6vq2zrkckm1cz91grv45h4jr9vgs"))))
+    (build-system gnu-build-system)
+    (inputs `(("tcl" ,tcl)))                      ;for 'tclsh'
+    (synopsis "Local search for universal constants and scientific values")
+    (description
+     "GNU Dionysus is a convenient system for quickly retrieving the values of
+mathematical constants used in science and engineering.  Values can be
+searched using a simple command-line tool, choosing from three databases:
+universal constants, atomic numbers, and constants related to
+semiconductors.")
+    (license license:gpl3+)
+    (home-page "http://www.gnu.org/software/dionysus/")))
+
 (define-public gsl
   (package
     (name "gsl")
@@ -150,7 +176,7 @@ LP/MIP solver is included in the package.")
 (define-public pspp
   (package
     (name "pspp")
-    (version "0.8.3")
+    (version "0.8.4")
     (source
      (origin
       (method url-fetch)
@@ -158,7 +184,7 @@ LP/MIP solver is included in the package.")
                           version ".tar.gz"))
       (sha256
        (base32
-        "0vri2pzvmm38qaihfvwlry30f40lcnps4blg59ixic4q20ldxf5d"))))
+        "0b65q45x05ps95pph6glbg7ymdr638nfb0rk9x5x9qm5k073pk5z"))))
     (build-system gnu-build-system)
     (inputs
      `(("cairo" ,cairo)
@@ -179,11 +205,11 @@ LP/MIP solver is included in the package.")
     (synopsis "Statistical analysis")
     (description
      "GNU PSPP is a statistical analysis program.  It can perform
-descriptive statistics, T-tests, linear regression and non-parametric tests. 
-It features both a graphical interface as well as command-line input. PSPP is
-designed to interoperate with Gnumeric, LibreOffice and OpenOffice.  Data can
-be imported from spreadsheets, text files and database sources and it can be
-output in text, PostScript, PDF or HTML.")
+descriptive statistics, T-tests, linear regression and non-parametric tests.
+It features both a graphical interface as well as command-line input.  PSPP
+is designed to interoperate with Gnumeric, LibreOffice and OpenOffice.  Data
+can be imported from spreadsheets, text files and database sources and it can
+be output in text, PostScript, PDF or HTML.")
     (license license:gpl3+)))
 
 (define-public lapack
@@ -241,9 +267,9 @@ problems in numerical linear algebra.")
     (home-page "http://www.gnuplot.info")
     (synopsis "Command-line driven graphing utility")
     (description "Gnuplot is a portable command-line driven graphing
-utility. It was originally created to allow scientists and students to
+utility.  It was originally created to allow scientists and students to
 visualize mathematical functions and data interactively, but has grown to
-support many non-interactive uses such as web scripting. It is also used as a
+support many non-interactive uses such as web scripting.  It is also used as a
 plotting engine by third-party applications like Octave.")
     ;;  X11 Style with the additional restriction that derived works may only be
     ;;  distributed as patches to the original.
@@ -273,7 +299,7 @@ plotting engine by third-party applications like Octave.")
          %standard-phases)))
     (outputs '("out" "bin" "lib" "include"))
     (home-page "http://www.hdfgroup.org")
-    (synopsis "Management suite for  extremely large and complex data")
+    (synopsis "Management suite for extremely large and complex data")
     (description "HDF5 is a suite that makes possible the management of
 extremely large and complex data collections.")
     (license (license:x11-style
@@ -472,6 +498,7 @@ scientific applications modeled by partial differential equations.")
 
 (define-public petsc-complex
   (package (inherit petsc)
+    (location (source-properties->location (current-source-location)))
     (name "petsc-complex")
     (arguments
      (substitute-keyword-arguments (package-arguments petsc)
@@ -835,7 +862,7 @@ to BMP, JPEG or PNG image formats.")
 (define-public maxima
   (package
     (name "maxima")
-    (version "5.33.0")
+    (version "5.34.1")
     (source
      (origin
        (method url-fetch)
@@ -843,19 +870,60 @@ to BMP, JPEG or PNG image formats.")
                            version "-source/" name "-" version ".tar.gz"))
        (sha256
         (base32
-         "13axm11xw0f3frx5b0qdidi7igkn1524fzz77s9rbpl2yy2nrbz2"))))
+         "1dw9vfzldpj7lv303xbw0wpyn6ra6i2yzwlrjbcx7j0jm5n43ji0"))))
     (build-system gnu-build-system)
+    (inputs
+     `(("gcl" ,gcl)
+       ("gnuplot" ,gnuplot)                       ;for plots
+       ("tk" ,tk)))                               ;Tcl/Tk is used by 'xmaxima'
+    (native-inputs
+     `(("texinfo" ,texinfo)
+       ("perl" ,perl)))
     (arguments
-     `(#:phases (alist-cons-before
+     `(#:configure-flags
+       (list "--enable-gcl"
+             (string-append "--with-posix-shell="
+                            (assoc-ref %build-inputs "bash")
+                            "/bin/sh")
+             (string-append "--with-wish="
+                            (assoc-ref %build-inputs "tk")
+                            "/bin/wish"
+                            (let ((v ,(package-version tk)))
+                              (string-take v (string-index-right v #\.)))))
+       ;; By default Maxima attempts to write temporary files to
+       ;; '/tmp/nix-build-maxima-5.34.1', which doesn't exist.  Work around
+       ;; that.
+       #:make-flags (list "TMPDIR=/tmp")
+       #:phases (alist-cons-before
                  'check 'pre-check
-                 (lambda _ 
+                 (lambda _
                    (chmod "src/maxima" #o555))
-                 %standard-phases)))
-    (inputs 
-     `(("gcl" ,gcl)))
-    (native-inputs 
-     `(("texinfo" ,texinfo)
-       ("perl" ,perl)))
+                 ;; Make sure the doc and emacs files are found in the
+                 ;; standard location.  Also configure maxima to find gnuplot
+                 ;; without having it on the PATH.
+                 (alist-cons-after
+                  'install 'post-install
+                  (lambda* (#:key outputs inputs #:allow-other-keys)
+                    (let* ((gnuplot (assoc-ref inputs "gnuplot"))
+                          (out (assoc-ref outputs "out"))
+                          (datadir (string-append out "/share/maxima/" ,version)))
+                      (with-directory-excursion out
+                        (mkdir-p "share/emacs")
+                        (mkdir-p "share/doc")
+                        (symlink
+                         (string-append datadir "/emacs/")
+                         (string-append out "/share/emacs/site-lisp"))
+                        (symlink
+                         (string-append datadir "/doc/")
+                         (string-append out "/share/doc/maxima"))
+                        (with-atomic-file-replacement
+                         (string-append datadir "/share/maxima-init.lisp")
+                         (lambda (in out)
+                           (format out "~a ~s~a~%"
+                                   "(setf $gnuplot_command "
+                                   (string-append gnuplot "/bin/gnuplot") ")")
+                           (dump-port in out))))))
+                  %standard-phases))))
     (home-page "http://maxima.sourceforge.net")
     (synopsis "Numeric and symbolic expression manipulation")
     (description "Maxima is a system for the manipulation of symbolic and
@@ -867,4 +935,131 @@ point numbers")
     ;; version (which implicitly means gpl1+).
     ;; At least one file (src/maxima.asd) says "version 2."
     ;; GPLv2 only is therefore the smallest subset.
-    (license license:gpl2))) 
+    (license license:gpl2)))
+
+(define-public atlas
+  (package
+    (name "atlas")
+    (version "3.10.2")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://sourceforge/math-atlas/atlas"
+                                  version ".tar.bz2"))
+              (sha256
+               (base32
+                "0bqh4bdnjdyww4mcpg6kn0x7338mfqbdgysn97dzrwwb26di7ars"))))
+    (build-system gnu-build-system)
+    (home-page "http://math-atlas.sourceforge.net/")
+    (inputs `(("gfortran" ,gfortran-4.8)
+              ("lapack-tar" ,(package-source lapack))))
+    (outputs '("out" "doc"))
+    (arguments
+     `(#:parallel-build? #f
+       #:parallel-tests? #f
+
+       ;; ATLAS tunes itself for the machine it is built on, as explained at
+       ;; <http://lists.gnu.org/archive/html/guix-devel/2014-10/msg00305.html>.
+       ;; For this reason, we want users to build it locally instead of using
+       ;; substitutes.
+       #:substitutable? #f
+
+       #:modules ((srfi srfi-26)
+                  (srfi srfi-1)
+                  (guix build gnu-build-system)
+                  (guix build utils))
+       #:configure-flags 
+       `(;; Generate position independent code suitable for dynamic libraries
+         ;; and use WALL timer to get more accurate timing.
+         "-Fa" "alg" "-fPIC" "-D" "c" "-DWALL"
+         ;; Set word width.
+         "-b"
+         ,,(if (string-match "64" (%current-system))
+               "64"
+               "32")
+         ;; Disable parallel build as it gives errors: atlas_pthread.h is
+         ;; needed to compile C files before it is generated.
+         "-Ss" "pmake" "make -j 1"
+         ;; Probe is failing for MIPS.  We therefore define the system
+         ;; architecture explicitly by setting (-A) MACHINETYPE = 49
+         ;; 'MIPSR1xK' and (-V) ISA = 1 'none'.
+         ,,@(if (string-prefix? "mips" (%current-system))
+              (list "-A" "49" "-V" "1")
+              (list))
+         ;; Generate shared libraries.
+         "--shared"
+         ;; Build a full LAPACK library.
+         ,(string-append "--with-netlib-lapack-tarfile="
+                         (assoc-ref %build-inputs "lapack-tar")))
+       #:phases
+        (alist-cons-after
+         'install 'install-doc
+         (lambda* (#:key outputs inputs #:allow-other-keys)
+           (let ((doc (string-append (assoc-ref outputs "doc") 
+                                     "/share/doc/atlas")))
+             (mkdir-p doc)
+             (fold (lambda (file previous) 
+                     (and previous (zero? (system* "cp" file doc))))
+                   #t (find-files "../ATLAS/doc" ".*"))))
+         (alist-cons-after
+          'check 'check-pt
+          (lambda _ (zero? (system* "make" "ptcheck")))
+          ;; Fix files required to run configure.
+          (alist-cons-before
+           'configure 'fix-/bin/sh
+           (lambda _
+             ;; Use `sh', not `/bin/sh'.
+             (substitute* (find-files "." "Makefile|configure|SpewMakeInc\\.c")
+               (("/bin/sh")
+                "sh")))
+           ;; Fix /bin/sh in generated make files.
+           (alist-cons-after
+            'configure 'fix-/bin/sh-in-generated-files
+            (lambda _
+              (substitute* (find-files "." "^[Mm]ake\\.inc.*")
+                (("/bin/sh")
+                 "sh")))
+            ;; ATLAS configure program does not accepts the default flags
+            ;; passed by the 'gnu-build-system'.
+            (alist-replace
+             'configure
+             (lambda* (#:key native-inputs inputs outputs
+                             (configure-flags '())
+                             #:allow-other-keys #:rest args)
+               (let* ((prefix     (assoc-ref outputs "out"))
+                      (bash       (or (and=> (assoc-ref
+                                              (or native-inputs inputs) "bash")
+                                             (cut string-append <> "/bin/bash"))
+                                      "/bin/sh"))
+                      (flags      `(,(string-append "--prefix=" prefix)
+                                    ,@configure-flags))
+                      (abs-srcdir (getcwd))
+                      (srcdir     (string-append "../" (basename abs-srcdir))))
+                 (format #t "source directory: ~s (relative from build: ~s)~%"
+                         abs-srcdir srcdir)
+                 (mkdir "../build")
+                 (chdir "../build")
+                 (format #t "build directory: ~s~%" (getcwd))
+                 (format #t "configure flags: ~s~%" flags)
+                 (zero? (apply system* bash
+                               (string-append srcdir "/configure")
+                               flags))))
+             %standard-phases)))))))
+    (synopsis "Automatically Tuned Linear Algebra Software")
+    (description
+     "ATLAS is an automatically tuned linear algebra software library
+providing C and Fortran77 interfaces to a portably efficient BLAS
+implementation, as well as a few routines from LAPACK.
+
+Optimization occurs at build time.  For this reason, the library is built on
+the machine where it is installed, without resorting to pre-built substitutes.
+
+Before building the library, CPU throttling should be disabled.  This can be
+done in the BIOS, or, on GNU/Linux, with the following commands:
+
+cpufreq-selector -g performance -c 0
+...
+cpufreq-selector -g performance -c N-1
+
+where N is the number of cores of your CPU.  Failure to do so will result in a
+library with poor performance.")
+    (license license:bsd-3)))