217 lines
5.2 KiB
Nix
217 lines
5.2 KiB
Nix
{
|
|
stdenv,
|
|
lib,
|
|
writeTextFile,
|
|
sagelib,
|
|
sage-docbuild,
|
|
env-locations,
|
|
gfortran,
|
|
ninja,
|
|
bash,
|
|
coreutils,
|
|
gnused,
|
|
gnugrep,
|
|
gawk,
|
|
binutils,
|
|
pythonEnv,
|
|
python3,
|
|
pkg-config,
|
|
pari,
|
|
gap,
|
|
maxima,
|
|
singular,
|
|
fflas-ffpack,
|
|
givaro,
|
|
gd,
|
|
libpng,
|
|
linbox,
|
|
m4ri,
|
|
giac,
|
|
palp,
|
|
rWrapper,
|
|
gfan,
|
|
cddlib,
|
|
jmol,
|
|
tachyon,
|
|
glpk,
|
|
eclib,
|
|
sympow,
|
|
nauty,
|
|
sqlite,
|
|
ppl,
|
|
ecm,
|
|
lcalc,
|
|
rubiks,
|
|
blas,
|
|
lapack,
|
|
flint3,
|
|
gmp,
|
|
mpfr,
|
|
zlib,
|
|
gsl,
|
|
ntl,
|
|
jre8,
|
|
less,
|
|
}:
|
|
|
|
assert (!blas.isILP64) && (!lapack.isILP64);
|
|
|
|
# This generates a `sage-env` shell file that will be sourced by sage on startup.
|
|
# It sets up various environment variables, telling sage where to find its
|
|
# dependencies.
|
|
|
|
let
|
|
runtimepath = (
|
|
lib.makeBinPath ([
|
|
"@sage-local@"
|
|
"@sage-local@/build"
|
|
pythonEnv
|
|
gfortran # for inline fortran
|
|
ninja # for inline fortran via numpy.f2py
|
|
stdenv.cc # for cython
|
|
bash
|
|
coreutils
|
|
gnused
|
|
gnugrep
|
|
gawk
|
|
binutils.bintools
|
|
pkg-config
|
|
pari
|
|
gap
|
|
maxima.lisp-compiler
|
|
maxima
|
|
singular
|
|
giac
|
|
palp
|
|
# needs to be rWrapper since the default `R` doesn't include R's default libraries
|
|
rWrapper
|
|
gfan
|
|
cddlib
|
|
jmol
|
|
tachyon
|
|
glpk
|
|
eclib
|
|
sympow
|
|
nauty
|
|
sqlite
|
|
ppl
|
|
ecm
|
|
lcalc
|
|
rubiks
|
|
jre8 # only needed for `jmol` (https://sourceforge.net/p/jmol/mailman/message/58818762/), which will be optional in sage 10.5
|
|
less # needed to prevent transient test errors until https://github.com/ipython/ipython/pull/11864 is resolved
|
|
])
|
|
);
|
|
in
|
|
writeTextFile rec {
|
|
name = "sage-env";
|
|
destination = "/${name}";
|
|
text =
|
|
''
|
|
export PKG_CONFIG_PATH='${
|
|
lib.makeSearchPathOutput "dev" "lib/pkgconfig" [
|
|
# This should only be needed during build. However, since the doctests
|
|
# also test the cython build (for example in src/sage/misc/cython.py),
|
|
# it is also needed for the testsuite to pass. We could fix the
|
|
# testsuite instead, but since all the packages are also runtime
|
|
# dependencies it doesn't really hurt to include them here.
|
|
singular
|
|
blas
|
|
lapack
|
|
fflas-ffpack
|
|
givaro
|
|
gd
|
|
libpng
|
|
zlib
|
|
gsl
|
|
linbox
|
|
m4ri
|
|
]
|
|
}'
|
|
export SAGE_ROOT='${sagelib.src}'
|
|
''
|
|
+
|
|
# TODO: is using pythonEnv instead of @sage-local@ here a good
|
|
# idea? there is a test in src/sage/env.py that checks if the values
|
|
# SAGE_ROOT and SAGE_LOCAL set here match the ones set in env.py.
|
|
# we fix up env.py's SAGE_ROOT in sage-src.nix (which does not
|
|
# have access to sage-with-env), but env.py autodetects
|
|
# SAGE_LOCAL to be pythonEnv.
|
|
# setting SAGE_LOCAL to pythonEnv also avoids having to create
|
|
# python3, ipython, ipython3 and jupyter symlinks in
|
|
# sage-with-env.nix.
|
|
''
|
|
export SAGE_LOCAL='${pythonEnv}'
|
|
|
|
export SAGE_SHARE='${sagelib}/share'
|
|
export SAGE_ENV_CONFIG_SOURCED=1 # sage-env complains if sage-env-config is not sourced beforehand
|
|
orig_path="$PATH"
|
|
export PATH='${runtimepath}'
|
|
|
|
# set dependent vars, like JUPYTER_CONFIG_DIR
|
|
source "${sagelib.src}/src/bin/sage-env"
|
|
export PATH="$RUNTIMEPATH_PREFIX:${runtimepath}:$orig_path" # sage-env messes with PATH
|
|
|
|
export SAGE_LOGS="$TMPDIR/sage-logs"
|
|
export SAGE_DOC="''${SAGE_DOC_OVERRIDE:-doc-placeholder}"
|
|
export SAGE_DOC_SRC="''${SAGE_DOC_SRC_OVERRIDE:-${sagelib.src}/src/doc}"
|
|
|
|
# set locations of dependencies
|
|
. ${env-locations}/sage-env-locations
|
|
|
|
# needed for cython
|
|
export CC='${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc'
|
|
export CXX='${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++'
|
|
# cython needs to find these libraries, otherwise will fail with `ld: cannot find -lflint` or similar
|
|
export LDFLAGS='${
|
|
lib.concatStringsSep " " (
|
|
map (pkg: "-L${pkg}/lib") [
|
|
flint3
|
|
gap
|
|
glpk
|
|
gmp
|
|
mpfr
|
|
pari
|
|
zlib
|
|
eclib
|
|
gsl
|
|
ntl
|
|
jmol
|
|
sympow
|
|
]
|
|
)
|
|
}'
|
|
export CFLAGS='${
|
|
lib.concatStringsSep " " (
|
|
map (pkg: "-isystem ${pkg}/include") [
|
|
singular
|
|
gmp.dev
|
|
glpk
|
|
flint3
|
|
gap
|
|
mpfr.dev
|
|
]
|
|
)
|
|
}'
|
|
export CXXFLAGS=$CFLAGS
|
|
|
|
export SAGE_LIB='${sagelib}/${python3.sitePackages}'
|
|
|
|
export SAGE_EXTCODE='${sagelib.src}/src/sage/ext_data'
|
|
|
|
# for find_library
|
|
export DYLD_LIBRARY_PATH="${
|
|
lib.makeLibraryPath [
|
|
stdenv.cc.libc
|
|
singular
|
|
giac
|
|
gap
|
|
]
|
|
}''${DYLD_LIBRARY_PATH:+:}$DYLD_LIBRARY_PATH"
|
|
'';
|
|
}
|
|
// {
|
|
# equivalent of `passthru`, which `writeTextFile` doesn't support
|
|
lib = sagelib;
|
|
docbuild = sage-docbuild;
|
|
}
|