163 lines
4.2 KiB
Nix
163 lines
4.2 KiB
Nix
# there are the following linking sets:
|
|
# - boot (not installed): without modules, only used when building clisp
|
|
# - base (default): contains readline and i18n, regexp and syscalls modules
|
|
# by default
|
|
# - full: contains base plus modules in withModules
|
|
{
|
|
lib,
|
|
stdenv,
|
|
fetchFromGitLab,
|
|
autoconf269,
|
|
automake,
|
|
libtool,
|
|
libsigsegv,
|
|
gettext,
|
|
ncurses,
|
|
pcre,
|
|
zlib,
|
|
readline,
|
|
libffi,
|
|
libffcall,
|
|
libX11,
|
|
libXau,
|
|
libXt,
|
|
libXpm,
|
|
libXext,
|
|
xorgproto,
|
|
coreutils,
|
|
# build options
|
|
threadSupport ? (stdenv.hostPlatform.isx86 && !stdenv.hostPlatform.isDarwin),
|
|
x11Support ? (stdenv.hostPlatform.isx86 && !stdenv.hostPlatform.isDarwin),
|
|
dllSupport ? true,
|
|
withModules ?
|
|
[
|
|
"asdf"
|
|
"pcre"
|
|
"rawsock"
|
|
]
|
|
++ lib.optionals stdenv.hostPlatform.isLinux [
|
|
"bindings/glibc"
|
|
"zlib"
|
|
]
|
|
++ lib.optional x11Support "clx/new-clx",
|
|
}:
|
|
|
|
assert
|
|
x11Support
|
|
-> (
|
|
libX11 != null
|
|
&& libXau != null
|
|
&& libXt != null
|
|
&& libXpm != null
|
|
&& xorgproto != null
|
|
&& libXext != null
|
|
);
|
|
|
|
let
|
|
ffcallAvailable = stdenv.hostPlatform.isLinux && (libffcall != null);
|
|
# Some modules need autoreconf called in their directory.
|
|
shouldReconfModule = name: name != "asdf";
|
|
in
|
|
|
|
stdenv.mkDerivation {
|
|
version = "2.50pre20230112";
|
|
pname = "clisp";
|
|
|
|
src = fetchFromGitLab {
|
|
owner = "gnu-clisp";
|
|
repo = "clisp";
|
|
rev = "bf72805c4dace982a6d3399ff4e7f7d5e77ab99a";
|
|
hash = "sha256-sQoN2FUg9BPaCgvCF91lFsU/zLja1NrgWsEIr2cPiqo=";
|
|
};
|
|
|
|
strictDeps = true;
|
|
nativeBuildInputs = [
|
|
autoconf269
|
|
automake
|
|
libtool
|
|
];
|
|
buildInputs =
|
|
[ libsigsegv ]
|
|
++ lib.optional (gettext != null) gettext
|
|
++ lib.optional (ncurses != null) ncurses
|
|
++ lib.optional (pcre != null) pcre
|
|
++ lib.optional (zlib != null) zlib
|
|
++ lib.optional (readline != null) readline
|
|
++ lib.optional (ffcallAvailable && (libffi != null)) libffi
|
|
++ lib.optional ffcallAvailable libffcall
|
|
++ lib.optionals x11Support [
|
|
libX11
|
|
libXau
|
|
libXt
|
|
libXpm
|
|
xorgproto
|
|
libXext
|
|
];
|
|
|
|
patches = [
|
|
./gnulib_aarch64.patch
|
|
];
|
|
|
|
# First, replace port 9090 (rather low, can be used)
|
|
# with 64237 (much higher, IANA private area, not
|
|
# anything rememberable).
|
|
postPatch = ''
|
|
sed -e 's@9090@64237@g' -i tests/socket.tst
|
|
sed -i 's@/bin/pwd@${coreutils}&@' src/clisp-link.in
|
|
sed -i 's@1\.16\.2@${automake.version}@' src/aclocal.m4
|
|
find . -type f | xargs sed -e 's/-lICE/-lXau &/' -i
|
|
'';
|
|
|
|
preConfigure = lib.optionalString stdenv.hostPlatform.isDarwin (
|
|
''
|
|
(
|
|
cd src
|
|
autoreconf -f -i -I m4 -I glm4
|
|
)
|
|
''
|
|
+ lib.concatMapStrings (x: ''
|
|
(
|
|
root="$PWD"
|
|
cd modules/${x}
|
|
autoreconf -f -i -I "$root/src" -I "$root/src/m4" -I "$root/src/glm4"
|
|
)
|
|
'') (builtins.filter shouldReconfModule withModules)
|
|
);
|
|
|
|
configureFlags =
|
|
[ "builddir" ]
|
|
++ lib.optional (!dllSupport) "--without-dynamic-modules"
|
|
++ lib.optional (readline != null) "--with-readline"
|
|
# --with-dynamic-ffi can only exist with --with-ffcall - foreign.d does not compile otherwise
|
|
++ lib.optional (ffcallAvailable && (libffi != null)) "--with-dynamic-ffi"
|
|
++ lib.optional ffcallAvailable "--with-ffcall"
|
|
++ lib.optional (!ffcallAvailable) "--without-ffcall"
|
|
++ builtins.map (x: " --with-module=" + x) withModules
|
|
++ lib.optional threadSupport "--with-threads=POSIX_THREADS";
|
|
|
|
preBuild = ''
|
|
sed -e '/avcall.h/a\#include "config.h"' -i src/foreign.d
|
|
sed -i -re '/ cfree /d' -i modules/bindings/glibc/linux.lisp
|
|
cd builddir
|
|
'';
|
|
|
|
doCheck = true;
|
|
|
|
postInstall = lib.optionalString (withModules != [ ]) (
|
|
''./clisp-link add "$out"/lib/clisp*/base "$(dirname "$out"/lib/clisp*/base)"/full''
|
|
+ lib.concatMapStrings (x: " " + x) withModules
|
|
);
|
|
|
|
env.NIX_CFLAGS_COMPILE = "-O0 -falign-functions=${
|
|
if stdenv.hostPlatform.is64bit then "8" else "4"
|
|
}";
|
|
|
|
meta = {
|
|
description = "ANSI Common Lisp Implementation";
|
|
homepage = "http://clisp.org";
|
|
mainProgram = "clisp";
|
|
maintainers = lib.teams.lisp.members;
|
|
license = lib.licenses.gpl2Plus;
|
|
platforms = with lib.platforms; linux ++ darwin;
|
|
};
|
|
}
|