nixpkgs/pkgs/development/compilers/gerbil/build.nix
Michael Holmes e6364478be gerbil: fix soname of libgerbil on darwin
The soname/identification of libgerbil on darwin is not correctly fixed up,
resulting in any binaries linked with libgerbil to attempt to link to
libgerbil in the temporary build dir from the gerbil derivation. This
means that any compiled gerbil program won't work as the propagated soname
will result in the binary being unable to correctly link with libgerbil.

Adding an Darwin-only step to use `install_name_tool` to fix up the soname
of libgerbil fixes this issue. We're using realpath here as the qualified
path to `libgerbil` is `$out/gerbil/$version/lib/libgerbil.so` and this is
an easier way to obtain the qualified path.

Fixes NixOS/nixpkgs#272967.
2023-12-12 10:26:12 -05:00

128 lines
4.1 KiB
Nix

{ pkgs, gccStdenv, lib, coreutils,
openssl, zlib, sqlite,
version, git-version, src,
gambit-support,
gambit-git-version,
gambit-stampYmd,
gambit-stampHms,
gambit-params }:
# We use Gambit, that works 10x better with GCC than Clang. See ../gambit/build.nix
let stdenv = gccStdenv; in
stdenv.mkDerivation rec {
pname = "gerbil";
inherit version;
inherit src;
buildInputs_libraries = [ openssl zlib sqlite ];
# TODO: either fix all of Gerbil's dependencies to provide static libraries,
# or give up and delete all tentative support for static libraries.
#buildInputs_staticLibraries = map makeStaticLibraries buildInputs_libraries;
buildInputs = buildInputs_libraries;
postPatch = ''
patchShebangs . ;
grep -Fl '#!/usr/bin/env' `find . -type f -executable` | while read f ; do
substituteInPlace "$f" --replace '#!/usr/bin/env' '#!${coreutils}/bin/env' ;
done ;
cat > MANIFEST <<EOF
gerbil_stamp_version=v${git-version}
gambit_stamp_version=v${gambit-git-version}
gambit_stamp_ymd=${gambit-stampYmd}
gambit_stamp_hms=${gambit-stampHms}
EOF
for f in src/bootstrap/gerbil/compiler/driver__0.scm \
src/build/build-libgerbil.ss \
src/gerbil/compiler/driver.ss ; do
substituteInPlace "$f" --replace '"gcc"' '"${gccStdenv.cc}/bin/${gccStdenv.cc.targetPrefix}gcc"' ;
done
'';
## TODO: make static compilation work.
## For that, get all the packages below to somehow expose static libraries,
## so we can offer users the option to statically link them into Gambit and/or Gerbil.
## Then add the following to the postPatch script above:
# cat > etc/gerbil_static_libraries.sh <<EOF
# OPENSSL_LIBCRYPTO=${makeStaticLibraries openssl}/lib/libcrypto.a # MISSING!
# OPENSSL_LIBSSL=${makeStaticLibraries openssl}/lib/libssl.a # MISSING!
# ZLIB=${makeStaticLibraries zlib}/lib/libz.a
# SQLITE=${makeStaticLibraries sqlite}/lib/sqlite.a # MISSING!
# EOF
configureFlags = [
"--prefix=$out/gerbil"
"--enable-zlib"
"--enable-sqlite"
"--enable-shared"
"--enable-march=" # Avoid non-portable invalid instructions. Use =native if local build only.
];
configurePhase = ''
export CC=${gccStdenv.cc}/bin/${gccStdenv.cc.targetPrefix}gcc \
CXX=${gccStdenv.cc}/bin/${gccStdenv.cc.targetPrefix}g++ \
CPP=${gccStdenv.cc}/bin/${gccStdenv.cc.targetPrefix}cpp \
CXXCPP=${gccStdenv.cc}/bin/${gccStdenv.cc.targetPrefix}cpp \
LD=${gccStdenv.cc}/bin/${gccStdenv.cc.targetPrefix}ld \
XMKMF=${coreutils}/bin/false
unset CFLAGS LDFLAGS LIBS CPPFLAGS CXXFLAGS
./configure ${builtins.concatStringsSep " " configureFlags}
'';
extraLdOptions = [
"-L${zlib}/lib"
"-L${openssl.out}/lib"
"-L${sqlite.out}/lib"
];
buildPhase = ''
runHook preBuild
# gxprof testing uses $HOME/.cache/gerbil/gxc
export HOME=$PWD
export GERBIL_BUILD_CORES=$NIX_BUILD_CORES
export GERBIL_GXC=$PWD/bin/gxc
export GERBIL_BASE=$PWD
export GERBIL_PREFIX=$PWD
export GERBIL_PATH=$PWD/lib
export PATH=$PWD/bin:$PATH
${gambit-support.export-gambopt gambit-params}
# Build, replacing make by build.sh
( cd src && sh build.sh )
f=build/lib/libgerbil.so.ldd ; [ -f $f ] && :
substituteInPlace "$f" --replace '(' \
'(${lib.strings.concatStrings (map (x: "\"${x}\" " ) extraLdOptions)}'
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/gerbil $out/bin
./install.sh
(cd $out/bin ; ln -s ../gerbil/bin/* .)
runHook postInstall
'' + lib.optionalString stdenv.isDarwin ''
libgerbil="$(realpath "$out/gerbil/lib/libgerbil.so")"
install_name_tool -id "$libgerbil" "$libgerbil"
'';
dontStrip = true;
meta = {
description = "Gerbil Scheme";
homepage = "https://github.com/vyzo/gerbil";
license = lib.licenses.lgpl21Only; # dual, also asl20, like Gambit
# NB regarding platforms: regularly tested on Linux and on macOS.
# Please report success and/or failure to fare.
platforms = lib.platforms.unix;
maintainers = with lib.maintainers; [ fare ];
};
outputsToInstall = [ "out" ];
}