Merge branch 'master' into staging
[jackhill/guix/guix.git] / gnu / packages / multiprecision.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2012, 2013, 2015 Ludovic Courtès <ludo@gnu.org>
3 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
4 ;;; Copyright © 2015, 2018 Andreas Enge <andreas@enge.fr>
5 ;;; Copyright © 2016 Nicolas Goaziou <mail@nicolasgoaziou.fr>
6 ;;; Copyright © 2016, 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
7 ;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice <me@tobias.gr>
8 ;;; Copyright © 2018 Eric Bavier <bavier@member.fsf.org>
9 ;;; Copyright © 2018, 2019 Efraim Flashner <efraim@flashner.co.il>
10 ;;;
11 ;;; This file is part of GNU Guix.
12 ;;;
13 ;;; GNU Guix is free software; you can redistribute it and/or modify it
14 ;;; under the terms of the GNU General Public License as published by
15 ;;; the Free Software Foundation; either version 3 of the License, or (at
16 ;;; your option) any later version.
17 ;;;
18 ;;; GNU Guix is distributed in the hope that it will be useful, but
19 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
20 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ;;; GNU General Public License for more details.
22 ;;;
23 ;;; You should have received a copy of the GNU General Public License
24 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
25
26 (define-module (gnu packages multiprecision)
27 #:use-module (guix licenses)
28 #:use-module (gnu packages)
29 #:use-module (gnu packages autotools)
30 #:use-module (gnu packages m4)
31 #:use-module (gnu packages gcc)
32 #:use-module (guix packages)
33 #:use-module (guix download)
34 #:use-module (guix utils)
35 #:use-module (guix build-system gnu))
36
37 (define-public gmp
38 (package
39 (name "gmp")
40 (version "6.2.0")
41 (source (origin
42 (method url-fetch)
43 (uri
44 (string-append "mirror://gnu/gmp/gmp-"
45 version ".tar.xz"))
46 (sha256
47 (base32
48 "09hmg8k63mbfrx1x3yy6y1yzbbq85kw5avbibhcgrg9z3ganr3i5"))
49 (patches (search-patches "gmp-faulty-test.patch"))))
50 (build-system gnu-build-system)
51 (native-inputs `(("m4" ,m4)))
52 (outputs '("out" "debug"))
53 (arguments
54 `(#:parallel-tests? #f ; mpz/reuse fails otherwise
55 #:configure-flags
56 '(;; Build a "fat binary", with routines for several
57 ;; sub-architectures.
58 "--enable-fat"
59 "--enable-cxx"
60 ,@(cond ((target-mingw?)
61 ;; Static and shared cannot be built in one go:
62 ;; they produce different headers. We need shared.
63 `("--disable-static"
64 "--enable-shared"))
65 (else '())))
66 ;; Remove after core-updates merge.
67 ;; Workaround for gcc-7 transition breakage, -system and cross-build,
68 ;; Note: See <http://bugs.gnu.org/22186> for why not 'CPATH'.
69 ;; Note: See <http://bugs.gnu.org/30756> for why not 'C_INCLUDE_PATH' & co.
70 ,@(if (target-mingw?)
71 `(#:phases
72 (modify-phases %standard-phases
73 (add-before 'configure 'setenv
74 (lambda _
75 (let ((gcc (assoc-ref %build-inputs "cross-gcc"))
76 (libc (assoc-ref %build-inputs "cross-libc")))
77 (setenv "CROSS_CPLUS_INCLUDE_PATH"
78 (string-append gcc "/include/c++"
79 ":" gcc "/include"
80 ":" libc "/include"))
81 (format #t "environment variable `CROSS_CPLUS_INCLUDE_PATH' set to `~a'\n"
82 (getenv "CROSS_CPLUS_INCLUDE_PATH"))
83 #t)))))
84 '())))
85 (synopsis "Multiple-precision arithmetic library")
86 (description
87 "The @acronym{GMP, the GNU Multiple Precision Arithmetic} library performs
88 arbitrary-precision arithmetic on signed integers, rational numbers and floating
89 point numbers. The precision is only limited by the available memory.
90 The library is highly optimized, with a design focus on execution speed.
91 It is aimed at use in, for example, cryptography and computational algebra.")
92 (license lgpl3+)
93 (home-page "https://gmplib.org/")))
94
95 (define-public gmp-6.0
96 ;; We keep this one around to bootstrap GCC, to work around a compilation
97 ;; issue on ARM. See
98 ;; <https://gmplib.org/list-archives/gmp-bugs/2015-December/003848.html>.
99 (package
100 (inherit gmp)
101 (version "6.0.0a")
102 (source (origin
103 (method url-fetch)
104 (uri (string-append "mirror://gnu/gmp/gmp-"
105 version ".tar.xz"))
106 (sha256
107 (base32
108 "0r5pp27cy7ch3dg5v0rsny8bib1zfvrza6027g2mp5f6v8pd6mli"))
109 (patches (search-patches "gmp-arm-asm-nothumb.patch"
110 "gmp-faulty-test.patch"))))))
111
112 (define-public mpfr
113 (package
114 (name "mpfr")
115 (version "4.0.2")
116 (source (origin
117 (method url-fetch)
118 (uri (string-append "mirror://gnu/mpfr/mpfr-" version
119 ".tar.xz"))
120 (sha256 (base32
121 "12m3amcavhpqygc499s3fzqlb8f2j2rr7fkqsm10xbjfc04fffqx"))))
122 (build-system gnu-build-system)
123 (outputs '("out" "debug"))
124 (propagated-inputs `(("gmp" ,gmp))) ; <mpfr.h> refers to <gmp.h>
125 (synopsis "C library for arbitrary-precision floating-point arithmetic")
126 (description
127 "GNU@tie{}@acronym{MPFR, Multiple Precision Floating-Point Reliably} is a C
128 library for performing multiple-precision, floating-point computations with
129 correct rounding.")
130 (license lgpl3+)
131 (home-page "https://www.mpfr.org/")))
132
133 (define-public mpc
134 (package
135 (name "mpc")
136 (version "1.1.0")
137 (source (origin
138 (method url-fetch)
139 (uri (string-append
140 "mirror://gnu/mpc/mpc-" version ".tar.gz"))
141 (sha256
142 (base32
143 "0biwnhjm3rx3hc0rfpvyniky4lpzsvdcwhmcn7f0h4iw2hwcb1b9"))))
144 (build-system gnu-build-system)
145 (outputs '("out" "debug"))
146 (propagated-inputs `(("gmp" ,gmp) ; <mpc.h> refers to both
147 ("mpfr" ,mpfr)))
148 (synopsis "C library for arbitrary-precision complex arithmetic")
149 (description
150 "GNU@tie{}@acronym{MPC, Multiple Precision Complex library} is a C library
151 for performing arithmetic on complex numbers. It supports arbitrarily high
152 precision and correctly rounds the results.")
153 (license lgpl3+)
154 (home-page "http://www.multiprecision.org/mpc/")))
155
156 (define-public mpfi
157 (package
158 (name "mpfi")
159 (version "1.5.3")
160 (source
161 (origin
162 (method url-fetch)
163 (uri (string-append "https://gforge.inria.fr/frs/download.php"
164 "/latestfile/181/" name "-" version ".tar.bz2"))
165 (sha256
166 (base32 "0bqr8yibl7jbrp0bw7xk1lm7nis7rv26jsz6y8ycvih8n9bx90r3"))))
167 (build-system gnu-build-system)
168 (propagated-inputs `(("gmp" ,gmp) ; <mpfi.h> refers to both
169 ("mpfr" ,mpfr)))
170 (synopsis "C library for arbitrary-precision interval arithmetic")
171 (description
172 "@acronym{MPFI, Multiple Precision Floating-point Interval} is a portable C
173 library for arbitrary-precision interval arithmetic, with intervals represented
174 using MPFR reliable floating-point numbers. It's based on the @acronym{GMP, GNU
175 Multiple Precision Arithmetic} and GNU@tie{}@acronym{MPFR, Multiple Precision
176 Floating-Point Reliably} libraries.
177
178 The purpose of arbitrary-precision interval arithmetic is to get results that
179 are both guaranteed, thanks to interval computation, and accurate, thanks to
180 multiple-precision arithmetic.")
181 (license lgpl2.1+)
182 (home-page "https://perso.ens-lyon.fr/nathalie.revol/software.html")))
183
184 (define-public irram
185 (package
186 (name "irram")
187 (version "2013_01")
188 (source
189 (origin
190 (method url-fetch)
191 (uri (string-append "http://irram.uni-trier.de/irram-files/iRRAM_"
192 version ".tar.bz2"))
193 (sha256
194 (base32 "1cdmvb4hsa161rfdjqyhd9sb3fcr43p3a6nsj7cb4kn9f94qmjpj"))))
195 (build-system gnu-build-system)
196 (propagated-inputs `(("gmp" ,gmp) ; <mpfi.h> refers to both
197 ("mpfr" ,mpfr)))
198 (arguments
199 `(#:parallel-build? #f))
200 (synopsis "C++ package for real arithmetic based on the Real-RAM concept")
201 (description
202 "@dfn{iRRAM} is a C++ package for error-free real arithmetic based on
203 the concept of a Real-RAM. Its capabilities range from ordinary arithmetic
204 over trigonometric functions to linear algebra and differential
205 equations. A program using iRRAM is coded in ordinary C++, but may use a
206 special class that behaves like real numbers without any
207 error. Additionally, iRRAM uses the concept of multi-valued functions.")
208 (license lgpl2.0+)
209 (home-page "http://irram.uni-trier.de/")))
210
211 (define-public qd
212 (package
213 (name "qd")
214 (version "2.3.22")
215 (source
216 (origin
217 (method url-fetch)
218 (uri (string-append "https://crd-legacy.lbl.gov/~dhbailey/mpdist/qd-"
219 version ".tar.gz"))
220 (sha256
221 (base32 "1lq609rsp6zpg7zda75lyxzzk1fabzp4jn88j7xfk84mdgjgzh9h"))))
222 (build-system gnu-build-system)
223 (native-inputs
224 `(("gfortran" ,gfortran)))
225 (arguments
226 `(#:configure-flags `("--disable-enable_fma" ;weird :/
227 "--enable-shared"
228 ,,@(if (string-prefix? "aarch64"
229 (or (%current-target-system)
230 (%current-system)))
231 ;; XXX: The qd_test test fails numerical
232 ;; accuracy checks for 'dd_real::exp()' on
233 ;; aarch64 with GCC 5.4 at -O2. Disabling
234 ;; expensive optimizations lets it pass.
235 '("CXXFLAGS=-O3 -fno-expensive-optimizations")
236 '("CXXFLAGS=-O3")))))
237 (home-page "https://www.davidhbailey.com/dhbsoftware/")
238 (synopsis "Double-double and quad-double library")
239 (description "This package supports both a double-double
240 datatype (approx. 32 decimal digits) and a quad-double datatype (approx. 64
241 decimal digits). The computational library is written in C++. Both C++ and
242 Fortran-90 high-level language interfaces are provided to permit one to
243 convert an existing C++ or Fortran-90 program to use the library with only
244 minor changes to the source code. In most cases only a few type statements
245 and (for Fortran-90 programs) read/write statements need to be changed. PSLQ
246 and numerical quadrature programs are included.")
247 (license bsd-3)))
248
249 (define-public tomsfastmath
250 (package
251 (name "tomsfastmath")
252 (version "0.13.1")
253 (synopsis "Large integer arithmetic library")
254 (source (origin
255 (method url-fetch)
256 (uri (string-append "https://github.com/libtom/tomsfastmath/"
257 "releases/download/v" version "/"
258 "tfm-" version ".tar.xz"))
259 (sha256
260 (base32
261 "0f0pmiaskh89sp0q933pafxb914shpaj5ad8sb5rzk1wv8d7mja7"))))
262 (build-system gnu-build-system)
263 (native-inputs
264 `(("libtool" ,libtool)))
265 (arguments
266 `(#:make-flags (list "-f" "makefile.shared"
267 (string-append "LIBPATH=" %output "/lib")
268 (string-append "INCPATH=" %output "/include")
269 "GROUP=root" "USER=root"
270 "CC=gcc")
271 #:phases
272 (modify-phases %standard-phases
273 (delete 'configure) ; no configuration
274 (replace 'check
275 (lambda* (#:key make-flags #:allow-other-keys)
276 (apply invoke "make"
277 "stest" "test_standalone"
278 make-flags)
279 (invoke "./stest")
280 (invoke "./test")))
281 (add-before 'install 'install-nogroup
282 (lambda _
283 ;; Let permissions inherit from the current process.
284 (substitute* "makefile.shared"
285 (("-g \\$\\(GROUP\\) -o \\$\\(USER\\)") ""))
286 #t))
287 (add-after 'install 'install-doc
288 (lambda* (#:key outputs #:allow-other-keys)
289 (let ((docdir (string-append (assoc-ref outputs "out")
290 "/share/doc/tomsfastmath")))
291 (install-file "doc/tfm.pdf" docdir)
292 #t)))
293 (add-after 'install 'install-pc
294 (lambda* (#:key outputs #:allow-other-keys)
295 (let* ((out (assoc-ref outputs "out"))
296 (pc-dir (string-append out "/lib/pkgconfig")))
297 (call-with-output-file "tomsfastmath.pc"
298 (lambda (port)
299 (format port "~
300 Name: TomsFastMath
301 Description: ~a
302 Version: ~a
303 Libs: -L~a/lib -ltfm~%"
304 ,synopsis ,version out)))
305 (install-file "tomsfastmath.pc" pc-dir)
306 #t))))))
307 (home-page "https://www.libtom.net/TomsFastMath/")
308 (description "TomsFastMath is a large integer library written in portable
309 ISO C. It is a port of LibTomMath with optional support for inline assembler
310 multiplies.")
311 (license public-domain)))
312
313 (define-public libtommath
314 (package
315 (name "libtommath")
316 (version "1.2.0")
317 (outputs '("out" "static"))
318 (source
319 (origin
320 (method url-fetch)
321 (uri (string-append "https://github.com/libtom/libtommath/releases/"
322 "download/v" version "/ltm-" version ".tar.xz"))
323 (sha256
324 (base32
325 "1c8q1qy88cjhdjlk3g24mra94h34c1ldvkjz0n2988c0yvn5xixp"))))
326 (build-system gnu-build-system)
327 (arguments
328 '(#:phases
329 (modify-phases %standard-phases
330 (delete 'configure) ; no configure
331 (add-after 'unpack 'prepare-build
332 (lambda _
333 ;; We want the shared library by default so force it to be the
334 ;; default makefile target.
335 (delete-file "makefile")
336 (symlink "makefile.shared" "makefile")
337 #t))
338 (add-after 'install 'remove-static-library
339 (lambda* (#:key outputs #:allow-other-keys)
340 (delete-file (string-append (assoc-ref outputs "out")
341 "/lib/libtommath.a"))
342 #t))
343 (replace 'check
344 (lambda* (#:key test-target make-flags #:allow-other-keys)
345 (apply invoke "make" test-target make-flags)
346 (invoke "sh" "test")))
347 (add-after 'install 'install-static-library
348 (lambda* (#:key outputs #:allow-other-keys)
349 (invoke "make" "-f" "makefile.unix" "install"
350 (string-append "PREFIX=" (assoc-ref outputs "static"))
351 (string-append "CC=" (which "gcc"))))))
352 #:test-target "test"
353 #:make-flags (list (string-append "PREFIX=" (assoc-ref %outputs "out"))
354 "CC=gcc")))
355 (native-inputs
356 `(("libtool" ,libtool)))
357 (home-page "https://www.libtom.net/LibTomMath/")
358 (synopsis "Portable number theoretic multiple-precision integer library")
359 (description "LibTomMath is a portable number theoretic multiple-precision
360 integer library written entirely in C. It's designed to provide an API that is
361 simple to work with that provides fairly efficient routines that build out of
362 the box without configuration.")
363 (license unlicense)))
364
365 (define-public libtommath-1.1
366 (package
367 (inherit libtommath)
368 (version "1.1.0")
369 (source
370 (origin
371 (method url-fetch)
372 (uri (string-append "https://github.com/libtom/libtommath/releases/"
373 "download/v" version "/ltm-" version ".tar.xz"))
374 (sha256
375 (base32
376 "1bbyagqzfdbg37k1n08nsqzdf44z8zsnjjinqbsyj7rxg246qilh"))
377 (patches (search-patches "libtommath-fix-linkage.patch"))))
378 (arguments
379 (substitute-keyword-arguments (package-arguments libtommath)
380 ((#:phases phases)
381 `(modify-phases ,phases
382 (add-after 'unpack 'patch-coreutils-call
383 (lambda _
384 ;; Don't pull in coreutils.
385 (substitute* "makefile_include.mk"
386 (("arch") "uname -m"))
387 #t))))
388 ((#:test-target _) "test_standalone")))))
389
390 (define-public libtommath-1.0
391 (package
392 (inherit libtommath-1.1)
393 (version "1.0.1")
394 (outputs '("out"))
395 (source
396 (origin
397 (method url-fetch)
398 (uri (string-append "https://github.com/libtom/libtommath/releases/"
399 "download/v" version "/ltm-" version ".tar.xz"))
400 (sha256
401 (base32
402 "0sbccdwbkfc680id2fi0x067j23biqcjqilwkk7y9339knrjy0s7"))))
403 (arguments
404 (substitute-keyword-arguments (package-arguments libtommath-1.1)
405 ((#:phases phases)
406 `(modify-phases ,phases
407 (delete 'install-static-library)))))))