d78985704c
Programs which generate and compile a lot of code at runtime (such as programming language interpreters like ACL2) are not suited for running on SBCL executables built with the "immobile space" feature, as explained by Douglas Katzman in this mail thread: https://sourceforge.net/p/sbcl/mailman/message/36007057/ In this commit, I add an optional flag to the SBCL package allowing you to disable the "immobile space" features. I also migrated away from specifying enabled/disabled features in a `customize-target-features.lisp` file and towards supplying them as command line arguments to `make.sh`, as has been recommended by the installation instructions since 2012 or so.
115 lines
3.8 KiB
Nix
115 lines
3.8 KiB
Nix
{ stdenv, fetchurl, writeText, sbclBootstrap
|
|
, sbclBootstrapHost ? "${sbclBootstrap}/bin/sbcl --disable-debugger --no-userinit --no-sysinit"
|
|
, threadSupport ? (stdenv.isi686 || stdenv.isx86_64 || "aarch64-linux" == stdenv.hostPlatform.system)
|
|
, disableImmobileSpace ? false
|
|
# Meant for sbcl used for creating binaries portable to non-NixOS via save-lisp-and-die.
|
|
# Note that the created binaries still need `patchelf --set-interpreter ...`
|
|
# to get rid of ${glibc} dependency.
|
|
, purgeNixReferences ? false
|
|
, texinfo
|
|
}:
|
|
|
|
stdenv.mkDerivation rec {
|
|
pname = "sbcl";
|
|
version = "2.0.0";
|
|
|
|
src = fetchurl {
|
|
url = "mirror://sourceforge/project/sbcl/sbcl/${version}/${pname}-${version}-source.tar.bz2";
|
|
sha256 = "1krgd69cirp4ili2pfsh1a0mfvq722jbknlvmf17qhsxh1b94dlh";
|
|
};
|
|
|
|
buildInputs = [texinfo];
|
|
|
|
patchPhase = ''
|
|
echo '"${version}.nixos"' > version.lisp-expr
|
|
|
|
pwd
|
|
|
|
# SBCL checks whether files are up-to-date in many places..
|
|
# Unfortunately, same timestamp is not good enough
|
|
sed -e 's@> x y@>= x y@' -i contrib/sb-aclrepl/repl.lisp
|
|
#sed -e '/(date)/i((= date 2208988801) 2208988800)' -i contrib/asdf/asdf.lisp
|
|
sed -i src/cold/slam.lisp -e \
|
|
'/file-write-date input/a)'
|
|
sed -i src/cold/slam.lisp -e \
|
|
'/file-write-date output/i(or (and (= 2208988801 (file-write-date output)) (= 2208988801 (file-write-date input)))'
|
|
sed -i src/code/target-load.lisp -e \
|
|
'/date defaulted-fasl/a)'
|
|
sed -i src/code/target-load.lisp -e \
|
|
'/date defaulted-source/i(or (and (= 2208988801 (file-write-date defaulted-source-truename)) (= 2208988801 (file-write-date defaulted-fasl-truename)))'
|
|
|
|
# Fix the tests
|
|
sed -e '5,$d' -i contrib/sb-bsd-sockets/tests.lisp
|
|
sed -e '5,$d' -i contrib/sb-simple-streams/*test*.lisp
|
|
|
|
# Use whatever `cc` the stdenv provides
|
|
substituteInPlace src/runtime/Config.x86-64-darwin --replace gcc cc
|
|
|
|
substituteInPlace src/runtime/Config.x86-64-darwin \
|
|
--replace mmacosx-version-min=10.4 mmacosx-version-min=10.5
|
|
''
|
|
+ (if purgeNixReferences
|
|
then
|
|
# This is the default location to look for the core; by default in $out/lib/sbcl
|
|
''
|
|
sed 's@^\(#define SBCL_HOME\) .*$@\1 "/no-such-path"@' \
|
|
-i src/runtime/runtime.c
|
|
''
|
|
else
|
|
# Fix software version retrieval
|
|
''
|
|
sed -e "s@/bin/uname@$(command -v uname)@g" -i src/code/*-os.lisp \
|
|
src/code/run-program.lisp
|
|
''
|
|
);
|
|
|
|
|
|
preBuild = ''
|
|
export INSTALL_ROOT=$out
|
|
mkdir -p test-home
|
|
export HOME=$PWD/test-home
|
|
'';
|
|
|
|
enableFeatures = with stdenv.lib;
|
|
optional threadSupport "sb-thread" ++
|
|
optional stdenv.isAarch32 "arm";
|
|
|
|
disableFeatures = with stdenv.lib;
|
|
optional (!threadSupport) "sb-thread" ++
|
|
optionals disableImmobileSpace [ "immobile-space" "immobile-code" "compact-instance-header" ];
|
|
|
|
buildPhase = ''
|
|
sh make.sh --prefix=$out --xc-host="${sbclBootstrapHost}" ${
|
|
stdenv.lib.concatStringsSep " "
|
|
(builtins.map (x: "--with-${x}") enableFeatures ++
|
|
builtins.map (x: "--without-${x}") disableFeatures)
|
|
}
|
|
(cd doc/manual ; make info)
|
|
'';
|
|
|
|
installPhase = ''
|
|
INSTALL_ROOT=$out sh install.sh
|
|
''
|
|
+ stdenv.lib.optionalString (!purgeNixReferences) ''
|
|
cp -r src $out/lib/sbcl
|
|
cp -r contrib $out/lib/sbcl
|
|
cat >$out/lib/sbcl/sbclrc <<EOF
|
|
(setf (logical-pathname-translations "SYS")
|
|
'(("SYS:SRC;**;*.*.*" #P"$out/lib/sbcl/src/**/*.*")
|
|
("SYS:CONTRIB;**;*.*.*" #P"$out/lib/sbcl/contrib/**/*.*")))
|
|
EOF
|
|
'';
|
|
|
|
setupHook = stdenv.lib.optional purgeNixReferences (writeText "setupHook.sh" ''
|
|
addEnvHooks "$targetOffset" _setSbclHome
|
|
_setSbclHome() {
|
|
export SBCL_HOME='@out@/lib/sbcl/'
|
|
}
|
|
'');
|
|
|
|
meta = sbclBootstrap.meta // {
|
|
inherit version;
|
|
updateWalker = true;
|
|
};
|
|
}
|