1# there are the following linking sets:
2# - boot (not installed): without modules, only used when building clisp
3# - base (default): contains readline and i18n, regexp and syscalls modules
4# by default
5# - full: contains base plus modules in withModules
6{
7 lib,
8 stdenv,
9 fetchFromGitLab,
10 autoconf,
11 automake,
12 bash,
13 libtool,
14 libsigsegv,
15 gettext,
16 ncurses,
17 pcre,
18 zlib,
19 readline,
20 libffi,
21 libffcall,
22 libX11,
23 libXau,
24 libXt,
25 libXpm,
26 libXext,
27 xorgproto,
28 coreutils,
29 # build options
30 threadSupport ? (stdenv.hostPlatform.isx86 && !stdenv.hostPlatform.isDarwin),
31 x11Support ? (stdenv.hostPlatform.isx86 && !stdenv.hostPlatform.isDarwin),
32 dllSupport ? true,
33 withModules ? [
34 "asdf"
35 "pcre"
36 "rawsock"
37 ]
38 ++ lib.optionals stdenv.hostPlatform.isLinux [
39 "bindings/glibc"
40 "zlib"
41 ]
42 ++ lib.optional x11Support "clx/new-clx",
43}:
44
45assert
46 x11Support
47 -> (
48 libX11 != null
49 && libXau != null
50 && libXt != null
51 && libXpm != null
52 && xorgproto != null
53 && libXext != null
54 );
55
56let
57 ffcallAvailable = stdenv.hostPlatform.isLinux && (libffcall != null);
58in
59
60stdenv.mkDerivation {
61 version = "2.49.95-unstable-2024-12-28";
62 pname = "clisp";
63
64 src = fetchFromGitLab {
65 owner = "gnu-clisp";
66 repo = "clisp";
67 rev = "c3ec11bab87cfdbeba01523ed88ac2a16b22304d";
68 hash = "sha256-xXGx2FlS0l9huVMHqNbcAViLjxK8szOFPT0J8MpGp9w=";
69 };
70
71 strictDeps = true;
72 nativeBuildInputs = [
73 autoconf
74 automake
75 libtool
76 ];
77 buildInputs = [
78 bash
79 libsigsegv
80 ]
81 ++ lib.optional (gettext != null) gettext
82 ++ lib.optional (ncurses != null) ncurses
83 ++ lib.optional (pcre != null) pcre
84 ++ lib.optional (zlib != null) zlib
85 ++ lib.optional (readline != null) readline
86 ++ lib.optional (ffcallAvailable && (libffi != null)) libffi
87 ++ lib.optional ffcallAvailable libffcall
88 ++ lib.optionals x11Support [
89 libX11
90 libXau
91 libXt
92 libXpm
93 xorgproto
94 libXext
95 ];
96
97 # First, replace port 9090 (rather low, can be used)
98 # with 64237 (much higher, IANA private area, not
99 # anything rememberable).
100 postPatch = ''
101 sed -e 's@9090@64237@g' -i tests/socket.tst
102 sed -i 's@/bin/pwd@${coreutils}&@' src/clisp-link.in
103 sed -i 's@1\.16\.2@${automake.version}@' src/aclocal.m4
104 find . -type f | xargs sed -e 's/-lICE/-lXau &/' -i
105 '';
106
107 configureFlags = [
108 "builddir"
109 ]
110 ++ lib.optional (!dllSupport) "--without-dynamic-modules"
111 ++ lib.optional (readline != null) "--with-readline"
112 # --with-dynamic-ffi can only exist with --with-ffcall - foreign.d does not compile otherwise
113 ++ lib.optional (ffcallAvailable && (libffi != null)) "--with-dynamic-ffi"
114 ++ lib.optional ffcallAvailable "--with-ffcall"
115 ++ lib.optional (!ffcallAvailable) "--without-ffcall"
116 ++ builtins.map (x: " --with-module=" + x) withModules
117 ++ lib.optional threadSupport "--with-threads=POSIX_THREADS";
118
119 preBuild = ''
120 sed -e '/avcall.h/a\#include "config.h"' -i src/foreign.d
121 sed -i -re '/ cfree /d' -i modules/bindings/glibc/linux.lisp
122 cd builddir
123 '';
124
125 # ;; Loading file ../src/defmacro.lisp ...
126 # *** - handle_fault error2 ! address = 0x8 not in [0x1000000c0000,0x1000000c0000) !
127 # SIGSEGV cannot be cured. Fault address = 0x8.
128 hardeningDisable = [ "pie" ];
129
130 doCheck = true;
131
132 postInstall = lib.optionalString (withModules != [ ]) ''
133 bash ./clisp-link add "$out"/lib/clisp*/base "$(dirname "$out"/lib/clisp*/base)"/full \
134 ${lib.concatMapStrings (x: " " + x) withModules}
135
136 find "$out"/lib/clisp*/full -type l -name "*.o" | while read -r symlink; do
137 if [[ "$(readlink "$symlink")" =~ (.*\/builddir\/)(.*) ]]; then
138 ln -sf "../''${BASH_REMATCH[2]}" "$symlink"
139 fi
140 done
141 '';
142
143 env.NIX_CFLAGS_COMPILE = "-O0 -falign-functions=${
144 if stdenv.hostPlatform.is64bit then "8" else "4"
145 }";
146
147 meta = {
148 description = "ANSI Common Lisp Implementation";
149 homepage = "http://clisp.org";
150 mainProgram = "clisp";
151 teams = [ lib.teams.lisp ];
152 license = lib.licenses.gpl2Plus;
153 platforms = with lib.platforms; linux ++ darwin;
154 };
155}