forked from mirrors/nixpkgs
173 lines
5 KiB
Nix
173 lines
5 KiB
Nix
{ stdenv, fetchFromGitHub, gmp, bison, perl, ncurses, readline, coreutils, pkg-config
|
|
, lib
|
|
, autoreconfHook
|
|
, buildPackages
|
|
, sharutils
|
|
, file
|
|
, flint
|
|
, ntl
|
|
, cddlib
|
|
, gfan
|
|
, lrcalc
|
|
, doxygen
|
|
, graphviz
|
|
, latex2html
|
|
# upstream generates docs with texinfo 4. later versions of texinfo
|
|
# use letters instead of numbers for post-appendix chapters, and we
|
|
# want it to match the upstream format because sage depends on it.
|
|
, texinfo4
|
|
, texlive
|
|
, enableDocs ? true
|
|
, enableGfanlib ? true
|
|
}:
|
|
|
|
stdenv.mkDerivation rec {
|
|
pname = "singular";
|
|
version = "4.3.0";
|
|
|
|
# since the tarball does not contain tests, we fetch from GitHub.
|
|
src = fetchFromGitHub {
|
|
owner = "Singular";
|
|
repo = "Singular";
|
|
|
|
# if a release is tagged (which sometimes does not happen), it will
|
|
# be in the format below.
|
|
# rev = "Release-${lib.replaceStrings ["."] ["-"] version}";
|
|
rev = "d895b0f1f543c61eb03adddad20f08655a419d4e";
|
|
sha256 = "sha256-c5Qr6VUuPKjfw8fowjJJz3oGAyUwo/K0WeMvU5djzVA=";
|
|
|
|
# the repository's .gitattributes file contains the lines "/Tst/
|
|
# export-ignore" and "/doc/ export-ignore" so some directories are
|
|
# not included in the tarball downloaded by fetchzip.
|
|
forceFetchGit = true;
|
|
};
|
|
|
|
configureFlags = [
|
|
"--with-ntl=${ntl}"
|
|
"--disable-pyobject-module"
|
|
] ++ lib.optionals enableDocs [
|
|
"--enable-doc-build"
|
|
] ++ lib.optionals enableGfanlib [
|
|
"--enable-gfanlib"
|
|
];
|
|
|
|
prePatch = ''
|
|
# don't let the tests depend on `hostname`
|
|
substituteInPlace Tst/regress.cmd --replace 'mysystem_catch("hostname")' 'nix_test_runner'
|
|
|
|
patchShebangs .
|
|
'';
|
|
|
|
# For reference (last checked on commit 75f460d):
|
|
# https://github.com/Singular/Singular/blob/spielwiese/doc/Building-Singular-from-source.md
|
|
# https://github.com/Singular/Singular/blob/spielwiese/doc/external-packages-dynamic-modules.md
|
|
buildInputs = [
|
|
# necessary
|
|
gmp
|
|
# by upstream recommended but optional
|
|
ncurses
|
|
readline
|
|
ntl
|
|
flint
|
|
lrcalc
|
|
gfan
|
|
] ++ lib.optionals enableGfanlib [
|
|
cddlib
|
|
];
|
|
|
|
nativeBuildInputs = [
|
|
bison
|
|
perl
|
|
pkg-config
|
|
autoreconfHook
|
|
sharutils # needed for regress.cmd install checks
|
|
] ++ lib.optionals enableDocs [
|
|
doxygen
|
|
graphviz
|
|
latex2html
|
|
texinfo4
|
|
texlive.combined.scheme-small
|
|
];
|
|
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
|
|
|
preAutoreconf = ''
|
|
find . -type f -readable -writable -exec sed \
|
|
-e 's@/bin/rm@${coreutils}&@g' \
|
|
-e 's@/bin/uname@${coreutils}&@g' \
|
|
-e 's@/usr/bin/file@${file}/bin/file@g' \
|
|
-i '{}' ';'
|
|
'';
|
|
|
|
hardeningDisable = lib.optional stdenv.isi686 "stackprotector";
|
|
|
|
doCheck = true; # very basic checks, does not test any libraries
|
|
|
|
installPhase = ''
|
|
make install
|
|
'' + lib.optionalString enableDocs ''
|
|
# Sage uses singular.info, which is not installed by default
|
|
mkdir -p $out/share/info
|
|
cp doc/singular.info $out/share/info
|
|
'' + ''
|
|
# Make sure patchelf picks up the right libraries
|
|
rm -rf libpolys factory resources omalloc Singular
|
|
'';
|
|
|
|
# singular tests are a bit complicated, see
|
|
# https://github.com/Singular/Singular/tree/spielwiese/Tst
|
|
# https://www.singular.uni-kl.de/forum/viewtopic.php?f=10&t=2773
|
|
testsToRun = [
|
|
"Old/universal.lst"
|
|
"Buch/buch.lst"
|
|
"Plural/short.lst"
|
|
"Old/factor.tst"
|
|
] ++ lib.optionals enableGfanlib [
|
|
# tests that require gfanlib
|
|
"Short/ok_s.lst"
|
|
];
|
|
|
|
# simple test to make sure singular starts and finds its libraries
|
|
doInstallCheck = true;
|
|
installCheckPhase = ''
|
|
# Very basic sanity check to make sure singular starts and finds its libraries.
|
|
# This is redundant with the below tests. It is only kept because the singular test
|
|
# runner is a bit complicated. In case we decide to give up those tests in the future,
|
|
# this will still be useful. It takes barely any time.
|
|
"$out/bin/Singular" -c 'LIB "freegb.lib"; exit;'
|
|
if [ $? -ne 0 ]; then
|
|
echo >&2 "Error loading the freegb library in Singular."
|
|
exit 1
|
|
fi
|
|
|
|
# Run the test suite
|
|
cd Tst
|
|
perl ./regress.cmd \
|
|
-s "$out/bin/Singular" \
|
|
${lib.concatStringsSep " " (map lib.escapeShellArg testsToRun)} \
|
|
2>"$TMPDIR/out-err.log"
|
|
|
|
# unfortunately regress.cmd always returns exit code 0, so check stderr
|
|
# https://www.singular.uni-kl.de/forum/viewtopic.php?f=10&t=2773
|
|
if [[ -s "$TMPDIR/out-err.log" ]]; then
|
|
cat "$TMPDIR/out-err.log"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Exit status $?"
|
|
'';
|
|
|
|
enableParallelBuilding = true;
|
|
|
|
meta = with lib; {
|
|
description = "A CAS for polynomial computations";
|
|
maintainers = teams.sage.members;
|
|
# 32 bit x86 fails with some link error: `undefined reference to `__divmoddi4@GCC_7.0.0'`
|
|
# https://www.singular.uni-kl.de:8002/trac/ticket/837
|
|
platforms = subtractLists platforms.i686 platforms.unix;
|
|
license = licenses.gpl3; # Or GPLv2 at your option - but not GPLv4
|
|
homepage = "http://www.singular.uni-kl.de";
|
|
downloadPage = "http://www.mathematik.uni-kl.de/ftp/pub/Math/Singular/SOURCES/";
|
|
mainProgram = "Singular";
|
|
};
|
|
}
|