mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-29 00:53:57 +00:00
a4f2b97a24
Erroneously disabled by 3ae5e6ce03
as it
mistook Julia for using CMake (it is used by some of the vendored
dependencies).
214 lines
7.1 KiB
Nix
214 lines
7.1 KiB
Nix
{ lib, stdenv, fetchpatch, fetchurl, fetchzip
|
|
# build tools
|
|
, gfortran, m4, makeWrapper, patchelf, perl, which, python2
|
|
, cmake
|
|
# libjulia dependencies
|
|
, libunwind, readline, utf8proc, zlib
|
|
# standard library dependencies
|
|
, curl, fftwSinglePrec, fftw, gmp, libgit2, mpfr, openlibm, openspecfun, pcre2
|
|
# linear algebra
|
|
, blas, lapack, arpack
|
|
# Darwin frameworks
|
|
, CoreServices, ApplicationServices
|
|
}:
|
|
|
|
|
|
let
|
|
majorVersion = "1";
|
|
minorVersion = "0";
|
|
maintenanceVersion = "4";
|
|
src_sha256 = "1dfx68wbrrzpbh74rla7i2g3r5z6wa1pxq3ahyfm5m27vfyjbkhg";
|
|
|
|
libuvVersion = "ed3700c849289ed01fe04273a7bf865340b2bd7e";
|
|
libuvSha256 = "137w666zsjw1p0ma3lf94d75hr1q45sgkfmbizkyji2qm57cnxjs";
|
|
|
|
dsfmtVersion = "2.2.3";
|
|
dsfmt = fetchurl {
|
|
url = "http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/dSFMT-src-${dsfmtVersion}.tar.gz";
|
|
sha256 = "03kaqbjbi6viz0n33dk5jlf6ayxqlsq4804n7kwkndiga9s4hd42";
|
|
};
|
|
|
|
libuv = fetchurl {
|
|
url = "https://api.github.com/repos/JuliaLang/libuv/tarball/${libuvVersion}";
|
|
sha256 = libuvSha256;
|
|
};
|
|
|
|
rmathVersion = "0.1";
|
|
rmath-julia = fetchurl {
|
|
url = "https://api.github.com/repos/JuliaLang/Rmath-julia/tarball/v${rmathVersion}";
|
|
sha256 = "1qyps217175qhid46l8f5i1v8i82slgp23ia63x2hzxwfmx8617p";
|
|
};
|
|
|
|
virtualenvVersion = "15.0.0";
|
|
virtualenv = fetchurl {
|
|
url = "mirror://pypi/v/virtualenv/virtualenv-${virtualenvVersion}.tar.gz";
|
|
sha256 = "06fw4liazpx5vf3am45q2pdiwrv0id7ckv7n6zmpml29x6vkzmkh";
|
|
};
|
|
|
|
libwhichVersion = "81e9723c0273d78493dc8c8ed570f68d9ce7e89e";
|
|
libwhich = fetchurl {
|
|
url = "https://api.github.com/repos/vtjnash/libwhich/tarball/${libwhichVersion}";
|
|
sha256 = "1p7zg31kpmpbmh1znrk1xrbd074agx13b9q4dcw8n2zrwwdlbz3b";
|
|
};
|
|
|
|
llvmVersion = "6.0.0";
|
|
llvm = fetchurl {
|
|
url = "http://releases.llvm.org/6.0.0/llvm-${llvmVersion}.src.tar.xz";
|
|
sha256 = "0224xvfg6h40y5lrbnb9qaq3grmdc5rg00xq03s1wxjfbf8krx8z";
|
|
};
|
|
|
|
suitesparseVersion = "4.4.5";
|
|
suitesparse = fetchurl {
|
|
url = "http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-${suitesparseVersion}.tar.gz";
|
|
sha256 = "1jcbxb8jx5wlcixzf6n5dca2rcfx6mlcms1k2rl5gp67ay3bix43";
|
|
};
|
|
version = "${majorVersion}.${minorVersion}.${maintenanceVersion}";
|
|
in
|
|
|
|
stdenv.mkDerivation rec {
|
|
pname = "julia";
|
|
inherit version;
|
|
|
|
src = fetchzip {
|
|
url = "https://github.com/JuliaLang/${pname}/releases/download/v${version}/${pname}-${version}.tar.gz";
|
|
sha256 = src_sha256;
|
|
};
|
|
|
|
nativeBuildInputs = [ cmake curl gfortran m4 makeWrapper patchelf perl python2 which ];
|
|
# cmake is only used to build the bundled deps
|
|
dontUseCmakeConfigure = true;
|
|
|
|
# We assert that compatible blas and lapack are used.
|
|
buildInputs = assert (blas.isILP64 == lapack.isILP64); [
|
|
arpack fftw fftwSinglePrec gmp libgit2 libunwind mpfr
|
|
pcre2.dev blas lapack openlibm openspecfun readline utf8proc
|
|
zlib
|
|
]
|
|
++ lib.optionals stdenv.isDarwin [CoreServices ApplicationServices]
|
|
;
|
|
|
|
patches = [
|
|
# Julia recompiles a precompiled file if the mtime stored *in* the
|
|
# .ji file differs from the mtime of the .ji file. This
|
|
# doesn't work in Nix because Nix changes the mtime of files in
|
|
# the Nix store to 1. So patch Julia to accept mtimes of 1.
|
|
./allow_nix_mtime.patch
|
|
./diagonal-test.patch
|
|
./use-system-utf8proc-julia-1.0.patch
|
|
];
|
|
|
|
postPatch = ''
|
|
patchShebangs . contrib
|
|
for i in backtrace cmdlineargs; do
|
|
mv test/$i.jl{,.off}
|
|
touch test/$i.jl
|
|
done
|
|
rm stdlib/Sockets/test/runtests.jl && touch stdlib/Sockets/test/runtests.jl
|
|
rm stdlib/Distributed/test/runtests.jl && touch stdlib/Distributed/test/runtests.jl
|
|
sed -e 's/Invalid Content-Type:/invalid Content-Type:/g' -i ./stdlib/LibGit2/test/libgit2.jl
|
|
sed -e 's/Failed to resolve /failed to resolve /g' -i ./stdlib/LibGit2/test/libgit2.jl
|
|
'';
|
|
prePatch = ''
|
|
mkdir deps/srccache
|
|
cp "${dsfmt}" "./deps/srccache/dsfmt-${dsfmtVersion}.tar.gz"
|
|
cp "${rmath-julia}" "./deps/srccache/Rmath-julia-${rmathVersion}.tar.gz"
|
|
cp "${libuv}" "./deps/srccache/libuv-${libuvVersion}.tar.gz"
|
|
cp "${virtualenv}" "./deps/srccache/virtualenv-${virtualenvVersion}.tar.gz"
|
|
cp "${libwhich}" "./deps/srccache/libwhich-${libwhichVersion}.tar.gz"
|
|
cp "${llvm}" "./deps/srccache/llvm-${llvmVersion}.src.tar.xz"
|
|
cp "${suitesparse}" "./deps/srccache/SuiteSparse-${suitesparseVersion}.tar.gz"
|
|
'';
|
|
|
|
makeFlags =
|
|
let
|
|
arch = lib.head (lib.splitString "-" stdenv.system);
|
|
march = {
|
|
x86_64 = stdenv.hostPlatform.gcc.arch or "x86-64";
|
|
i686 = "pentium4";
|
|
aarch64 = "armv8-a";
|
|
}.${arch}
|
|
or (throw "unsupported architecture: ${arch}");
|
|
# Julia requires Pentium 4 (SSE2) or better
|
|
cpuTarget = { x86_64 = "x86-64"; i686 = "pentium4"; aarch64 = "generic"; }.${arch}
|
|
or (throw "unsupported architecture: ${arch}");
|
|
in [
|
|
"ARCH=${arch}"
|
|
"MARCH=${march}"
|
|
"JULIA_CPU_TARGET=${cpuTarget}"
|
|
"PREFIX=$(out)"
|
|
"prefix=$(out)"
|
|
"SHELL=${stdenv.shell}"
|
|
|
|
(lib.optionalString (!stdenv.isDarwin) "USE_SYSTEM_BLAS=1")
|
|
"USE_BLAS64=${if blas.isILP64 then "1" else "0"}"
|
|
|
|
"USE_SYSTEM_LAPACK=1"
|
|
|
|
"USE_SYSTEM_ARPACK=1"
|
|
"USE_SYSTEM_FFTW=1"
|
|
"USE_SYSTEM_GMP=1"
|
|
"USE_SYSTEM_LIBGIT2=1"
|
|
"USE_SYSTEM_LIBUNWIND=1"
|
|
|
|
# We will probably never do that
|
|
#"USE_SYSTEM_LLVM=1"
|
|
"LLVM_VER=6.0.0"
|
|
|
|
"USE_SYSTEM_MPFR=1"
|
|
"USE_SYSTEM_OPENLIBM=1"
|
|
"USE_SYSTEM_OPENSPECFUN=1"
|
|
"USE_SYSTEM_PATCHELF=1"
|
|
"USE_SYSTEM_PCRE=1"
|
|
"PCRE_CONFIG=${pcre2.dev}/bin/pcre2-config"
|
|
"PCRE_INCL_PATH=${pcre2.dev}/include/pcre2.h"
|
|
"USE_SYSTEM_READLINE=1"
|
|
"USE_SYSTEM_UTF8PROC=1"
|
|
"USE_SYSTEM_ZLIB=1"
|
|
];
|
|
|
|
LD_LIBRARY_PATH = assert (blas.isILP64 == lapack.isILP64); (lib.makeLibraryPath [
|
|
arpack fftw fftwSinglePrec gmp libgit2 mpfr blas lapack openlibm
|
|
openspecfun pcre2
|
|
]);
|
|
|
|
doCheck = !stdenv.isDarwin;
|
|
checkTarget = "testall";
|
|
# Julia's tests require read/write access to $HOME
|
|
preCheck = ''
|
|
export HOME="$NIX_BUILD_TOP"
|
|
'';
|
|
|
|
preBuild = ''
|
|
sed -e '/^install:/s@[^ ]*/doc/[^ ]*@@' -i Makefile
|
|
sed -e '/[$](DESTDIR)[$](docdir)/d' -i Makefile
|
|
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
|
|
'';
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
postInstall = ''
|
|
# Symlink shared libraries from LD_LIBRARY_PATH into lib/julia,
|
|
# as using a wrapper with LD_LIBRARY_PATH causes segmentation
|
|
# faults when program returns an error:
|
|
# $ julia -e 'throw(Error())'
|
|
find $(echo $LD_LIBRARY_PATH | sed 's|:| |g') -maxdepth 1 -name '*.${if stdenv.isDarwin then "dylib" else "so"}*' | while read lib; do
|
|
if [[ ! -e $out/lib/julia/$(basename $lib) ]]; then
|
|
ln -sv $lib $out/lib/julia/$(basename $lib)
|
|
fi
|
|
done
|
|
'';
|
|
|
|
passthru = {
|
|
inherit majorVersion minorVersion maintenanceVersion;
|
|
site = "share/julia/site/v${majorVersion}.${minorVersion}";
|
|
};
|
|
|
|
meta = {
|
|
description = "High-level performance-oriented dynamical language for technical computing";
|
|
homepage = "https://julialang.org/";
|
|
license = lib.licenses.mit;
|
|
maintainers = with lib.maintainers; [ raskin rob garrison ];
|
|
platforms = [ "i686-linux" "x86_64-linux" "x86_64-darwin" "aarch64-linux" ];
|
|
};
|
|
}
|