diff mbox

gnu: Add nethack.

Message ID 20160531175630.0bfd76ff@openmailbox.org
State New
Headers show

Commit Message

Kei Yamashita May 31, 2016, 9:56 p.m. UTC
NetHack finally works, though I'd like others to review the
implementation. This is also my first time adding a .patch file to the
repository, so advice along those lines would be appreciated.

Comments

Ludovic Courtès June 4, 2016, 9:15 p.m. UTC | #1
Hi!

Kei Kebreau <kei@openmailbox.org> skribis:

> From b728e078408f17136e8a4c3344b606e8f152b9e4 Mon Sep 17 00:00:00 2001
> From: Kei Kebreau <kei@openmailbox.org>
> Date: Tue, 31 May 2016 17:42:28 -0400
> Subject: [PATCH] gnu: Add nethack.
>
> * gnu/packages/games.scm (nethack): New variable.

You need to mention the new .patch file here (see ‘git log’ for
examples.)

You also need to add the .patch file to gnu/local.mk, and to mention the
change to gnu/local.mk in the commit log.

[...]

> +         (replace 'configure
> +           (lambda* (#:key inputs outputs #:allow-other-keys)
> +             (let ((out (assoc-ref outputs "out")))
> +               (substitute* "sys/unix/hints/linux"
> +                 (("^PREFIX=.*$")
> +                  (string-append "PREFIX=" out "\n"))
> +                 (("/bin/gzip") (which "gzip")))
> +               (substitute* "sys/unix/setup.sh"
> +                 (("/bin/sh") (which "bash"))))
> +             (system* "sh" "sys/unix/setup.sh" "sys/unix/hints/linux")))

Should be: (zero? (system* …)), which returns #t on success (a phase
must return a true value to be considered successful.)

> +         (add-after 'install 'move-state-files
> +           (lambda* (#:key inputs outputs #:allow-other-keys)
> +             (let* ((out (assoc-ref outputs "out")))
> +               (mkdir (string-append out "/games/lib/nethack-state-files"))
> +               (chdir (string-append out "/games/lib/nethackdir"))
> +               (for-each (lambda (file)
> +                           (system* "mv" file
> +                                    (string-append
> +                                     out "/games/lib/nethack-state-files")))

Instead of using the ‘mv’ command (or any other Coreutils command, for
that matter), use the Scheme equivalent.  Here it would be:

  (install-file file directory)

Besides, “/games” is unusual in the file system hierarchy.  Usually,
state files go to the localstatedir, i.e., the var/PACKAGE subdirectory.

Thus, what about putting state files in OUT/var/nethack?

But again, OUT is immutable, so these files cannot be modified, so
they’re not really “state.”

> +                         '("logfile" "perm" "record" "save" "xlogfile")))))

For clarity, have the phase return #t.

> +         (add-after 'move-state-files 'wrap-program
> +           (lambda* (#:key inputs outputs #:allow-other-keys)
> +             (let* ((out (assoc-ref outputs "out"))
> +                    (bin (string-append out "/bin"))
> +                    (nethack-user-dir "~/.nethack"))
> +               (mkdir bin)
> +               (with-directory-excursion bin
> +                 (call-with-output-file "nethack"
> +                   (lambda (port)
> +                     (format port "#!~a/bin/sh -e
> +# Create NetHack directory in user's $HOME if it isn't there
> +if [ ! -d ~a ]; then
> +  mkdir -p ~a
> +  cp -r ~a/* ~a
> +  chmod -R +w ~a
> +fi
> +
> +RUNDIR=$(mktemp -d)
> +
> +cleanup() {
> +  rm -rf $RUNDIR
> +}
> +trap cleanup EXIT
> +
> +cd $RUNDIR
> +for i in ~a/*; do
> +  ln -s $i $(basename $i)
> +done
> +for i in ~a/*; do
> +  ln -s $i $(basename $i)
> +done
> +./nethack~%"

Do we really need this wrapper?  Can’t we instead take it as a patch
from Debian or something?  I’m not a fan of inline Bash code, and not
very confident of scripts that do ‘rm -rf’.  :-)


> +--- nethack-3.6.0.orig/include/config.h	2016-05-27 17:20:03.062318307 -0400
> ++++ nethack-3.6.0/include/config.h	2016-05-31 16:48:04.283642766 -0400

Patches must always start with a line or two indicating what they do and
what their upstream status or origin is.

> +@@ -308,7 +308,6 @@
> + #define INSURANCE /* allow crashed game recovery */
> + 
> + #ifndef MAC
> +-#define CHDIR /* delete if no chdir() available */
> + #endif

Why?

> +-# CC = gcc
> ++CC = gcc
> + #
> + #	For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following:
> + #
> +@@ -104,11 +104,11 @@
> + 
> + # yacc/lex programs to use to generate *_comp.h, *_lex.c, and *_yacc.c.
> + # if, instead of yacc/lex you have bison/flex, comment/uncomment the following.
> +-YACC     = yacc
> +-LEX      = lex
> +-# YACC     = bison -y
> ++# YACC     = yacc
> ++# LEX      = lex
> ++YACC     = bison -y
> + # YACC     = byacc
> +-# LEX      = flex
> ++LEX      = flex

Would it work to, instead, do:

  #:make-flags '("CC=gcc" "LEX=flex" …)

If it does, I think it’s preferable.

Could you send an updated patch?

Thanks for working on this tricky package!  ;-)

Ludo’.
diff mbox

Patch

diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index fc16862..44afb87 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -49,10 +49,12 @@ 
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages backup)
   #:use-module (gnu packages base)
+  #:use-module (gnu packages bison)
   #:use-module (gnu packages admin)
   #:use-module (gnu packages audio)
   #:use-module (gnu packages avahi)
   #:use-module (gnu packages boost)
+  #:use-module (gnu packages flex)
   #:use-module (gnu packages fribidi)
   #:use-module (gnu packages game-development)
   #:use-module (gnu packages gettext)
@@ -2243,3 +2245,99 @@  Red Eclipse provides fast paced and accessible gameplay.")
                      license:cc-by-sa3.0
                      license:cc-by3.0
                      license:cc0)))))
+
+(define-public nethack
+  (package
+    (name "nethack")
+    (version "3.6.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://sourceforge/" name "/" name "-"
+                                  (string-join (string-split version #\.) "")
+                                  "-src.tgz"))
+              (sha256
+               (base32
+                "12mi5kgqw3q029y57pkg3gnp930p7yvlqi118xxdif2qhj6nkphs"))
+              (patches
+               (search-patches
+                "nethack-correct-directories-and-permissions.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f ; no check target
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'configure
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (substitute* "sys/unix/hints/linux"
+                 (("^PREFIX=.*$")
+                  (string-append "PREFIX=" out "\n"))
+                 (("/bin/gzip") (which "gzip")))
+               (substitute* "sys/unix/setup.sh"
+                 (("/bin/sh") (which "bash"))))
+             (system* "sh" "sys/unix/setup.sh" "sys/unix/hints/linux")))
+         (add-after 'install 'move-state-files
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out")))
+               (mkdir (string-append out "/games/lib/nethack-state-files"))
+               (chdir (string-append out "/games/lib/nethackdir"))
+               (for-each (lambda (file)
+                           (system* "mv" file
+                                    (string-append
+                                     out "/games/lib/nethack-state-files")))
+                         '("logfile" "perm" "record" "save" "xlogfile")))))
+         (add-after 'move-state-files 'wrap-program
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (bin (string-append out "/bin"))
+                    (nethack-user-dir "~/.nethack"))
+               (mkdir bin)
+               (with-directory-excursion bin
+                 (call-with-output-file "nethack"
+                   (lambda (port)
+                     (format port "#!~a/bin/sh -e
+# Create NetHack directory in user's $HOME if it isn't there
+if [ ! -d ~a ]; then
+  mkdir -p ~a
+  cp -r ~a/* ~a
+  chmod -R +w ~a
+fi
+
+RUNDIR=$(mktemp -d)
+
+cleanup() {
+  rm -rf $RUNDIR
+}
+trap cleanup EXIT
+
+cd $RUNDIR
+for i in ~a/*; do
+  ln -s $i $(basename $i)
+done
+for i in ~a/*; do
+  ln -s $i $(basename $i)
+done
+./nethack~%"
+                             (assoc-ref inputs "bash") ;implicit input
+                             (string-append nethack-user-dir)
+                             (string-append nethack-user-dir)
+                             (string-append
+                              out "/games/lib/nethack-state-files")
+                             (string-append nethack-user-dir)
+                             (string-append nethack-user-dir)
+                             (string-append nethack-user-dir)
+                             (string-append out "/games/lib/nethackdir")
+                             (string-append out))))
+                 (chmod "nethack" #o555)))
+             #t)))))
+    (native-inputs
+     `(("bison" ,bison)
+       ("flex" ,flex)))
+    (inputs `(("ncurses" ,ncurses)))
+    (home-page "http://nethack.org")
+    (synopsis "Single player dungeon exploration game")
+    (description
+     "Nethack is a roguelike game that emphasizes discovery of details in the
+dungeon.  The random number generator provides an unlimited number of
+variations of the dungeon.")
+    (license (license:fsf-free "http://nethack.org/common/license.html"))))
diff --git a/gnu/packages/patches/nethack-correct-directories-and-permissions.patch b/gnu/packages/patches/nethack-correct-directories-and-permissions.patch
new file mode 100644
index 0000000..6f6d436
--- /dev/null
+++ b/gnu/packages/patches/nethack-correct-directories-and-permissions.patch
@@ -0,0 +1,72 @@ 
+diff -r -u nethack-3.6.0.orig/include/config.h nethack-3.6.0/include/config.h
+--- nethack-3.6.0.orig/include/config.h	2016-05-27 17:20:03.062318307 -0400
++++ nethack-3.6.0/include/config.h	2016-05-31 16:48:04.283642766 -0400
+@@ -308,7 +308,6 @@
+ #define INSURANCE /* allow crashed game recovery */
+ 
+ #ifndef MAC
+-#define CHDIR /* delete if no chdir() available */
+ #endif
+ 
+ #ifdef CHDIR
+diff -r -u nethack-3.6.0.orig/include/unixconf.h nethack-3.6.0/include/unixconf.h
+--- nethack-3.6.0.orig/include/unixconf.h	2016-05-27 17:20:03.062318307 -0400
++++ nethack-3.6.0/include/unixconf.h	2016-05-30 20:33:52.132273630 -0400
+@@ -36,7 +36,7 @@
+ #define NETWORK        /* if running on a networked system */
+                        /* e.g. Suns sharing a playground through NFS */
+ /* #define SUNOS4 */   /* SunOS 4.x */
+-/* #define LINUX */    /* Another Unix clone */
++#define LINUX          /* Another Unix clone */
+ /* #define CYGWIN32 */ /* Unix on Win32 -- use with case sensitive defines */
+ /* #define GENIX */    /* Yet Another Unix Clone */
+ /* #define HISX */     /* Bull Unix for XPS Machines */
+diff -r -u nethack-3.6.0.orig/sys/unix/Makefile.src nethack-3.6.0/sys/unix/Makefile.src
+--- nethack-3.6.0.orig/sys/unix/Makefile.src	2016-05-27 17:20:03.082318966 -0400
++++ nethack-3.6.0/sys/unix/Makefile.src	2016-05-27 17:42:47.183397931 -0400
+@@ -64,7 +64,7 @@
+ #	if you get setcgtty() warnings during execution, you are feeding gcc
+ #		a non-ANSI <sys/ioctl.h> -- either run fixincludes on it or use
+ #		-traditional in CFLAGS
+-# CC = gcc
++CC = gcc
+ #
+ #	For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following:
+ #
+@@ -238,7 +238,7 @@
+ # WINTTYLIB = -ltermcap
+ # WINTTYLIB = -lcurses
+ # WINTTYLIB = -lcurses16
+-# WINTTYLIB = -lncurses
++WINTTYLIB = -lncurses
+ #WINTTYLIB = -ltermlib
+ #
+ # libraries for X11
+diff -r -u nethack-3.6.0.orig/sys/unix/Makefile.utl nethack-3.6.0/sys/unix/Makefile.utl
+--- nethack-3.6.0.orig/sys/unix/Makefile.utl	2016-05-27 17:20:03.082318966 -0400
++++ nethack-3.6.0/sys/unix/Makefile.utl	2016-05-27 20:01:54.605040799 -0400
+@@ -18,7 +18,7 @@
+ 
+ # if you are using gcc as your compiler,
+ #	uncomment the CC definition below if it's not in your environment
+-# CC = gcc
++CC = gcc
+ #
+ #	For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following:
+ #
+@@ -104,11 +104,11 @@
+ 
+ # yacc/lex programs to use to generate *_comp.h, *_lex.c, and *_yacc.c.
+ # if, instead of yacc/lex you have bison/flex, comment/uncomment the following.
+-YACC     = yacc
+-LEX      = lex
+-# YACC     = bison -y
++# YACC     = yacc
++# LEX      = lex
++YACC     = bison -y
+ # YACC     = byacc
+-# LEX      = flex
++LEX      = flex
+ 
+ # these are the names of the output files from YACC/LEX. Under MS-DOS
+ # and similar systems, they may differ