Subject: [bug#32162] [PATCH] gnu: Add nethack

From: Anonymous <[email-masked]>
Date: Sat, 14 Jul 2018 22:42:05 -0700

I've created a package for nethack by basically copying the package from 
NixOS.

This is my first time writing a guix package, so feel free to make 
corrections.
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 4af0b52e8..30175cf0b 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -87,6 +87,7 @@
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages imagemagick)
+  #:use-module (gnu packages less)
   #:use-module (gnu packages libcanberra)
   #:use-module (gnu packages libedit)
   #:use-module (gnu packages libunwind)
@@ -665,6 +666,125 @@ removed lines to all opponents.  There is also a Demo mode in which you can
 watch your CPU playing while enjoying a cup of tea!")
     (license license:gpl2+)))
 
+(define-public nethack
+  (package
+    (name "nethack")
+    (version "3.6.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append
+               "https://www.nethack.org/download/"
+               version "/" name "-361-src.tgz"))
+        (sha256
+          (base32 "1dha0ijvxhx7c9hr0452h93x81iiqsll8bc9msdnp7xdqcfbz32b"))))
+    (inputs
+      `(("ncurses" ,ncurses)
+        ("bison" ,bison)
+        ("flex" ,flex)
+        ("less" ,less)))
+    (build-system gnu-build-system)
+    (arguments
+      '(#:make-flags
+        `(,(string-append "PREFIX=" (assoc-ref %outputs "out")))
+        #:phases
+        (modify-phases %standard-phases
+          (add-before 'configure 'patch-paths
+            (lambda _
+              (substitute* "sys/unix/nethack.sh"
+                (("^ *cd .*$") ""))
+              (substitute* "sys/unix/Makefile.utl"
+                (("^YACC *=.*$") "YACC = bison -y\n")
+                (("^LEX *=.*$") "LEX = flex\n")
+                (("^# CC = gcc") "CC = gcc"))
+              (substitute* "sys/unix/hints/linux"
+                (("/bin/gzip") (string-append
+                                 (assoc-ref %build-inputs "gzip")
+                                 "/bin/gzip"))
+                (("^WINTTYLIB=.*") "WINTTYLIB=-lncurses"))
+              (substitute* "include/config.h"
+                (("^.*define CHDIR.*$") ""))
+              (substitute* "sys/unix/Makefile.src"
+                 (("^# CC = gcc") "CC = gcc"))
+              #t))
+          (replace 'configure
+            (lambda _
+              (let ((bash (string-append
+                            (assoc-ref %build-inputs "bash")
+                            "/bin/bash")))
+                (chdir "sys/unix")
+                (substitute* "setup.sh" (("/bin/sh") bash))
+                (invoke bash "setup.sh" "hints/linux")
+                (chdir "../..")
+                #t)))
+          (add-after 'install 'fixup-paths
+            (lambda _
+              (let* ((output (assoc-ref %outputs "out"))
+                     (nethack-script (string-append output "/bin/nethack")))
+                (mkdir-p (string-append output "/games/lib/nethackuserdir"))
+                (map
+                  (lambda (i)
+                    (invoke "mv"
+                      (string-append output "/games/lib/nethackdir/" i)
+                      (string-append output "/games/lib/nethackuserdir")))
+                  '("xlogfile" "logfile" "perm" "record" "save"))
+                (mkdir-p (string-append output "/bin"))
+                (let ((outfile (open-file nethack-script "w"))
+                      (user-dir "~/.config/nethack"))
+                  (map
+                    (lambda (line)
+                      (display (string-append line "\n") outfile))
+                    `(,(string-append "#!" (assoc-ref %build-inputs "bash")
+                                      "/bin/bash")
+                      ,(string-append
+                          "PATH="
+                          (list->search-path-as-string
+                            (list (string-append
+                                    (assoc-ref %build-inputs "coreutils")
+                                    "/bin")
+                                  (string-append
+                                    (assoc-ref %build-inputs "less")
+                                    "/bin"))
+                            ":"))
+                      ,(string-append "if [ ! -d " user-dir " ]; then")
+                      ,(string-append "  mkdir -p " user-dir)
+                      ,(string-append "  cp -r " output
+                                      "/games/lib/nethackuserdir/* " user-dir)
+                      ,(string-append "  chmod -R +w " user-dir)
+                      "fi"
+                      "RUNDIR=$(mktemp -d)"
+                      "cleanup() {"
+                      "  rm -rf $RUNDIR"
+                      "}"
+                      "trap cleanup EXIT"
+                      "cd $RUNDIR"
+                      ,(string-append "for i in " user-dir "/*; do")
+                      "  ln -s $i $(basename $i)"
+                      "done"
+                      ,(string-append "for i in " output
+                                      "/games/lib/nethackdir/*; do")
+                      "  ln -s $i $(basename $i)"
+                      "done"
+                      ,(string-append output "/games/nethack"))))
+                (chmod nethack-script #o555)
+                #t)))
+          (delete 'check))))
+    (home-page "https://nethack.org")
+    (synopsis "Classic dungeon crawl game")
+    (description "NetHack is a single player dungeon exploration game that runs
+on a wide variety of computer systems, with a variety of graphical and text
+interfaces all using the same game engine.  Unlike many other Dungeons &
+Dragons-inspired games, the emphasis in NetHack is on discovering the detail of
+the dungeon and not simply killing everything in sight - in fact, killing
+everything in sight is a good way to die quickly.  Each game presents a
+different landscape - the random number generator provides an essentially
+unlimited number of variations of the dungeon and its denizens to be discovered
+by the player in one of a number of characters: you can pick your race, your
+role, and your gender.")
+    (license
+      (license:fsdg-compatible
+        "https://nethack.org/common/license.html"))))
+
 (define-public prboom-plus
   (package
    (name "prboom-plus")