gnu: r-fields: Update to 11.4.
[jackhill/guix/guix.git] / gnu / packages / julia.scm
dissimilarity index 64%
index 7a44abd..78488a4 100644 (file)
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015, 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
-;;;
-;;; This file is part of GNU Guix.
-;;;
-;;; GNU Guix is free software; you can redistribute it and/or modify it
-;;; under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 3 of the License, or (at
-;;; your option) any later version.
-;;;
-;;; GNU Guix is distributed in the hope that it will be useful, but
-;;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
-
-(define-module (gnu packages julia)
-  #:use-module ((guix licenses) #:prefix license:)
-  #:use-module (guix packages)
-  #:use-module (guix download)
-  #:use-module (guix utils)
-  #:use-module (guix git-download)
-  #:use-module (guix build-system gnu)
-  #:use-module (gnu packages)
-  #:use-module (gnu packages algebra)
-  #:use-module (gnu packages base)
-  #:use-module (gnu packages compression)
-  #:use-module (gnu packages elf)
-  #:use-module (gnu packages gcc)
-  #:use-module (gnu packages llvm)
-  #:use-module (gnu packages libevent)
-  #:use-module (gnu packages libunwind)
-  #:use-module (gnu packages maths)
-  #:use-module (gnu packages multiprecision) ; mpfr
-  #:use-module (gnu packages pcre)
-  #:use-module (gnu packages perl)
-  #:use-module (gnu packages pkg-config)
-  #:use-module (gnu packages python)
-  #:use-module (gnu packages textutils)
-  #:use-module (gnu packages tls)
-  #:use-module (gnu packages version-control)
-  #:use-module (gnu packages wget)
-  #:use-module (ice-9 match))
-
-(define libuv-julia
-  (let ((commit "52d72a52cc7ccd570929990f010ed16e2ec604c8")
-        (revision "5"))
-    (package (inherit libuv)
-      (name "libuv-julia")
-      (version (string-append "1.9.0-" revision "." (string-take commit 8)))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "https://github.com/JuliaLang/libuv.git")
-                      (commit commit)))
-                (file-name (string-append name "-" version "-checkout"))
-                (sha256
-                 (base32
-                  "1daxh6ci6q7znxxajr3bm16dd53ragm0d681wf4kzg542qnjq3lh"))))
-      (build-system gnu-build-system)
-      (arguments
-       (substitute-keyword-arguments (package-arguments libuv)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'autogen)))))
-      (home-page "https://github.com/JuliaLang/libuv"))))
-
-(define libunwind-for-julia
-  (package
-    (inherit libunwind)
-    (version "1.1-julia2")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "https://s3.amazonaws.com/julialang/src/"
-                                  "libunwind-" version ".tar.gz"))
-              (sha256
-               (base32
-                "0499x7sg2v18a6cry6l8y713cgmic0adnjph8i0xr1db9p7n8qyv"))))))
-
-(define-public julia
-  (package
-    (name "julia")
-    (version "0.6.0")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append
-                    "https://github.com/JuliaLang/julia/releases/download/v"
-                    version "/julia-" version ".tar.gz"))
-              (sha256
-               (base32
-                "0rd6lcc9sic10q1j3c6f9qr901i1c4554m93n2sz5b3mh37byqhw"))))
-    (build-system gnu-build-system)
-    (arguments
-     `(#:test-target "test"
-       #:modules ((ice-9 match)
-                  (guix build gnu-build-system)
-                  (guix build utils))
-
-       ;; Do not strip binaries to keep support for full backtraces.
-       ;; See https://github.com/JuliaLang/julia/issues/17831
-       #:strip-binaries? #f
-
-       ;; The DSOs use $ORIGIN to refer to each other, but (guix build
-       ;; gremlin) doesn't support it yet, so skip this phase.
-       #:validate-runpath? #f
-
-       #:phases
-       (modify-phases %standard-phases
-         (delete 'configure)
-         (add-after 'unpack 'prepare-deps
-           (lambda* (#:key inputs #:allow-other-keys)
-             (mkdir "deps/srccache")
-             (copy-file (assoc-ref inputs "dsfmt")
-                        "deps/srccache/dsfmt-2.2.3.tar.gz")
-             (copy-file (assoc-ref inputs "objconv")
-                        "deps/srccache/objconv.zip")
-             (copy-file (assoc-ref inputs "suitesparse")
-                        "deps/srccache/SuiteSparse-4.4.5.tar.gz")
-             (copy-file (string-append (assoc-ref inputs "virtualenv")
-                                       "/bin/virtualenv")
-                        "julia-env")
-             (copy-file (assoc-ref inputs "unicode-data")
-                        "doc/UnicodeData.txt")
-             #t))
-         ;; FIXME: Building the documentation requires Julia packages that
-         ;; would be downloaded from the Internet.  We should build them in a
-         ;; separate build phase.
-         (add-after 'unpack 'disable-documentation
-           (lambda _
-             (substitute* "Makefile"
-               (("(install: .*) \\$\\(BUILDROOT\\)/doc/_build/html/en/index.html" _ line)
-                (string-append line "\n"))
-               (("src ui doc deps")
-                "src ui deps"))
-             #t))
-         (add-before 'check 'set-home
-           ;; Some tests require a home directory to be set.
-           (lambda _ (setenv "HOME" "/tmp") #t))
-         (add-after 'unpack 'hardcode-soname-map
-          ;; ./src/runtime_ccall.cpp creates a map from library names to paths
-          ;; using the output of "/sbin/ldconfig -p".  Since ldconfig is not
-          ;; used in Guix, we patch runtime_ccall.cpp to contain a static map.
-          (lambda* (#:key inputs #:allow-other-keys)
-            (use-modules (ice-9 match))
-            (substitute* "src/runtime_ccall.cpp"
-              ;; Patch out invocations of '/sbin/ldconfig' to avoid getting
-              ;; error messages about missing '/sbin/ldconfig' on GuixSD.
-              (("popen\\(.*ldconfig.*\\);")
-               "NULL;\n")
-
-              ;; Populate 'sonameMap'.
-              (("jl_read_sonames.*;")
-               (string-join
-                (map (match-lambda
-                       ((input libname soname)
-                        (string-append
-                         "sonameMap[\"" libname "\"] = "
-                         "\"" (assoc-ref inputs input) "/lib/" soname "\";")))
-                     '(("libc"        "libc"           "libc.so.6")
-                       ("pcre2"       "libpcre2-8"     "libpcre2-8.so")
-                       ("mpfr"        "libmpfr"        "libmpfr.so")
-                       ("openblas"    "libblas"        "libopenblas.so")
-                       ("arpack-ng"   "libarpack"      "libarpack.so")
-                       ("lapack"      "liblapack"      "liblapack.so")
-                       ("libgit2"     "libgit2"        "libgit2.so")
-                       ("gmp"         "libgmp"         "libgmp.so")
-                       ("openlibm"    "libopenlibm"    "libopenlibm.so")
-                       ("openspecfun" "libopenspecfun" "libopenspecfun.so")
-                       ("fftw"        "libfftw3"       "libfftw3_threads.so")
-                       ("fftwf"       "libfftw3f"      "libfftw3f_threads.so"))))))
-            (substitute* "base/fft/FFTW.jl"
-              (("const libfftw = Base.libfftw_name")
-               (string-append "const libfftw = \""
-                              (assoc-ref inputs "fftw") "/lib/libfftw3_threads.so"
-                              "\""))
-              (("const libfftwf = Base.libfftwf_name")
-               (string-append "const libfftwf = \""
-                              (assoc-ref inputs "fftwf") "/lib/libfftw3f_threads.so"
-                              "\"")))
-            (substitute* "base/math.jl"
-              (("const libm = Base.libm_name")
-               (string-append "const libm = \""
-                              (assoc-ref inputs "openlibm")
-                              "/lib/libopenlibm.so"
-                              "\""))
-              (("const openspecfun = \"libopenspecfun\"")
-               (string-append "const openspecfun = \""
-                              (assoc-ref inputs "openspecfun")
-                              "/lib/libopenspecfun.so"
-                              "\"")))
-            (substitute* "base/pcre.jl"
-              (("const PCRE_LIB = \"libpcre2-8\"")
-               (string-append "const PCRE_LIB = \""
-                              (assoc-ref inputs "pcre2")
-                              "/lib/libpcre2-8.so" "\"")))
-            #t))
-         (add-before 'build 'fix-include-and-link-paths
-          (lambda* (#:key inputs #:allow-other-keys)
-            ;; LIBUTF8PROC is a linker flag, not a build target.  It is
-            ;; included in the LIBFILES_* variable which is used as a
-            ;; collection of build targets and a list of libraries to link
-            ;; against.
-            (substitute* "src/flisp/Makefile"
-              (("\\$\\(BUILDDIR\\)/\\$\\(EXENAME\\): \\$\\(OBJS\\) \\$\\(LIBFILES_release\\)")
-               "$(BUILDDIR)/$(EXENAME): $(OBJS) $(LLT_release)")
-              (("\\$\\(BUILDDIR\\)/\\$\\(EXENAME\\)-debug: \\$\\(DOBJS\\) \\$\\(LIBFILES_debug\\)")
-               "$(BUILDDIR)/$(EXENAME)-debug: $(DOBJS) $(LLT_debug)"))
-
-            ;; The REPL must be linked with libuv.
-            (substitute* "ui/Makefile"
-              (("JLDFLAGS \\+= ")
-               (string-append "JLDFLAGS += "
-                              (assoc-ref %build-inputs "libuv")
-                              "/lib/libuv.so ")))
-
-            (substitute* "base/Makefile"
-              (("\\$\\(build_includedir\\)/uv-errno.h")
-               (string-append (assoc-ref inputs "libuv")
-                              "/include/uv-errno.h")))
-            #t))
-         (add-before 'build 'replace-default-shell
-          (lambda _
-            (substitute* "base/client.jl"
-              (("/bin/sh") (which "sh")))
-            #t))
-         (add-after 'unpack 'hardcode-paths
-           (lambda _
-             (substitute* "base/interactiveutil.jl"
-               (("`which") (string-append "`" (which "which")))
-               (("`wget")  (string-append "`" (which "wget"))))
-             #t))
-         (add-before 'check 'disable-broken-tests
-           (lambda _
-             ;; Adjust expected error messages to match what current libgit2
-             ;; provides.
-             (substitute* "test/libgit2.jl"
-               (("Invalid Content-Type") "invalid Content-Type")
-               (("Failed to resolve path") "failed to resolve path"))
-
-             (substitute* "test/choosetests.jl"
-               ;; These tests fail, probably because some of the input
-               ;; binaries have been stripped and thus backtraces don't look
-               ;; as expected.
-               (("\"backtrace\",") "")
-               (("\"compile\",") "")
-               (("\"replutil\",") "")
-               (("\"cmdlineargs\",") "")
-               ;; FIXME: This test fails with the following error:
-               ;; Error in testset file:
-               ;; Test Failed
-               ;;   Expression: download("ba\0d", "good")
-               ;;     Expected: ArgumentError
-               ;;       Thrown: Base.UVError
-               (("\"file\",") ""))
-             #t)))
-       #:make-flags
-       (list
-        (string-append "prefix=" (assoc-ref %outputs "out"))
-
-        ;; Passing the MARCH flag is necessary to build binary substitutes for
-        ;; the supported architectures.
-        ,(match (or (%current-target-system)
-                    (%current-system))
-           ("x86_64-linux" "MARCH=x86-64")
-           ("i686-linux" "MARCH=pentium4")
-           ("aarch64-linux" "MARCH=armv8-a")
-           ;; Prevent errors when querying this package on unsupported
-           ;; platforms, e.g. when running "guix package --search="
-           (_ "MARCH=UNSUPPORTED"))
-
-        "CONFIG_SHELL=bash"     ;needed to build bundled libraries
-        "USE_SYSTEM_DSFMT=0"    ;not packaged for Guix and upstream has no
-                                ;build system for a shared library.
-        "USE_SYSTEM_LAPACK=1"
-        "USE_SYSTEM_BLAS=1"
-        "USE_BLAS64=0"          ;needed when USE_SYSTEM_BLAS=1
-
-        "USE_SYSTEM_FFTW=1"
-        "LIBFFTWNAME=libfftw3"
-        "LIBFFTWFNAME=libfftw3f"
-
-        ;; TODO: Suitesparse does not install shared libraries, so we cannot
-        ;; use the suitesparse package.
-        ;; "USE_SYSTEM_SUITESPARSE=1"
-        ;; (string-append "SUITESPARSE_INC=-I "
-        ;;                (assoc-ref %build-inputs "suitesparse")
-        ;;                "/include")
-
-        "USE_GPL_LIBS=1"        ;proudly
-        "USE_SYSTEM_UTF8PROC=1"
-        (string-append "UTF8PROC_INC="
-                       (assoc-ref %build-inputs "utf8proc")
-                       "/include")
-        "USE_SYSTEM_LLVM=1"
-        "USE_LLVM_SHLIB=0" ; FIXME: fails when set to 1
-
-        "USE_SYSTEM_LIBUNWIND=1"
-        "USE_SYSTEM_LIBUV=1"
-        (string-append "LIBUV="
-                       (assoc-ref %build-inputs "libuv")
-                       "/lib/libuv.so")
-        (string-append "LIBUV_INC="
-                       (assoc-ref %build-inputs "libuv")
-                       "/include")
-        "USE_SYSTEM_PATCHELF=1"
-        "USE_SYSTEM_PCRE=1"
-        "USE_SYSTEM_OPENLIBM=1"
-        "USE_SYSTEM_GMP=1"
-        "USE_SYSTEM_MPFR=1"
-        "USE_SYSTEM_ARPACK=1"
-        "USE_SYSTEM_LIBGIT2=1"
-        "USE_SYSTEM_OPENSPECFUN=1")))
-    (inputs
-     `(("llvm" ,llvm)
-
-       ;; The bundled version is 3.3.0 so stick to that version.  With other
-       ;; versions, we get test failures in 'linalg/arnoldi' as described in
-       ;; <https://bugs.gnu.org/30282>.
-       ("arpack-ng" ,arpack-ng-3.3.0)
-
-       ("coreutils" ,coreutils) ;for bindings to "mkdir" and the like
-       ("lapack" ,lapack)
-       ("openblas" ,openblas) ;Julia does not build with Atlas
-       ("libunwind" ,libunwind-for-julia)
-       ("openlibm" ,openlibm)
-       ("openspecfun" ,openspecfun)
-       ("libgit2" ,libgit2)
-       ("fftw" ,fftw)
-       ("fftwf" ,fftwf)
-       ("fortran" ,gfortran)
-       ("libuv" ,libuv-julia)
-       ("pcre2" ,pcre2)
-       ("utf8proc" ,utf8proc)
-       ("mpfr" ,mpfr)
-       ("wget" ,wget)
-       ("which" ,which)
-       ("zlib" ,zlib)
-       ("gmp" ,gmp)
-       ("virtualenv" ,python2-virtualenv)
-       ;; FIXME: The following inputs are downloaded from upstream to allow us
-       ;; to use the lightweight Julia release tarball.  Ideally, these inputs
-       ;; would eventually be replaced with proper Guix packages.
-
-       ;; TODO: run "make -f contrib/repackage_system_suitesparse4.make" to copy static lib
-       ("suitesparse"
-        ,(origin
-           (method url-fetch)
-           (uri "http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.4.5.tar.gz")
-           (sha256
-            (base32
-             "1jcbxb8jx5wlcixzf6n5dca2rcfx6mlcms1k2rl5gp67ay3bix43"))))
-       ("objconv"
-        ,(origin
-           (method url-fetch)
-           (uri "http://www.agner.org/optimize/objconv.zip")
-           (sha256
-            (base32
-             "1fi7qa2sd9vb35dvkgripjf0fayzg2qmff215f8agfqfiwd1g8qs"))))
-       ("dsfmt"
-        ,(origin
-           (method url-fetch)
-           (uri (string-append
-                 "http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/"
-                 "SFMT/dSFMT-src-2.2.3.tar.gz"))
-           (sha256
-            (base32
-             "03kaqbjbi6viz0n33dk5jlf6ayxqlsq4804n7kwkndiga9s4hd42"))))))
-    (native-inputs
-     `(("openssl" ,openssl)
-       ("perl" ,perl)
-       ("patchelf" ,patchelf)
-       ("pkg-config" ,pkg-config)
-       ("python" ,python-2)
-       ("unicode-data"
-        ,(origin
-           (method url-fetch)
-           (uri "http://www.unicode.org/Public/9.0.0/ucd/UnicodeData.txt")
-           (sha256
-            (base32
-             "13zfannnr6sa6s27ggvcvzmh133ndi38pfyxsssvjmw2s8ac9pv8"))))))
-    ;; Julia is not officially released for ARM and MIPS.
-    ;; See https://github.com/JuliaLang/julia/issues/10639
-    (supported-systems '("i686-linux" "x86_64-linux" "aarch64-linux"))
-    (home-page "http://julialang.org/")
-    (synopsis "High-performance dynamic language for technical computing")
-    (description
-     "Julia is a high-level, high-performance dynamic programming language for
-technical computing, with syntax that is familiar to users of other technical
-computing environments.  It provides a sophisticated compiler, distributed
-parallel execution, numerical accuracy, and an extensive mathematical function
-library.")
-    (license license:expat)))
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015, 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016, 2020 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2020 Nicolò Balzarotti <nicolo@nixo.xyz>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages julia)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix utils)
+  #:use-module (guix git-download)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages algebra)
+  #:use-module (gnu packages base)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages curl)
+  #:use-module (gnu packages elf)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages llvm)
+  #:use-module (gnu packages libevent)
+  #:use-module (gnu packages libunwind)
+  #:use-module (gnu packages maths)
+  #:use-module (gnu packages multiprecision) ; mpfr
+  #:use-module (gnu packages pcre)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages python)
+  #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages textutils)
+  #:use-module (gnu packages ssh)
+  #:use-module (gnu packages tls)
+  #:use-module (gnu packages version-control)
+  #:use-module (gnu packages wget)
+  #:use-module (ice-9 match))
+
+(define libuv-julia
+  (let ((commit "35b1504507a7a4168caae3d78db54d1121b121e1")
+        (revision "1"))
+    ;; When upgrading Julia, also upgrade this.  Get the commit from
+    ;; https://github.com/JuliaLang/julia/blob/v1.4.1/deps/libuv.version
+    (package
+      (inherit libuv)
+      (name "libuv-julia")
+      (version (git-version "2.0.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                       (url "https://github.com/JuliaLang/libuv")
+                       (commit commit)))
+                (file-name (string-append name "-" version "-checkout"))
+                (sha256
+                 (base32
+                  "0dn3v6fdp1z382pqg3nhjzk60l61ky9b65mfgaj29fv2da95rwjs"))))
+      (build-system gnu-build-system)
+      (arguments
+       (substitute-keyword-arguments (package-arguments libuv)
+         ((#:phases phases)
+          `(modify-phases ,phases
+             (delete 'autogen)))))
+      (home-page "https://github.com/JuliaLang/libuv"))))
+
+(define libunwind-julia
+  ;; The Julia projects requires their patched version.
+  ;; Get from https://github.com/JuliaLang/julia/tree/master/deps/patches
+  (package
+    (inherit libunwind)
+    (name "libunwind-julia")
+    (version "1.3.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "mirror://savannah/libunwind/libunwind-"
+                           version ".tar.gz"))
+       (sha256
+        (base32
+         "1y0l08k6ak1mqbfj6accf9s5686kljwgsl4vcqpxzk5n74wpm6a3"))
+       (patches
+        (list
+         (julia-patch "libunwind-prefer-extbl"
+                      "0lr4dafw8qyfh8sw8hhbwkql1dlhqv8px7k81y2l20hhxfgnh2m1")
+         (julia-patch "libunwind-static-arm"
+                      "1jk3bmiw61ypcchqkk1fyg5wh8wpggk574wxyfyaic870zh3lhgq")))))
+    (home-page "https://github.com/JuliaLang/tree/master/deps/")))
+
+(define (julia-patch-url version name)
+  (string-append "https://raw.githubusercontent.com/JuliaLang/julia/v" version
+                 "/deps/patches/" name ".patch"))
+
+(define (julia-patch name sha)
+  (let ((version "1.4.1"))
+    (origin (method url-fetch)
+            (uri (julia-patch-url version name))
+            (sha256 (base32 sha))
+            (file-name name))))
+
+(define llvm-julia
+  (package
+    (inherit llvm-8)
+    (name "llvm-julia")
+    (source (origin
+              (inherit (package-source llvm-8))
+              ;; Those patches are inside the Julia source repo.
+              ;; They are _not_ Julia specific (https://github.com/julialang/julia#llvm)
+              ;; but they are required to build Julia.
+              ;; Discussion: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=919628
+              (patches
+                (map (match-lambda
+                       ((name hash)
+                        (julia-patch name hash)))
+                     (list
+                       '("llvm-7.0-D44650"
+                         "1h55kkmkiisfj6sk956if2bcj9s0v6n5czn8dxb870vp5nccj3ir")
+                       '("llvm-6.0-DISABLE_ABI_CHECKS"
+                         "014fawd1ba7yckalypfld22zgic87x9nx3cim42zrwygywd36pyg")
+                       '("llvm-6.0-NVPTX-addrspaces"
+                         "1qdi2zmrjsrj0h84zv2vyly2hjcn4f67mfy0s1q353g4v4jkscqc")
+                       '("llvm-D27629-AArch64-large_model_6.0.1"
+                         "1qrshmlqvnasdyc158vfn3hnbigqph3lsq7acb9w8lwkpnnm2j4z")
+                       '("llvm8-D34078-vectorize-fdiv"
+                         "19spqc3xsazn1xs9gpcgv9ldadfkv49rmc5khl7sf1dlmhgi4602")
+                       '("llvm7-D50010-VNCoercion-ni"
+                         "18scg6aa036xa1508s7q93w9dvc5gp69fz6yl6fkh4yffw4gymw6")
+                       '("llvm-8.0-D50167-scev-umin"
+                         "0g9w2x8yryjdkihnrf18x0yi5bi14c5p8wffda1w732dr5ckzk94")
+                       '("llvm-D57118-powerpc"
+                         "0vxz5s0s9b625v1rv8lg1566yhxh1i91ydzmvy5s7njvzc7p19aw")
+                       '("llvm8-WASM-addrspaces"
+                         "1176agj9hh7csdm2lnklb42zcdsb3q6lx9jiyp2shn4p2678y76q")
+                       '("llvm-exegesis-mingw"
+                         "0ph1cj1j7arvf1xq2xcr7qf9g0cpdl14fincgr67vpi520zvd3vp")
+                       '("llvm-test-plugin-mingw"
+                         "12z738cnahbf6n381im7i0hxp1m6k9hrnfjlmq9sac46nxly9gnj")
+                       '("llvm-8.0-D66401-mingw-reloc"
+                         "15v3p5sznn979cfnd7gdn3nd701fd7xd5aks6lnj1mslvljlq3ls")
+                       '("llvm7-revert-D44485"
+                         "0f59kq3p3mpwsbmskypbi4zn01l6ig0x7v2rjp08k2r8z8m6fa8n")
+                       '("llvm-8.0-D63688-wasm-isLocal"
+                         "0i9wi5n63ip3802z6m7aj3p07hkqjlmp4vg4wq3xkf9f6w9rksab")
+                       '("llvm-8.0-D55758-tablegen-cond"
+                         "1l08mg7qigravi7plsq3yzya80fljnp95n8faddr29wbr2qr0655")
+                       '("llvm-8.0-D59389-refactor-wmma"
+                         "0rgrwk4xlwpk7yai2j7xadcfws93rmk2hhh44fysa88imvrbp478")
+                       '("llvm-8.0-D59393-mma-ptx63-fix"
+                         "094jcsxbcx9fljj623mgmc0rjpk12s2rs0di0ck0hakzhr8mbv5n")
+                       '("llvm-8.0-D66657-codegen-degenerate"
+                         "1n1ddx19h90bbpimdyd9dh8fsm6gb93xxyqm4ljkxa1k3cx2vm72")
+                       '("llvm-8.0-D71495-vectorize-freduce"
+                         "1zff08wvji9lnpskk4b3p5zyjsy5hhy23ynxjqlj9dw7jvvfrf0p")
+                       '("llvm-8.0-D75072-SCEV-add-type"
+                         "0amlyyndsc90ml2k6prdahf24q0j23nfmlbqf8gcqcxpl5sqq3i6")
+                       '("llvm-8.0-D65174-limit-merge-stores"
+                        "1ls5114fhgip9rbqabqc16mi367ra0k75ngc1vyqqhq1ghm9x7y9"))))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments llvm-8)
+       ((#:configure-flags flags)
+        `(list ;; Taken from NixOS. Only way I could get libLLVM-6.0.so
+           "-DCMAKE_BUILD_TYPE=Release"
+
+           ;; Build a native compiler and the NVPTX backend (NVIDIA) since
+           ;; Julia insists on it, nothing more.  This reduces build times and
+           ;; disk usage.
+           ,(string-append "-DLLVM_TARGETS_TO_BUILD=" (system->llvm-target))
+           "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=NVPTX"
+
+           "-DLLVM_INSTALL_UTILS=ON"
+           "-DLLVM_BUILD_TESTS=ON"
+           "-DLLVM_ENABLE_FFI=ON"
+           "-DLLVM_ENABLE_RTTI=ON"
+           ;; "-DLLVM_HOST_TRIPLE=${stdenv.hostPlatform.config}"
+           ;; "-DLLVM_DEFAULT_TARGET_TRIPLE=${stdenv.hostPlatform.config}"
+           ;; "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly"
+           "-DLLVM_ENABLE_DUMP=ON"
+           "-DLLVM_LINK_LLVM_DYLIB=ON"))))))
+
+(define-public libwhich
+  (package
+    (name "libwhich")
+    (version "1.1.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/vtjnash/libwhich")
+             ;; fixes linux-vdso.so related tests
+             (commit "87cffe10080c98e7b5786c5166e420bf1ada1d41")))
+       (file-name (string-append name "-" version "-checkout"))
+       (sha256
+        (base32
+         "1bpa0fcqpa3ai3hm8mz0p13bf76fsq53wsfcx5qw302zh22108xr"))))
+    (arguments
+     `(#:make-flags
+       (list "CC=gcc")
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-before 'check 'set-ld-library-path
+           (lambda* (#:key inputs #:allow-other-keys)
+             (setenv "LD_LIBRARY_PATH"
+                     (string-append (assoc-ref inputs "zlib") "/lib"))))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (install-file "libwhich" (string-append out "/bin")))
+             #t)))))
+    (native-inputs
+     ;; used for tests
+     `(("zlib" ,zlib)))
+    (build-system gnu-build-system)
+    (home-page "https://github.com/vtjnash/libwhich")
+    (synopsis "Like @code{which}, for dynamic libraries")
+    (description "@code{libwhich} is like @code{which}, but for dynamic
+libraries.  It is also a bit like @code{ldd} and @code{otool -L}.")
+    (license license:expat)))
+
+(define-public julia
+  (package
+    (name "julia")
+    (version "1.4.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/JuliaLang/julia/releases/download/v"
+                    version "/julia-" version ".tar.gz"))
+              (sha256
+               (base32
+                "030aza3qj5zcinxbrbqgi7p64q6klwq2bhwccraarx7l0hg9lw3i"))
+              (patches
+               (search-patches "julia-SOURCE_DATE_EPOCH-mtime.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:test-target "test"
+       #:modules ((ice-9 match)
+                  (guix build gnu-build-system)
+                  (guix build utils))
+
+       ;; Do not strip binaries to keep support for full backtraces.
+       ;; See https://github.com/JuliaLang/julia/issues/17831
+       #:strip-binaries? #f
+
+       ;; The DSOs use $ORIGIN to refer to each other, but (guix build
+       ;; gremlin) doesn't support it yet, so skip this phase.
+       #:validate-runpath? #f
+
+       #:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (add-after 'unpack 'prepare-deps
+           (lambda* (#:key inputs #:allow-other-keys)
+             ;; needed by libwhich
+             (setenv "LD_LIBRARY_PATH"
+                     (string-join (map (lambda (pkg)
+                                         (string-append (assoc-ref inputs pkg)
+                                                        "/lib"))
+                                       '("arpack-ng" "curl" "dsfmt"
+                                         "gmp" "lapack"
+                                         "libssh2" "libgit2"
+                                         "mbedtls" "mpfr"
+                                         "openblas" "openlibm" "pcre2"
+                                         "suitesparse"))
+                                  ":"))
+             #t))
+         ;; FIXME: Building the documentation requires Julia packages that
+         ;; would be downloaded from the Internet.  We should build them in a
+         ;; separate build phase.
+         (add-after 'unpack 'disable-documentation
+           (lambda _
+             (substitute* "Makefile"
+               (("(install: .*) \\$\\(BUILDROOT\\)/doc/_build/html/en/index.html" _ line)
+                (string-append line "\n"))
+               (("src ui doc deps")
+                "src ui deps"))
+             #t))
+         (add-after 'unpack 'use-system-libwhich
+           (lambda* (#:key inputs #:allow-other-keys)
+             ;; don't build it
+             (substitute* "deps/Makefile"
+               (("DEP_LIBS \\+= libwhich") ""))
+             ;; call our version
+             (substitute* "base/Makefile"
+               (("\\$\\$\\(build_depsbindir\\)/libwhich")
+                (string-append (assoc-ref inputs "libwhich") "/bin/libwhich")))
+             #t))
+         (add-before 'check 'set-home
+           ;; Some tests require a home directory to be set.
+           (lambda _ (setenv "HOME" "/tmp") #t))
+         (add-before 'build 'fix-include-and-link-paths
+           (lambda* (#:key inputs #:allow-other-keys)
+             ;; LIBUTF8PROC is a linker flag, not a build target.  It is
+             ;; included in the LIBFILES_* variable which is used as a
+             ;; collection of build targets and a list of libraries to link
+             ;; against.
+             (substitute* "src/flisp/Makefile"
+               (("\\$\\(BUILDDIR\\)/\\$\\(EXENAME\\)\\$\\(EXE\\): \\$\\(OBJS\\) \\$\\(LIBFILES_release\\)")
+                "$(BUILDDIR)/$(EXENAME)$(EXE): $(OBJS) $(LLT_release)")
+               (("\\$\\(BUILDDIR\\)/\\$\\(EXENAME\\)-debug$(EXE): \\$\\(DOBJS\\) \\$\\(LIBFILES_debug\\)")
+                "$(BUILDDIR)/$(EXENAME)-debug\\$\\(EXE\\): $(DOBJS) $(LLT_debug)"))
+
+             ;; The REPL must be linked with libuv.
+             (substitute* "ui/Makefile"
+               (("JLDFLAGS \\+= ")
+                (string-append "JLDFLAGS += "
+                               (assoc-ref %build-inputs "libuv")
+                               "/lib/libuv.so ")))
+
+             (substitute* "base/Makefile"
+               (("\\$\\(build_includedir\\)/uv/errno.h")
+                (string-append (assoc-ref inputs "libuv")
+                               "/include/uv/errno.h")))
+             #t))
+         (add-before 'build 'replace-default-shell
+           (lambda _
+             (substitute* "base/client.jl"
+               (("/bin/sh") (which "sh")))
+             #t))
+         (add-before 'build 'fix-precompile
+           (lambda _
+             (substitute* "base/loading.jl"
+               (("something(Base.active_project(), \"\")") "\"\""))
+             #t))
+         (add-before 'check 'disable-broken-tests
+           (lambda _
+             (substitute* "test/choosetests.jl"
+               (("tests = testnames")
+                ;; Those failings are not deterministic.  They depends on the
+                ;; running order.  I think it depends on the number of
+                ;; runners, disabling it for now
+                ;; https://github.com/JuliaLang/julia/issues/34330
+                "tests = filter(e->!in(e,[\"backtrace\",\"exceptions\",\"precompile\",
+                                           \"client\",\"stacktraces\"]),
+                                       testnames)"))
+             ;; precompile test is broken, fixed in
+             ;; fed29f893544d1dc8f86444c65d632c68168d0f3
+             (substitute* "test/precompile.jl"
+               (("@test !isdefined\\(Base.Nothing.name.mt")
+                "# @test !isdefined(Base.Nothing.name.mt"))
+             ;; When HOME is not set, julia calls uv_os_homedir, which in
+             ;; turns call getpwuid_r. Add the HOME env variable to the
+             ;; external julia call to fix this
+             (substitute* "test/cmdlineargs.jl"
+               (("\"JULIA_PROJECT\"") "\"HOME\"=>\"/tmp\", \"JULIA_PROJECT\""))
+             ;; Marking the test as broken as it's a known bug:
+             ;; https://github.com/JuliaLang/julia/issues/32377
+             (substitute* "stdlib/REPL/test/replcompletions.jl"
+               (("@test count") "@test_broken count"))
+             ;; Dates has a similar bug:
+             ;; https://github.com/JuliaLang/julia/issues/34655
+             (substitute* "stdlib/Dates/test/io.jl"
+               (("\"Dates.Time") "\"Time"))
+             ;; Upstream bug I found when packaging
+             ;; https://github.com/JuliaLang/julia/issues/35785
+             (substitute* "test/file.jl"
+               (("@test dirname\\(t\\) == d") "@test_broken dirname(t) == d"))
+             #t))
+         (add-after 'install 'make-wrapper
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (bin (string-append out "/bin"))
+                    (program "julia"))
+               (with-directory-excursion bin
+                 (wrap-program program
+                   `("JULIA_LOAD_PATH" ":" prefix
+                     ("" "$JULIA_LOAD_PATH")))
+                 (wrap-program program
+                   `("JULIA_DEPOT_PATH" ":" prefix
+                     ("" "$JULIA_DEPOT_PATH"))))
+               #t))))
+       #:make-flags
+       (list
+        (string-append "prefix=" (assoc-ref %outputs "out"))
+
+         ;; Passing the MARCH flag is necessary to build binary substitutes for
+         ;; the supported architectures.
+         ,(match (or (%current-target-system)
+                     (%current-system))
+                 ("x86_64-linux" "MARCH=x86-64")
+                 ("i686-linux" "MARCH=pentium4")
+                 ("aarch64-linux" "MARCH=armv8-a")
+                 ;; Prevent errors when querying this package on unsupported
+                 ;; platforms, e.g. when running "guix package --search="
+                 (_ "MARCH=UNSUPPORTED"))
+
+         "CONFIG_SHELL=bash"     ;needed to build bundled libraries
+         ;; list of "USE_SYSTEM_*" is here:
+         ;; https://github.com/JuliaLang/julia/blob/v1.3.1/Make.inc
+         "USE_SYSTEM_DSFMT=1"
+         "USE_SYSTEM_P7ZIP=1"
+         "USE_SYSTEM_LAPACK=1"
+         "USE_SYSTEM_BLAS=1"
+         "USE_BLAS64=0"          ;needed when USE_SYSTEM_BLAS=1
+         "LIBBLAS=-lopenblas"
+         "LIBBLASNAME=libopenblas"
+
+         "USE_SYSTEM_SUITESPARSE=1"
+         (string-append "SUITESPARSE_INC=-I "
+                        (assoc-ref %build-inputs "suitesparse")
+                        "/include")
+         "USE_GPL_LIBS=1"        ;proudly
+         "USE_SYSTEM_UTF8PROC=1"
+         (string-append "UTF8PROC_INC="
+                        (assoc-ref %build-inputs "utf8proc")
+                        "/include")
+         "USE_SYSTEM_LLVM=1"
+         "LLVM_VER=8.0.0"
+
+         "USE_LLVM_SHLIB=1"
+         "USE_SYSTEM_LIBUNWIND=1"
+         "USE_SYSTEM_LIBUV=1"
+         (string-append "LIBUV="
+                        (assoc-ref %build-inputs "libuv")
+                        "/lib/libuv.so")
+         (string-append "LIBUV_INC="
+                        (assoc-ref %build-inputs "libuv")
+                        "/include")
+         "USE_SYSTEM_PATCHELF=1"
+         "USE_SYSTEM_PCRE=1"
+         "USE_SYSTEM_OPENLIBM=1"
+         "USE_SYSTEM_MBEDTLS=1"
+         "USE_SYSTEM_LIBSSH2=1"
+         "USE_SYSTEM_GMP=1"
+         "USE_SYSTEM_MPFR=1"
+         "USE_SYSTEM_ARPACK=1"
+         "USE_SYSTEM_LIBGIT2=1"
+         "USE_SYSTEM_ZLIB=1")))
+    (inputs
+     `(("llvm" ,llvm-julia)
+       ("p7zip" ,p7zip)
+       ;; The bundled version is 3.3.0 so stick to that version.  With other
+       ;; versions, we get test failures in 'linalg/arnoldi' as described in
+       ;; <https://bugs.gnu.org/30282>.
+       ("arpack-ng" ,arpack-ng-3.3.0)
+
+       ("coreutils" ,coreutils) ;for bindings to "mkdir" and the like
+       ("lapack" ,lapack)
+       ("openblas" ,openblas) ;Julia does not build with Atlas
+       ("libunwind" ,libunwind-julia)
+       ("openlibm" ,openlibm)
+       ("mbedtls" ,mbedtls-apache)
+       ("curl" ,curl)
+       ("libgit2" ,libgit2-0.28)
+       ("libssh2" ,libssh2)
+       ("fortran" ,gfortran)
+       ("libuv" ,libuv-julia)
+       ("pcre2" ,pcre2)
+       ("utf8proc" ,utf8proc)
+       ("mpfr" ,mpfr)
+       ("wget" ,wget)
+       ("which" ,which)
+       ("zlib" ,zlib)
+       ("gmp" ,gmp)
+       ("suitesparse" ,suitesparse)
+       ;; Find dependencies versions here:
+       ;; https://raw.githubusercontent.com/JuliaLang/julia/v1.3.0/deps/Versions.make
+       ("libwhich" ,libwhich)
+       ("dsfmt" ,dsfmt)))
+    (native-inputs
+     `(("openssl" ,openssl)
+       ("perl" ,perl)
+       ("patchelf" ,patchelf)
+       ("pkg-config" ,pkg-config)
+       ("python" ,python-2)))
+    (native-search-paths
+      (list (search-path-specification
+              (variable "JULIA_LOAD_PATH")
+              (files (list "share/julia/packages/")))
+            (search-path-specification
+              (variable "JULIA_DEPOT_PATH")
+              (files (list "share/julia/")))))
+    ;; Julia is not officially released for ARM and MIPS.
+    ;; See https://github.com/JuliaLang/julia/issues/10639
+    (supported-systems '("i686-linux" "x86_64-linux" "aarch64-linux"))
+    (home-page "https://julialang.org/")
+    (synopsis "High-performance dynamic language for technical computing")
+    (description
+     "Julia is a high-level, high-performance dynamic programming language for
+technical computing, with syntax that is familiar to users of other technical
+computing environments.  It provides a sophisticated compiler, distributed
+parallel execution, numerical accuracy, and an extensive mathematical function
+library.")
+    (license license:expat)))