diff mbox

Can we package NetHack?

Message ID 20160528164157.72c42344@openmailbox.org
State New
Headers show

Commit Message

Kei Yamashita May 28, 2016, 8:41 p.m. UTC
NetHack tries to modify its state files in the store and none of its
easily patchable directory variables allow anything different. NetHack
also doesn't allow a ~/.nethack directory to be created in the user's
directory upon running. Does anyone have any ideas or other packages
that do this sort of thing?

Guix package definition:
http://paste.lisp.org/display/317004

The patch that the package definition searches for is attached.

Comments

Ludovic Courtès May 29, 2016, 10:13 p.m. UTC | #1
Kei Kebreau <kei@openmailbox.org> skribis:

> NetHack tries to modify its state files in the store and none of its
> easily patchable directory variables allow anything different. NetHack
> also doesn't allow a ~/.nethack directory to be created in the user's
> directory upon running. Does anyone have any ideas or other packages
> that do this sort of thing?

I suppose the state files are essentially score files?  Don’t other
games store things in /var/lib/something?  What do other distros do?
:-)

Ludo’.
Kei Yamashita May 29, 2016, 10:54 p.m. UTC | #2
On Mon, 30 May 2016 00:13:00 +0200
ludo@gnu.org (Ludovic Courtès) wrote:

> Kei Kebreau <kei@openmailbox.org> skribis:
> 
> > NetHack tries to modify its state files in the store and none of its
> > easily patchable directory variables allow anything different.
> > NetHack also doesn't allow a ~/.nethack directory to be created in
> > the user's directory upon running. Does anyone have any ideas or
> > other packages that do this sort of thing?  
> 
> I suppose the state files are essentially score files?  Don’t other
> games store things in /var/lib/something?  What do other distros do?
> :-)
> 
> Ludo’.

Yes, the state files are high score lists, locks for the world files
and such. The problem is that other distros give NetHack a directory to
write those files to that would be equivalent to writing to our store.
The only one I have seen that avoids this is NixOS. However, NixOS
creates a ".nethack" directory within the user's folder (among other
things) to work around this.

I thought that this would be a problem for Guix, because installing and
removing NetHack cleanly would necessitate directly writing to and
erasing files within the user's directory. So I decided to mail the
list to see if anyone could find a solution. :-)
David Thompson May 30, 2016, 12:37 a.m. UTC | #3
On Sun, May 29, 2016 at 6:54 PM, Kei Kebreau <kei@openmailbox.org> wrote:
> On Mon, 30 May 2016 00:13:00 +0200
> ludo@gnu.org (Ludovic Courtès) wrote:
>
>> Kei Kebreau <kei@openmailbox.org> skribis:
>>
>> > NetHack tries to modify its state files in the store and none of its
>> > easily patchable directory variables allow anything different.
>> > NetHack also doesn't allow a ~/.nethack directory to be created in
>> > the user's directory upon running. Does anyone have any ideas or
>> > other packages that do this sort of thing?
>>
>> I suppose the state files are essentially score files?  Don’t other
>> games store things in /var/lib/something?  What do other distros do?
>> :-)
>>
>> Ludo’.
>
> Yes, the state files are high score lists, locks for the world files
> and such. The problem is that other distros give NetHack a directory to
> write those files to that would be equivalent to writing to our store.
> The only one I have seen that avoids this is NixOS. However, NixOS
> creates a ".nethack" directory within the user's folder (among other
> things) to work around this.
>
> I thought that this would be a problem for Guix, because installing and
> removing NetHack cleanly would necessitate directly writing to and
> erasing files within the user's directory. So I decided to mail the
> list to see if anyone could find a solution. :-)

This isn't a problem.  Stateful files in home directories or elsewhere
are not managed by Guix.  A .nethack directory sounds like a fine
solution to me.

- Dave
Ludovic Courtès May 30, 2016, 8:43 a.m. UTC | #4
"Thompson, David" <dthompson2@worcester.edu> skribis:

> On Sun, May 29, 2016 at 6:54 PM, Kei Kebreau <kei@openmailbox.org> wrote:
>> On Mon, 30 May 2016 00:13:00 +0200
>> ludo@gnu.org (Ludovic Courtès) wrote:
>>
>>> Kei Kebreau <kei@openmailbox.org> skribis:
>>>
>>> > NetHack tries to modify its state files in the store and none of its
>>> > easily patchable directory variables allow anything different.
>>> > NetHack also doesn't allow a ~/.nethack directory to be created in
>>> > the user's directory upon running. Does anyone have any ideas or
>>> > other packages that do this sort of thing?
>>>
>>> I suppose the state files are essentially score files?  Don’t other
>>> games store things in /var/lib/something?  What do other distros do?
>>> :-)
>>>
>>> Ludo’.
>>
>> Yes, the state files are high score lists, locks for the world files
>> and such. The problem is that other distros give NetHack a directory to
>> write those files to that would be equivalent to writing to our store.
>> The only one I have seen that avoids this is NixOS. However, NixOS
>> creates a ".nethack" directory within the user's folder (among other
>> things) to work around this.
>>
>> I thought that this would be a problem for Guix, because installing and
>> removing NetHack cleanly would necessitate directly writing to and
>> erasing files within the user's directory. So I decided to mail the
>> list to see if anyone could find a solution. :-)
>
> This isn't a problem.  Stateful files in home directories or elsewhere
> are not managed by Guix.  A .nethack directory sounds like a fine
> solution to me.

Yes, I agree.

Note that this problem is not limited to Nixpkgs and Guix.  So perhaps
there’s also inspiration to be taken from Debian et al.

Ludo’.
diff mbox

Patch

diff -u -r 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-27 17:55:06.332509906 -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 */
@@ -207,7 +207,7 @@ 
 /* #define COMPRESS_OPTIONS "-q" */
 #endif
 
-#define FCMASK 0660 /* file creation mask */
+#define FCMASK 0666 /* file creation mask */
 
 /* fcntl(2) is a POSIX-portable call for manipulating file descriptors.
  * Comment out the USE_FCNTL if for some reason you have a strange
Only in nethack-3.6.0/include: unixconf.h~
diff -u -r 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 -u -r 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