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