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