1{ stdenv, fetchgit, fetchurl
2# build tools
3, gfortran, m4, makeWrapper, patchelf, perl, which, python2
4# libjulia dependencies
5, libunwind, llvm, readline, utf8proc, zlib
6# standard library dependencies
7, curl, fftwSinglePrec, fftw, gmp, libgit2, mpfr, openlibm, openspecfun, pcre2
8# linear algebra
9, openblas, arpack, suitesparse
10}:
11
12with stdenv.lib;
13
14# All dependencies must use the same OpenBLAS.
15let
16 arpack_ = arpack;
17 suitesparse_ = suitesparse;
18in
19let
20 arpack = arpack_.override { inherit openblas; };
21 suitesparse = suitesparse_.override { inherit openblas; };
22in
23
24let
25 dsfmtVersion = "2.2.3";
26 dsfmt = fetchurl {
27 url = "http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/dSFMT-src-${dsfmtVersion}.tar.gz";
28 sha256 = "03kaqbjbi6viz0n33dk5jlf6ayxqlsq4804n7kwkndiga9s4hd42";
29 };
30
31 libuvVersion = "07730c4bd595b4d45a498a8ee0bcd53878ff7c10";
32 libuv = fetchurl {
33 url = "https://api.github.com/repos/JuliaLang/libuv/tarball/${libuvVersion}";
34 sha256 = "19nk8vdvx2mxyrwpndb7888c3b237ja5xvxr3jk5ah77ix3srr3h";
35 };
36
37 rmathVersion = "0.1";
38 rmath-julia = fetchurl {
39 url = "https://api.github.com/repos/JuliaLang/Rmath-julia/tarball/v${rmathVersion}";
40 sha256 = "0ai5dhjc43zcvangz123ryxmlbm51s21rg13bllwyn98w67arhb4";
41 };
42
43 virtualenvVersion = "1.11.6";
44 virtualenv = fetchurl {
45 url = "https://pypi.python.org/packages/source/v/virtualenv/virtualenv-${virtualenvVersion}.tar.gz";
46 sha256 = "1xq4prmg25n9cz5zcvbqx68lmc3kl39by582vd8pzs9f3qalqyiy";
47 };
48in
49
50stdenv.mkDerivation rec {
51 pname = "julia";
52 version = "0.4.4-pre-2016-02-08";
53 name = "${pname}-${version}";
54
55 src = fetchgit {
56 url = "https://github.com/JuliaLang/${pname}";
57 rev = "cb93e6b70b4b1313b4de8c54e55e85c8eb43daa3";
58 sha256 = "11dmbjqiidlbh8sj5s09zsbfslm3zs0kw7iq40281hl5dfsr7zm6";
59 };
60
61 prePatch = ''
62 mkdir deps/srccache
63 cp "${dsfmt}" "./deps/srccache/dsfmt-${dsfmtVersion}.tar.gz"
64 cp "${rmath-julia}" "./deps/srccache/Rmath-julia-${rmathVersion}.tar.gz"
65 cp "${libuv}" "./deps/srccache/libuv-${libuvVersion}.tar.gz"
66 cp "${virtualenv}" "./deps/srccache/virtualenv-${virtualenvVersion}.tar.gz"
67 '';
68
69 patches = [
70 ./0001.1-use-system-utf8proc.patch
71 ./0002-use-system-suitesparse.patch
72 ];
73
74 postPatch = ''
75 patchShebangs . contrib
76 '';
77
78 buildInputs = [
79 arpack fftw fftwSinglePrec gmp libgit2 libunwind llvm mpfr
80 pcre2 openblas openlibm openspecfun readline suitesparse utf8proc
81 zlib
82 ];
83
84 nativeBuildInputs = [ curl gfortran m4 makeWrapper patchelf perl python2 which ];
85
86 makeFlags =
87 let
88 arch = head (splitString "-" stdenv.system);
89 march = { "x86_64" = "x86-64"; "i686" = "i686"; }."${arch}"
90 or (throw "unsupported architecture: ${arch}");
91 # Julia requires Pentium 4 (SSE2) or better
92 cpuTarget = { "x86_64" = "x86-64"; "i686" = "pentium4"; }."${arch}"
93 or (throw "unsupported architecture: ${arch}");
94 in [
95 "ARCH=${arch}"
96 "MARCH=${march}"
97 "JULIA_CPU_TARGET=${cpuTarget}"
98 "PREFIX=$(out)"
99 "prefix=$(out)"
100 "SHELL=${stdenv.shell}"
101
102 "USE_SYSTEM_BLAS=1"
103 "USE_BLAS64=${if openblas.blas64 then "1" else "0"}"
104 "LIBBLAS=-lopenblas"
105 "LIBBLASNAME=libopenblas"
106
107 "USE_SYSTEM_LAPACK=1"
108 "LIBLAPACK=-lopenblas"
109 "LIBLAPACKNAME=libopenblas"
110
111 "USE_SYSTEM_SUITESPARSE=1"
112 "SUITESPARSE_LIB=-lsuitesparse"
113 "SUITESPARSE_INC=-I${suitesparse}/include"
114
115 "USE_SYSTEM_ARPACK=1"
116 "USE_SYSTEM_FFTW=1"
117 "USE_SYSTEM_GMP=1"
118 "USE_SYSTEM_LIBGIT2=1"
119 "USE_SYSTEM_LIBUNWIND=1"
120 "USE_SYSTEM_LLVM=1"
121 "USE_SYSTEM_MPFR=1"
122 "USE_SYSTEM_OPENLIBM=1"
123 "USE_SYSTEM_OPENSPECFUN=1"
124 "USE_SYSTEM_PATCHELF=1"
125 "USE_SYSTEM_PCRE=1"
126 "USE_SYSTEM_READLINE=1"
127 "USE_SYSTEM_UTF8PROC=1"
128 "USE_SYSTEM_ZLIB=1"
129 ];
130
131 NIX_CFLAGS_COMPILE = [ "-fPIC" ];
132
133 LD_LIBRARY_PATH = makeSearchPath "lib" [
134 arpack fftw fftwSinglePrec gmp libgit2 mpfr openblas openlibm
135 openspecfun pcre2 suitesparse
136 ];
137
138 dontStrip = true;
139 dontPatchELF = true;
140
141 enableParallelBuilding = true;
142
143 doCheck = true;
144 checkTarget = "testall";
145 # Julia's tests require read/write access to $HOME
146 preCheck = ''
147 export HOME="$NIX_BUILD_TOP"
148 '';
149
150 preBuild = ''
151 sed -e '/^install:/s@[^ ]*/doc/[^ ]*@@' -i Makefile
152 sed -e '/[$](DESTDIR)[$](docdir)/d' -i Makefile
153 '';
154
155 postInstall = ''
156 for prog in "$out/bin/julia" "$out/bin/julia-debug"; do
157 wrapProgram "$prog" \
158 --prefix LD_LIBRARY_PATH : "$LD_LIBRARY_PATH" \
159 --prefix PATH : "${curl}/bin"
160 done
161 '';
162
163 meta = {
164 description = "High-level performance-oriented dynamical language for technical computing";
165 homepage = "http://julialang.org/";
166 license = stdenv.lib.licenses.mit;
167 maintainers = with stdenv.lib.maintainers; [ raskin ttuegel ];
168 platforms = [ "i686-linux" "x86_64-linux" "x86_64-darwin" ];
169 };
170}