love: fix Darwin segfault and RPATH issues by using CMake build

This commit is contained in:
kuba
2025-12-25 23:37:20 -06:00
parent f692658978
commit 578702242a
+40 -18
View File
@@ -17,10 +17,9 @@
libogg,
libtheora,
which,
autoconf,
automake,
libtool,
xorg,
cmake,
}:
stdenv.mkDerivation rec {
@@ -36,8 +35,7 @@ stdenv.mkDerivation rec {
nativeBuildInputs = [
pkg-config
autoconf
automake
cmake
];
buildInputs = [
SDL2
@@ -59,28 +57,52 @@ stdenv.mkDerivation rec {
libGL
];
preConfigure = "$shell ./platform/unix/automagic";
configureFlags = [
(if stdenv.isDarwin then "--with-lua=lua" else "--with-lua=luajit")
# Use CMake instead of autotools on all platforms for uniformity
# On Darwin, autotools doesn't compile macOS-specific module (src/common/macosx.mm),
# leading to stubbed functions and segfaults
cmakeFlags = [
"-DCMAKE_POLICY_VERSION_MINIMUM=3.5" # Required by LÖVE's CMakeLists.txt
"-DCMAKE_SKIP_BUILD_RPATH=ON" # Don't include build directory in RPATH
"-DCMAKE_BUILD_WITH_INSTALL_RPATH=ON" # Use install RPATH even during build
];
env.NIX_CFLAGS_COMPILE = "-DluaL_reg=luaL_Reg"; # needed since luajit-2.1.0-beta3
# Fix Darwin bundle/dylib linking and macOS function calls
preBuild = lib.optionalString stdenv.isDarwin ''
# Fix libtool to use dynamiclib instead of bundle for Darwin
substituteInPlace libtool \
--replace "-bundle" "-dynamiclib" \
--replace "-Wl,-bundle" "-Wl,-dynamiclib"
# CMake doesn't define install target for LÖVE, so install manually
installPhase = ''
runHook preInstall
substituteInPlace src/love.cpp \
--replace "love::macosx::checkDropEvents()" "std::string(\"\")" \
--replace "love::macosx::getLoveInResources()" "std::string(\"\")"
mkdir -p $out/bin $out/lib
cp love $out/bin/
cp libliblove.* $out/lib/
# Install man page (both Linux and Darwin)
mkdir -p $out/share/man/man1
cp $src/platform/unix/love.6 $out/share/man/man1/love.1
gzip -9n $out/share/man/man1/love.1
''
+ lib.optionalString stdenv.isLinux ''
# Install Linux-specific files (desktop, mime, icons)
mkdir -p $out/share/applications
mkdir -p $out/share/mime/packages
mkdir -p $out/share/pixmaps
mkdir -p $out/share/icons/hicolor/scalable/mimetypes
# Generate desktop file from template
substitute $src/platform/unix/love.desktop.in $out/share/applications/love.desktop \
--replace-fail '@bindir@' "$out/bin"
cp $src/platform/unix/love.xml $out/share/mime/packages/
cp $src/platform/unix/love.svg $out/share/pixmaps/
cp $src/platform/unix/application-x-love-game.svg $out/share/icons/hicolor/scalable/mimetypes/
''
+ ''
runHook postInstall
'';
postFixup = lib.optionalString stdenv.isDarwin ''
install_name_tool -change ".libs/liblove-11.5.so" "$out/lib/liblove-11.5.so" "$out/bin/love"
# Fix rpath so love binary can find libliblove.dylib
install_name_tool -change "@rpath/libliblove.dylib" "$out/lib/libliblove.dylib" "$out/bin/love"
'';
meta = {