sbcl: add option to disable immobile space

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.
This commit is contained in:
Keshav Kini 2020-05-30 02:01:56 -07:00
parent 2a16738d41
commit d78985704c
2 changed files with 28 additions and 24 deletions

View File

@ -1,6 +1,7 @@
{ stdenv, fetchurl, writeText, sbclBootstrap { stdenv, fetchurl, writeText, sbclBootstrap
, sbclBootstrapHost ? "${sbclBootstrap}/bin/sbcl --disable-debugger --no-userinit --no-sysinit" , sbclBootstrapHost ? "${sbclBootstrap}/bin/sbcl --disable-debugger --no-userinit --no-sysinit"
, threadSupport ? (stdenv.isi686 || stdenv.isx86_64 || "aarch64-linux" == stdenv.hostPlatform.system) , 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. # 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 ...` # Note that the created binaries still need `patchelf --set-interpreter ...`
# to get rid of ${glibc} dependency. # to get rid of ${glibc} dependency.
@ -21,17 +22,6 @@ stdenv.mkDerivation rec {
patchPhase = '' patchPhase = ''
echo '"${version}.nixos"' > version.lisp-expr echo '"${version}.nixos"' > version.lisp-expr
echo "
(lambda (features)
(flet ((enable (x)
(pushnew x features))
(disable (x)
(setf features (remove x features))))
''
+ (if threadSupport then "(enable :sb-thread)" else "(disable :sb-thread)")
+ stdenv.lib.optionalString stdenv.isAarch32 "(enable :arm)"
+ ''
)) " > customize-target-features.lisp
pwd pwd
@ -80,8 +70,20 @@ stdenv.mkDerivation rec {
export HOME=$PWD/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 = '' buildPhase = ''
sh make.sh --prefix=$out --xc-host="${sbclBootstrapHost}" 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) (cd doc/manual ; make info)
''; '';

View File

@ -1,6 +1,7 @@
{ stdenv, fetchurl, writeText, sbclBootstrap { stdenv, fetchurl, writeText, sbclBootstrap
, sbclBootstrapHost ? "${sbclBootstrap}/bin/sbcl --disable-debugger --no-userinit --no-sysinit" , sbclBootstrapHost ? "${sbclBootstrap}/bin/sbcl --disable-debugger --no-userinit --no-sysinit"
, threadSupport ? (stdenv.isi686 || stdenv.isx86_64 || "aarch64-linux" == stdenv.hostPlatform.system) , 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. # 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 ...` # Note that the created binaries still need `patchelf --set-interpreter ...`
# to get rid of ${glibc} dependency. # to get rid of ${glibc} dependency.
@ -21,17 +22,6 @@ stdenv.mkDerivation rec {
patchPhase = '' patchPhase = ''
echo '"${version}.nixos"' > version.lisp-expr echo '"${version}.nixos"' > version.lisp-expr
echo "
(lambda (features)
(flet ((enable (x)
(pushnew x features))
(disable (x)
(setf features (remove x features))))
''
+ (if threadSupport then "(enable :sb-thread)" else "(disable :sb-thread)")
+ stdenv.lib.optionalString stdenv.isAarch32 "(enable :arm)"
+ ''
)) " > customize-target-features.lisp
pwd pwd
@ -80,8 +70,20 @@ stdenv.mkDerivation rec {
export HOME=$PWD/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 = '' buildPhase = ''
sh make.sh --prefix=$out --xc-host="${sbclBootstrapHost}" 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) (cd doc/manual ; make info)
''; '';