gnu: ruby-listen: Update to 3.1.5.
[jackhill/guix/guix.git] / gnu / packages / julia.scm
index 7c7b53e..f6df281 100644 (file)
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2015, 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -26,6 +27,7 @@
   #: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 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 "030481e9d659fd46702ab747caf2cbbe19d537ba")
-        (revision "1"))
+  (let ((commit "52d72a52cc7ccd570929990f010ed16e2ec604c8")
+        (revision "5"))
     (package (inherit libuv)
       (name "libuv-julia")
-      (version (string-append "0.11.26." revision "-" (string-take commit 8)))
+      (version (string-append "1.9.0-" revision "." (string-take commit 8)))
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
@@ -56,7 +59,7 @@
                 (file-name (string-append name "-" version "-checkout"))
                 (sha256
                  (base32
-                  "1ss63wfr2hghc8kb6ciry394gp6x58haz8vaj57l5mp80z04gd54"))))
+                  "1daxh6ci6q7znxxajr3bm16dd53ragm0d681wf4kzg542qnjq3lh"))))
       (build-system gnu-build-system)
       (arguments
        (substitute-keyword-arguments (package-arguments libuv)
              (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.4.2")
+    (version "0.6.0")
     (source (origin
               (method url-fetch)
               (uri (string-append
                     "https://github.com/JuliaLang/julia/releases/download/v"
-                    version "/julia-" version "-full.tar.gz"))
+                    version "/julia-" version ".tar.gz"))
               (sha256
                (base32
-                "0sikirixvryf8z3d0skig22fpip64jk001qsha98iwsrcfiqpyds"))))
+                "0rd6lcc9sic10q1j3c6f9qr901i1c4554m93n2sz5b3mh37byqhw"))))
     (build-system gnu-build-system)
     (arguments
      `(#:test-target "test"
@@ -84,6 +99,9 @@
                   (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.
        #: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/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 ccall.cpp to contain a static 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/ccall.cpp"
+            (substitute* "src/runtime_ccall.cpp"
               (("jl_read_sonames.*;")
                (string-join
                 (map (match-lambda
                        ("gmp"         "libgmp"         "libgmp.so")
                        ("openlibm"    "libopenlibm"    "libopenlibm.so")
                        ("openspecfun" "libopenspecfun" "libopenspecfun.so")
-                       ("fftw"        "libfftw3"       "libfftw3.so")
-                       ("fftwf"       "libfftw3f"      "libfftw3f.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)
                               (assoc-ref %build-inputs "libuv")
                               "/lib/libuv.so ")))
 
-            (substitute* "deps/Makefile"
-              (("/usr/include/double-conversion")
-               (string-append (assoc-ref %build-inputs "double-conversion")
-                              "/include/double-conversion")))
             (substitute* "base/Makefile"
               (("\\$\\(build_includedir\\)/uv-errno.h")
                (string-append (assoc-ref inputs "libuv")
          (add-before 'check 'disable-broken-tests
            (lambda _
              (substitute* "test/choosetests.jl"
-               ;; These tests time out.  See
-               ;; https://github.com/JuliaLang/julia/issues/14374 for ongoing
-               ;; discussion.
-               (("\"replcompletions\",") "")
-               (("\"repl\",") ""))
-             (substitute* "test/repl.jl"
-               ;; This test fails because we cannot escape the build
-               ;; directory.
-               (("@test pwd\\(\\) == homedir\\(\\)") "#"))
+               ;; 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
                     (%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_RMATH=0"    ;Julia uses a bundled version of R's math
-                                ;library, patched to use the DSFMT RNG.
-
         "USE_SYSTEM_LAPACK=1"
         "USE_SYSTEM_BLAS=1"
         "USE_BLAS64=0"          ;needed when USE_SYSTEM_BLAS=1
         ;;                "/include")
 
         "USE_GPL_LIBS=1"        ;proudly
-        "USE_SYSTEM_GRISU=1"    ;for double-conversion
         "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="
         "USE_SYSTEM_LIBGIT2=1"
         "USE_SYSTEM_OPENSPECFUN=1")))
     (inputs
-     `(("llvm" ,llvm-3.5)
+     `(("llvm" ,llvm)
        ("arpack-ng" ,arpack-ng)
        ("coreutils" ,coreutils) ;for bindings to "mkdir" and the like
        ("lapack" ,lapack)
        ("openblas" ,openblas) ;Julia does not build with Atlas
-       ("libunwind" ,libunwind)
+       ("libunwind" ,libunwind-for-julia)
        ("openlibm" ,openlibm)
        ("openspecfun" ,openspecfun)
-       ("double-conversion" ,double-conversion)
        ("libgit2" ,libgit2)
        ("fftw" ,fftw)
        ("fftwf" ,fftwf)
        ("mpfr" ,mpfr)
        ("wget" ,wget)
        ("which" ,which)
-       ("gmp" ,gmp)))
+       ("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
-     `(("perl" ,perl)
+     `(("openssl" ,openssl)
+       ("perl" ,perl)
        ("patchelf" ,patchelf)
        ("pkg-config" ,pkg-config)
-       ("python" ,python-2)))
+       ("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"))
+    (supported-systems '("i686-linux" "x86_64-linux" "aarch64-linux"))
     (home-page "http://julialang.org/")
     (synopsis "High-performance dynamic language for technical computing")
     (description