nixpkgs/pkgs/games/nethack/default.nix

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

173 lines
5.7 KiB
Nix
Raw Normal View History

{ stdenv, lib, fetchurl, coreutils, ncurses, gzip, flex, bison
, less
, buildPackages
, x11Mode ? false, qtMode ? false, libXaw, libXext, libXpm, bdftopcf, mkfontdir, pkg-config, qt5
2024-01-26 19:25:13 +00:00
, copyDesktopItems, makeDesktopItem
}:
2015-06-29 11:19:12 +00:00
let
platform =
2018-03-09 23:40:51 +00:00
if stdenv.hostPlatform.isUnix then "unix"
else throw "Unknown platform for NetHack: ${stdenv.hostPlatform.system}";
unixHint =
if x11Mode then "linux-x11"
2018-07-15 06:18:55 +00:00
else if qtMode then "linux-qt4"
else if stdenv.hostPlatform.isLinux then "linux"
2018-03-09 23:40:51 +00:00
else if stdenv.hostPlatform.isDarwin then "macosx10.10"
# We probably want something different for Darwin
else "unix";
2015-12-08 15:10:53 +00:00
userDir = "~/.config/nethack";
2017-04-06 13:27:36 +00:00
binPath = lib.makeBinPath [ coreutils less ];
2018-07-15 06:18:55 +00:00
in stdenv.mkDerivation rec {
version = "3.6.7";
2022-01-11 12:50:16 +00:00
pname = if x11Mode then "nethack-x11"
else if qtMode then "nethack-qt"
else "nethack";
2015-06-29 11:19:12 +00:00
src = fetchurl {
2020-03-21 21:06:24 +00:00
url = "https://nethack.org/download/${version}/nethack-${lib.replaceStrings ["."] [""] version}-src.tgz";
sha256 = "sha256-mM9n323r+WaKYXRaqEwJvKs2Ll0z9blE7FFV1E0qrLI=";
};
2018-07-15 06:18:55 +00:00
buildInputs = [ ncurses ]
++ lib.optionals x11Mode [ libXaw libXext libXpm ]
2018-07-15 06:18:55 +00:00
++ lib.optionals qtMode [ gzip qt5.qtbase.bin qt5.qtmultimedia.bin ];
2015-06-29 11:19:12 +00:00
2024-01-26 19:25:13 +00:00
nativeBuildInputs = [ flex bison copyDesktopItems ]
2018-09-20 18:01:36 +00:00
++ lib.optionals x11Mode [ mkfontdir bdftopcf ]
2018-07-15 06:18:55 +00:00
++ lib.optionals qtMode [
pkg-config mkfontdir qt5.qtbase.dev
qt5.qtmultimedia.dev qt5.wrapQtAppsHook
2018-09-20 18:01:36 +00:00
bdftopcf
2018-07-15 06:18:55 +00:00
];
makeFlags = [ "PREFIX=$(out)" ];
postPatch = ''
2016-02-29 03:04:23 +00:00
sed -e '/^ *cd /d' -i sys/unix/nethack.sh
sed \
-e 's/^YACC *=.*/YACC = bison -y/' \
-e 's/^LEX *=.*/LEX = flex/' \
-i sys/unix/Makefile.utl
2018-07-15 06:18:55 +00:00
sed \
-e 's,^WINQT4LIB =.*,WINQT4LIB = `pkg-config Qt5Gui --libs` \\\
`pkg-config Qt5Widgets --libs` \\\
`pkg-config Qt5Multimedia --libs`,' \
-i sys/unix/Makefile.src
2016-02-29 03:04:23 +00:00
sed \
-e 's,^CFLAGS=-g,CFLAGS=,' \
2016-02-29 03:04:23 +00:00
-e 's,/bin/gzip,${gzip}/bin/gzip,g' \
-e 's,^WINTTYLIB=.*,WINTTYLIB=-lncurses,' \
-i sys/unix/hints/linux
sed \
2024-02-20 13:36:19 +00:00
-e 's,^#WANT_WIN_CURSES=1$,WANT_WIN_CURSES=1,' \
-e 's,^CC=.*$,CC=${stdenv.cc.targetPrefix}cc,' \
2016-02-29 03:04:23 +00:00
-e 's,^HACKDIR=.*$,HACKDIR=\$(PREFIX)/games/lib/\$(GAME)dir,' \
-e 's,^SHELLDIR=.*$,SHELLDIR=\$(PREFIX)/games,' \
-e 's,^CFLAGS=-g,CFLAGS=,' \
2016-02-29 03:04:23 +00:00
-i sys/unix/hints/macosx10.10
sed -e '/define CHDIR/d' -i include/config.h
${lib.optionalString qtMode ''
2018-07-15 06:18:55 +00:00
sed \
-e 's,^QTDIR *=.*,QTDIR=${qt5.qtbase.dev},' \
-e 's,CFLAGS.*QtGui.*,CFLAGS += `pkg-config Qt5Gui --cflags`,' \
-e 's,CFLAGS+=-DCOMPRESS.*,CFLAGS+=-DCOMPRESS=\\"${gzip}/bin/gzip\\" \\\
-DCOMPRESS_EXTENSION=\\".gz\\",' \
-e 's,moc-qt4,moc,' \
2018-07-15 06:18:55 +00:00
-i sys/unix/hints/linux-qt4
''}
${lib.optionalString (stdenv.buildPlatform != stdenv.hostPlatform)
# If we're cross-compiling, replace the paths to the data generation tools
# with the ones from the build platform's nethack package, since we can't
# run the ones we've built here.
''
${buildPackages.perl}/bin/perl -p \
-e 's,[a-z./]+/(makedefs|dgn_comp|lev_comp|dlb)(?!\.),${buildPackages.nethack}/libexec/nethack/\1,g' \
-i sys/unix/Makefile.*
''}
sed -i -e '/rm -f $(MAKEDEFS)/d' sys/unix/Makefile.src
2023-03-21 03:00:04 +00:00
# Fix building on darwin where otherwise __has_attribute fails with an empty parameter
sed -e 's/define __warn_unused_result__ .*/define __warn_unused_result__ __unused__/' -i include/tradstdc.h
sed -e 's/define warn_unused_result .*/define warn_unused_result __unused__/' -i include/tradstdc.h
2016-02-29 03:04:23 +00:00
'';
configurePhase = ''
pushd sys/${platform}
${lib.optionalString (platform == "unix") ''
sh setup.sh hints/${unixHint}
''}
popd
2015-06-29 11:19:12 +00:00
'';
2024-03-18 04:57:31 +00:00
# https://github.com/NixOS/nixpkgs/issues/294751
enableParallelBuilding = false;
2021-01-15 04:31:39 +00:00
preFixup = lib.optionalString qtMode ''
wrapQtApp "$out/games/nethack"
'';
2015-06-29 11:19:12 +00:00
postInstall = ''
mkdir -p $out/games/lib/nethackuserdir
for i in xlogfile logfile perm record save; do
mv $out/games/lib/nethackdir/$i $out/games/lib/nethackuserdir
2015-06-29 11:19:12 +00:00
done
mkdir -p $out/bin
2015-06-29 11:19:12 +00:00
cat <<EOF >$out/bin/nethack
2015-12-08 15:10:53 +00:00
#! ${stdenv.shell} -e
2017-04-06 13:27:36 +00:00
PATH=${binPath}:\$PATH
2015-06-29 11:19:12 +00:00
2015-12-08 15:10:53 +00:00
if [ ! -d ${userDir} ]; then
mkdir -p ${userDir}
cp -r $out/games/lib/nethackuserdir/* ${userDir}
chmod -R +w ${userDir}
fi
2015-06-29 11:19:12 +00:00
2016-02-29 03:04:23 +00:00
RUNDIR=\$(mktemp -d)
2015-06-29 11:19:12 +00:00
2015-12-08 15:10:53 +00:00
cleanup() {
rm -rf \$RUNDIR
}
trap cleanup EXIT
cd \$RUNDIR
for i in ${userDir}/*; do
ln -s \$i \$(basename \$i)
done
for i in $out/games/lib/nethackdir/*; do
ln -s \$i \$(basename \$i)
done
$out/games/nethack
2015-06-29 11:19:12 +00:00
EOF
chmod +x $out/bin/nethack
${lib.optionalString x11Mode "mv $out/bin/nethack $out/bin/nethack-x11"}
2018-07-15 06:18:55 +00:00
${lib.optionalString qtMode "mv $out/bin/nethack $out/bin/nethack-qt"}
install -Dm 555 util/{makedefs,dgn_comp,lev_comp} -t $out/libexec/nethack/
${lib.optionalString (!(x11Mode || qtMode)) "install -Dm 555 util/dlb -t $out/libexec/nethack/"}
2015-06-29 11:19:12 +00:00
'';
2024-01-26 19:25:13 +00:00
desktopItems = [
(makeDesktopItem {
name = "NetHack";
exec =
if x11Mode then "nethack-x11"
else if qtMode then "nethack-qt"
else "nethack";
icon = "nethack";
desktopName = "NetHack";
comment = "NetHack is a single player dungeon exploration game";
categories = [ "Game" "ActionGame" ];
})
];
meta = with lib; {
2015-06-29 11:19:12 +00:00
description = "Rogue-like game";
homepage = "http://nethack.org/";
2015-06-29 11:19:12 +00:00
license = "nethack";
platforms = if x11Mode then platforms.linux else platforms.unix;
2015-06-29 11:19:12 +00:00
maintainers = with maintainers; [ abbradar ];
2024-01-26 19:25:13 +00:00
mainProgram = "nethack";
};
}