Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
1{ stdenv, fetchgit, fetchurl
2# build tools
3, gfortran, m4, makeWrapper, patchelf, perl, which, python2, paxctl
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# Darwin frameworks
11, CoreServices, ApplicationServices
12}:
13
14with stdenv.lib;
15
16# All dependencies must use the same OpenBLAS.
17let
18 arpack_ = arpack;
19 suitesparse_ = suitesparse;
20in
21let
22 arpack = arpack_.override { inherit openblas; };
23 suitesparse = suitesparse_.override { inherit openblas; };
24 llvmShared = if stdenv.isDarwin
25 then llvm.override { enableSharedLibraries = true; }
26 else llvm;
27in
28
29let
30 dsfmtVersion = "2.2.3";
31 dsfmt = fetchurl {
32 url = "http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/dSFMT-src-${dsfmtVersion}.tar.gz";
33 sha256 = "03kaqbjbi6viz0n33dk5jlf6ayxqlsq4804n7kwkndiga9s4hd42";
34 };
35
36 libuvVersion = "efb40768b7c7bd9f173a7868f74b92b1c5a61a0e";
37 libuv = fetchurl {
38 url = "https://api.github.com/repos/JuliaLang/libuv/tarball/${libuvVersion}";
39 sha256 = "1znkxyv1cy9pjap7afypipzsn04533ni3pqjd191fdgw2sv9cal7";
40 };
41
42 rmathVersion = "0.1";
43 rmath-julia = fetchurl {
44 url = "https://api.github.com/repos/JuliaLang/Rmath-julia/tarball/v${rmathVersion}";
45 sha256 = "0ai5dhjc43zcvangz123ryxmlbm51s21rg13bllwyn98w67arhb4";
46 };
47in
48
49stdenv.mkDerivation rec {
50 pname = "julia";
51 version = "0.4.7";
52 name = "${pname}-${version}";
53
54 src = fetchurl {
55 url = "https://github.com/JuliaLang/${pname}/releases/download/v${version}/${name}.tar.gz";
56 sha256 = "09f531jhs8pyd1xng5c26x994w7q0sxxr28mr3qfw9wpkbmsc2pf";
57 };
58
59 prePatch = ''
60 cp "${dsfmt}" "./deps/dsfmt-${dsfmtVersion}.tar.gz"
61 cp "${rmath-julia}" "./deps/Rmath-julia-${rmathVersion}.tar.gz"
62 cp "${libuv}" "./deps/libuv-${libuvVersion}.tar.gz"
63 '';
64
65 patches = [
66 ./0001-use-system-utf8proc.patch
67 ./0002-use-system-suitesparse.patch
68 ./0003-no-ldconfig.patch
69 ] ++ stdenv.lib.optional stdenv.needsPax ./0004-hardened-0.4.7.patch;
70
71 postPatch = ''
72 patchShebangs . contrib
73 '';
74
75 buildInputs = [
76 arpack fftw fftwSinglePrec gmp libgit2 libunwind llvmShared mpfr
77 pcre2.dev openblas openlibm openspecfun readline suitesparse utf8proc
78 zlib
79 ] ++
80 stdenv.lib.optionals stdenv.isDarwin [CoreServices ApplicationServices] ;
81
82 nativeBuildInputs = [ curl gfortran m4 makeWrapper patchelf perl python2 which ]
83 ++ stdenv.lib.optional stdenv.needsPax paxctl;
84
85 makeFlags =
86 let
87 arch = head (splitString "-" stdenv.system);
88 march = { "x86_64" = "x86-64"; "i686" = "i686"; }."${arch}"
89 or (throw "unsupported architecture: ${arch}");
90 # Julia requires Pentium 4 (SSE2) or better
91 cpuTarget = { "x86_64" = "x86-64"; "i686" = "pentium4"; }."${arch}"
92 or (throw "unsupported architecture: ${arch}");
93 in [
94 "ARCH=${arch}"
95 "MARCH=${march}"
96 "JULIA_CPU_TARGET=${cpuTarget}"
97 "PREFIX=$(out)"
98 "prefix=$(out)"
99 "SHELL=${stdenv.shell}"
100
101 "USE_SYSTEM_BLAS=1"
102 "USE_BLAS64=${if openblas.blas64 then "1" else "0"}"
103 "LIBBLAS=-lopenblas"
104 "LIBBLASNAME=libopenblas"
105
106 "USE_SYSTEM_LAPACK=1"
107 "LIBLAPACK=-lopenblas"
108 "LIBLAPACKNAME=libopenblas"
109
110 "USE_SYSTEM_SUITESPARSE=1"
111 "SUITESPARSE_LIB=-lsuitesparse"
112 "SUITESPARSE_INC=-I${suitesparse}/include"
113
114 "USE_SYSTEM_ARPACK=1"
115 "USE_SYSTEM_FFTW=1"
116 "USE_SYSTEM_GMP=1"
117 "USE_SYSTEM_LIBGIT2=1"
118 "USE_SYSTEM_LIBUNWIND=1"
119 "USE_SYSTEM_LLVM=1"
120 "USE_SYSTEM_MPFR=1"
121 "USE_SYSTEM_OPENLIBM=1"
122 "USE_SYSTEM_OPENSPECFUN=1"
123 "USE_SYSTEM_PATCHELF=1"
124 "USE_SYSTEM_PCRE=1"
125 "PCRE_CONFIG=${pcre2.dev}/bin/pcre2-config"
126 "PCRE_INCL_PATH=${pcre2.dev}/include/pcre2.h"
127 "USE_SYSTEM_READLINE=1"
128 "USE_SYSTEM_UTF8PROC=1"
129 "USE_SYSTEM_ZLIB=1"
130 ];
131
132 NIX_CFLAGS_COMPILE = [ "-fPIC" ];
133
134 LD_LIBRARY_PATH = makeLibraryPath [
135 arpack fftw fftwSinglePrec gmp libgit2 mpfr openblas openlibm
136 openspecfun pcre2 suitesparse
137 ];
138
139 NIX_LDFLAGS = optionalString stdenv.isDarwin "-rpath ${llvmShared}/lib";
140
141 dontStrip = true;
142 dontPatchELF = true;
143
144 enableParallelBuilding = true;
145
146 doCheck = true;
147 checkTarget = "testall";
148 # Julia's tests require read/write access to $HOME
149 preCheck = ''
150 export HOME="$NIX_BUILD_TOP"
151 '';
152
153 postInstall = ''
154 for prog in "$out/bin/julia" "$out/bin/julia-debug"; do
155 wrapProgram "$prog" \
156 --prefix LD_LIBRARY_PATH : "$LD_LIBRARY_PATH" \
157 --prefix PATH : "${stdenv.lib.makeBinPath [ curl ]}"
158 done
159 '';
160
161 meta = {
162 description = "High-level performance-oriented dynamical language for technical computing";
163 homepage = https://julialang.org/;
164 license = stdenv.lib.licenses.mit;
165 maintainers = with stdenv.lib.maintainers; [ raskin ];
166 platforms = [ "i686-linux" "x86_64-linux" "x86_64-darwin" ];
167 broken = stdenv.isi686;
168 };
169}