#      NetHack Top-level Makefile.
# NetHack 3.7  Makefile.top    $NHDT-Date: 1722119081 2024/07/27 22:24:41 $  $NHDT-Branch: keni-fetchlua $:$NHDT-Revision: 1.109 $
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
# NetHack may be freely redistributed.  See license for details.

#	Root of source tree:  (Note: dot is after setup.sh has been used
#	to create the active Makefiles from sys/unix/Makefile.*.
#	It isn't sys/unix/ where you might happen to be reading this.)
NHSROOT=.

#	Newer makes predefine $(MAKE) to 'make' and do smarter processing
#	of recursive make calls if $(MAKE) is used.
#	These makes allow $(MAKE) to be overridden by the environment if
#	someone wants to (or has to) use something other than the standard
#	make, so we do not want to unconditionally set $(MAKE) here.
#
#	Unfortunately, some older makes do not predefine $(MAKE); if you
#	have one of these, uncomment the following line.
#	(You will know that you have one if you get complaints about unable
#	to execute things like 'data' and 'rumors'.)
# MAKE = make

#	make NetHack (as opposite to variants or such)
#PREFIX	 = /usr
GAME     = nethack
# GAME     = nethack.exe
# GAME     = nethack.prg
#GAMEUID  = games
#GAMEGRP  = bin

#	Permissions - some places use setgid instead of setuid, for instance.
#	See also the option "SECURE" in include/config.h.
#GAMEPERM = 04755
FILEPERM = 0644
# VARFILEPERM = 0644
EXEPERM  = 0755
DIRPERM  = 0755
# VARDIRPERM = 0755

#	VARDIR may also appear in unixconf.h as "VAR_PLAYGROUND" else HACKDIR
#
#	Note well!  'make install' believes in creating a nice tidy HACKDIR
#	for installation, free of debris from previous NetHack versions --
#	therefore there should not be anything in HACKDIR that you want to
#	keep (if there is, you'll have to do the installation by hand or
#	modify the install commands below).
#HACKDIR  = $(PREFIX)/games/lib/$(GAME)dir
#VARDIR  = $(HACKDIR)
#	Where nethack.sh is installed (as 'nethack').
#	If this is not defined, the shell wrapper script is not used.
#SHELLDIR = $(PREFIX)/games

#	Extra data files depending upon the interface(s) built into nethack.
# per discussion in Install.X11 and Install.Qt
# Qt prefers nhtiles.bmp but can use x11tiles, and it ignores NetHack.ad.
# X11 uses those last two.
# Both can display a conventional text map instead of tiles.
#	tty and/or curses (no extra data files outside of the dlb container):
#VARDATND =
#	All X11 and/or Qt variations may also include tty or curses or both):
#	X11 without Qt:
# VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm
#	X11 with GRAPHIC_TOMBSTONE (requires 'xpm'):
# VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm rip.xpm
#	both X11 and Qt:
# VARDATND = x11tiles nhtiles.bmp NetHack.ad pet_mark.xbm pilemark.xbm rip.xpm
#	Qt without X11; assumes GRAPHIC_TOMBSTONE:
# VARDATND = nhtiles.bmp pet_mark.xbm pilemark.xbm rip.xpm

VARDATD = bogusmon data engrave epitaph oracles options quest.lua rumors
VARDAT = $(VARDATD) $(VARDATND)

#	Some versions of make use the SHELL environment variable as the
#	shell for running commands.  We need this to be a Bourne shell.
# SHELL = /bin/sh
# for Atari (obsolete)
# SHELL=E:/GEMINI2/MUPFEL.TTP

# Commands for setting the owner and group on files during installation.
# Some systems fail with one or the other when installing over NFS or for
# other permission-related reasons.  If that happens, you may want to set the
# command to "true", which is a no-op.  Note that disabling chown or chgrp
# will only work if setuid (or setgid) behavior is not desired or required.
#CHOWN = chown
#CHGRP = chgrp

# Lua version
LUA_VERSION = 5.4.6

#
# end of configuration
#

DATHELP = help hh cmdhelp keyhelp history opthelp optmenu usagehlp wizhelp

SPEC_LEVS = asmodeus.lua baalz.lua bigrm-*.lua castle.lua fakewiz?.lua \
	juiblex.lua knox.lua medusa-?.lua minend-?.lua minefill.lua \
	minetn-?.lua oracle.lua orcus.lua sanctum.lua soko?-?.lua \
	tower?.lua valley.lua wizard?.lua nhcore.lua nhlib.lua themerms.lua \
	astral.lua air.lua earth.lua fire.lua water.lua hellfill.lua tut-?.lua
QUEST_LEVS = ???-goal.lua ???-fil?.lua ???-loca.lua ???-strt.lua

DATNODLB = $(VARDATND) license symbols
DATDLB = $(DATHELP) dungeon.lua tribute $(SPEC_LEVS) $(QUEST_LEVS) $(VARDATD)
DAT = $(DATNODLB) $(DATDLB)

# These get set only if they weren't already set above or in a hints file
#CHOWN ?= true
#CHGRP ?= true
#SYSCONFCREATE ?= cp sys/unix/sysconf $(INSTDIR)/sysconf
#SYSCONFINSTALL ?= $(SYSCONFCREATE) && \
#	 $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf && \
#	 $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf && \
#	 chmod $(VARFILEPERM) $(INSTDIR)/sysconf;
#SYSCONFENSURE ?= (if ! test -f $(INSTDIR)/sysconf ; then \
#	 $(SYSCONFCREATE) && \
#	 $(CHOWN) $(GAMEUID) $(INSTDIR)/sysconf && \
#	 $(CHGRP) $(GAMEGRP) $(INSTDIR)/sysconf && \
#	 chmod $(VARFILEPERM) $(INSTDIR)/sysconf; fi );

RECOVERBIN = recover

# Lua
LUAHEADERS = lib/lua-$(LUA_VERSION)/src
LUATESTTARGET = $(LUAHEADERS)/lua.h
LUATOP = $(LUAHEADERS)
LUAMAKEFLAGS = CC='$(CC)' SYSCFLAGS='$(SYSCFLAGS)'
LUA2NHTOP = ../../..
LUABASELIB = liblua-$(LUA_VERSION).a
TOPLUALIB = lib/lua/$(LUABASELIB)

ALLDEP = $(PRECHECK) $(GAME) recover Guidebook $(VARDAT) spec_levs check-dlb

# first target is also the default target for 'make' without any arguments
all:    $(ALLDEP)
	true; $(MOREALL)
	@echo "Done."

$(GAME): lua_support
	( cd src ; $(MAKE) LUA_VERSION=$(LUA_VERSION) $(GAME) )

lua_support: include/nhlua.h
	@true
$(LUATOP)/liblua.a: $(LUAHEADERS)/lua.h
	( cd $(LUATOP) && make $(LUAMAKEFLAGS) a )
$(TOPLUALIB): $(LUATOP)/liblua.a
	@( if test -d lib/lua ; then true ; else mkdir -p lib/lua ; fi )
	cp $(LUATOP)/liblua.a $@

include/nhlua.h: $(TOPLUALIB)
	echo '/* nhlua.h - generated by top Makefile */' > $@
	@echo '#include "../$(LUAHEADERS)/lua.h"' >> $@
	@sed -e '/(lua_error)/!d' \
		-e '/(lua_error)/s/LUA_API/ATTRNORETURN LUA_API/1' \
		-e '/(lua_error)/s/;/ NORETURN;/1' < $(LUAHEADERS)/lua.h >> $@
	@echo '#include "../$(LUAHEADERS)/lualib.h"' >> $@
	@echo '#include "../$(LUAHEADERS)/lauxlib.h"' >> $@
	@echo '/*nhlua.h*/' >> $@
# LUATESTTARGET is this by default
lib/lua-$(LUA_VERSION)/src/lua.h:
	@echo "Please do 'make fetch-lua' in the top directory to obtain lua-$(LUA_VERSION)"
	@false
luabin:
	( cd $(LUATOP) \
	  && make $(LUAMAKEFILES) all && cd $(LUA2NHTOP) )

# This is only needed for some internal tools.
nhlua:
	base=`ls -td lib/lua-*|head -1` ; \
	[ -z $$base ] && $(MAKE) fetch-lua ; \
	base=`ls -td lib/lua-*|head -1` ; \
	cp -R $$base/ lib/nhlsrc ; \
	rm -f util/nhlua ; \
	( cd lib/nhlsrc && $(MAKE) clean posix ) ; \
	cp lib/nhlsrc/src/lua util/nhlua

# hints file could set LUATESTTARGET to this if GITSUBMODULES is defined
submodules/lua/lua.h:
	git submodule init submodules/lua
	git submodule update submodules/lua
#	git submodule update --remote submodules/lua

# Note: many of the dependencies below are here to allow parallel make
# to generate valid output

Guidebook:
	( cd doc ; $(MAKE) Guidebook )

Guidebook.txt:
	( cd doc ; $(MAKE) Guidebook.txt )

Guidebook.pdf:
	( cd doc ; $(MAKE) Guidebook.pdf )

manpages:
	( cd doc ; $(MAKE) manpages )

distrib:
	( cd doc ; $(MAKE) distrib )

data: $(GAME)
	( cd dat ; $(MAKE) data )

engrave: $(GAME)
	( cd dat ; $(MAKE) engrave )

bogusmon: $(GAME)
	( cd dat ; $(MAKE) bogusmon )

epitaph: $(GAME)
	( cd dat ; $(MAKE) epitaph )

rumors: $(GAME)
	( cd dat ; $(MAKE) rumors )

oracles: $(GAME)
	( cd dat ; $(MAKE) oracles )

#	Note: options should have already been made with make, but...
options: $(GAME)
	( cd dat ; $(MAKE) options )

quest.lua: $(GAME)

spec_levs:
	( cd dat ; $(MAKE) spec_levs )
	( cd dat ; $(MAKE) quest_levs )

nhtiles.bmp: $(GAME)
	( cd util ; $(MAKE) tile2bmp )
	( cd dat ; $(MAKE) nhtiles.bmp )

x11tiles: $(GAME)
	( cd util ; $(MAKE) tile2x11 )
	( cd dat ; $(MAKE) x11tiles )

# obsolete
beostiles: $(GAME)
	( cd util ; $(MAKE) tile2beos )
	( cd dat ; $(MAKE) beostiles )

NetHack.ad: $(GAME)
	( cd dat ; $(MAKE) NetHack.ad )

pet_mark.xbm:
	( cd dat ; $(MAKE) pet_mark.xbm )

pilemark.xbm:
	( cd dat ; $(MAKE) pilemark.xbm )

rip.xpm:
	( cd dat ; $(MAKE) rip.xpm )

mapbg.xpm:
	(cd dat ; $(MAKE) mapbg.xpm )

nhsplash.xpm:
	( cd dat ; $(MAKE) nhsplash.xpm )

nh16.img: $(GAME)
	( cd util ; $(MAKE) tile2img.ttp )
	( cd dat ; $(MAKE) nh16.img )

rip.img:
	( cd util ; $(MAKE) xpm2img.ttp )
	( cd dat ; $(MAKE) rip.img )
GEM_RSC.RSC:
	( cd dat ; $(MAKE) GEM_RSC.RSC )

title.img:
	( cd dat ; $(MAKE) title.img )

check-dlb: options
	@if egrep -s librarian dat/options ; then $(MAKE) dlb ; else true ; fi

dlb:
	( cd util ; $(MAKE) dlb )
	( cd dat ; LC_ALL=C ; ../util/dlb cf nhdat $(DATDLB) )

wasm:
	( cd src ; $(MAKE) CROSS_TO_WASM=1 ../targets/wasm/nethack.js )

package: $(GAME) recover $(VARDAT) spec_levs
	( cd src ;  $(MAKE) $(PACKAGE) )

# recover can be used when INSURANCE is defined in include/config.h
# and the checkpoint option is true
recover: $(GAME)
	( cd util ; $(MAKE) $(RECOVERBIN) )

dofiles:
	target=`sed -n					\
		-e '/librarian/{' 			\
		-e	's/.*/dlb/p' 			\
		-e	'q' 				\
		-e '}' 					\
	  	-e '$$s/.*/nodlb/p' < dat/options` ;	\
	$(MAKE) dofiles-$${target-nodlb}
	cp src/$(GAME) $(INSTDIR)
	cp util/recover $(INSTDIR)
	-if test -n '$(SHELLDIR)'; then rm -f $(SHELLDIR)/$(GAME); fi
	if test -n '$(SHELLDIR)'; then \
		sed -e 's;/usr/games/lib/nethackdir;$(HACKDIR);' \
		-e 's;HACKDIR/nethack;HACKDIR/$(GAME);' \
		< sys/unix/nethack.sh \
		> $(SHELLDIR)/$(GAME) ; fi
# set up their permissions
	-( cd $(INSTDIR) ; $(CHOWN) $(GAMEUID) $(GAME) recover ; \
			$(CHGRP) $(GAMEGRP) $(GAME) recover )
	chmod $(GAMEPERM) $(INSTDIR)/$(GAME)
	chmod $(EXEPERM) $(INSTDIR)/recover
	-if test -n '$(SHELLDIR)'; then \
		$(CHOWN) $(GAMEUID) $(SHELLDIR)/$(GAME); fi
	if test -n '$(SHELLDIR)'; then \
		$(CHGRP) $(GAMEGRP) $(SHELLDIR)/$(GAME); \
		chmod $(EXEPERM) $(SHELLDIR)/$(GAME); fi

dofiles-dlb: check-dlb
	( cd dat ; cp nhdat $(DATNODLB) $(INSTDIR) )
# set up their permissions
	-( cd $(INSTDIR) ; $(CHOWN) $(GAMEUID) nhdat $(DATNODLB) ; \
			$(CHGRP) $(GAMEGRP) nhdat $(DATNODLB) ; \
			chmod $(FILEPERM) nhdat $(DATNODLB) )

dofiles-nodlb:
# copy over the game files
	( cd dat ; cp $(DAT) $(INSTDIR) )
# set up their permissions
	-( cd $(INSTDIR) ; $(CHOWN) $(GAMEUID) $(DAT) ; \
			$(CHGRP) $(GAMEGRP) $(DAT) ; \
			chmod $(FILEPERM) $(DAT) )
#
# This is not part of the dependency build hierarchy.
# It requires an explicit "make fetch-Lua".

LUA_URL :=www.lua.org/ftp
LUA_URL_MIRROR :=www.tecgraf.puc-rio.br/lua/mirror/ftp
LUA_URL_NHD :=www.nethack.org/download/thirdparty
LUA_URL_list:=$(LUA_URL) $(LUA_URL_MIRROR) $(LUA_URL_NHD)

fetch-lua-mirror: LUA_URL_list:=$(LUA_URL_MIRROR)
fetch-lua-mirror: fetch-Lua
	@true

fetch-lua-nhd: LUA_URL_list:=$(LUA_URL_NHD)
fetch-lua-nhd: fetch-Lua
	@true

fetch-lua: fetch-Lua
	@true

fetch-Lua:
	@( \
	  shac1=`command -v shasum`; \
	  shac2=`command -v sha256sum`; \
	  if [ ! -z $$shac1 ]; then \
	    shac="$$shac1 -a 256"; elif [ ! -z $$shac2 ]; then \
	    shac=$$shac2; else echo "CAUTION: no way to check integrity"; \
	  fi; \
	  set -- DUMMY $(LUA_URL_list); \
	  luafile=lua-$(LUA_VERSION).tar.gz; \
	  export curlstatus=1; \
	  mkdir -p lib && cd lib && \
	  while [ $$# -gt 0 ]; do \
	    shift; \
	    if [ $$curlstatus -ne 0 ]; then \
	      luaurl=https://$$1/$$luafile; \
	      echo Trying $$luaurl; \
	      curl -R -O $$luaurl; \
	      curlstatus=$$?; \
	      if [ $$curlstatus -eq 0 ]; then \
	        if [ ! -z "$$shac" ]; then \
		    CHKSUMS=../submodules/CHKSUMS; \
		    CHKSUMSTMP=../submodules/CHKSUMS.tmp; \
		    fgrep $$luafile < $$CHKSUMS > $$CHKSUMSTMP; \
		    if [ -z $$CHKSUMSTMP ]; then \
		      echo "Cannot check $$luafile - no checksum known"; \
		    else \
		      echo Checking integrity of $$luafile with $$shac; \
		      $$shac -w --ignore-missing -c $$CHKSUMSTMP < $$luafile; \
		    fi; \
	        fi; \
	        tar zxf $$luafile && \
	        rm -f $$luafile; \
	      fi; \
	    fi; \
	  done; \
	  true )

# remove include/nhlua.h in case it was created for some other Lua version
	@( if test -f include/nhlua.h ; then \
	     rm -f include/nhlua.h && echo 'rm include/nhlua.h' ; fi )

fetch-lua-http:
	( mkdir -p lib && cd lib && \
	  curl -R -O http://$(LUA_URL)/lua-$(LUA_VERSION).tar.gz && \
	  tar zxf lua-$(LUA_VERSION).tar.gz && \
	  rm -f lua-$(LUA_VERSION).tar.gz )

#
# This is not part of the dependency build hierarchy.
# It requires an explicit "make fetch-docs".
fetch-docs:
	@FDroot=https://www.nethack.org; \
	FDvmajor=`awk '/VERSION_MAJOR/{print $$3}' < include/patchlevel.h`; \
	FDvminor=`awk '/VERSION_MINOR/{print $$3}' < include/patchlevel.h`; \
	RDIR="NetHack-$${FDvmajor}.$${FDvminor}"; \
	echo "Fetching directory information for $${RDIR}"; \
	RDOCFILES=`curl --no-progress-meter $${FDroot}/cgi-bin/lsautodocs?$$RDIR`; \
	FDbase="$${FDroot}/autodocs/$${RDIR}"; \
	set -- $${RDOCFILES}; \
	echo "Fetching $$# files"; \
	while [ $$# -gt 0 ]; do \
	  echo "Downloading: '$$1' from '$${FDbase}/$$1'"; \
	  curl --no-progress-meter -R $${FDbase}/$$1 -o doc/$$1; \
	  shift; \
	done

makedefs:
	( cd util ; $(MAKE) makedefs )

stripbs:
	( cd util ; $(MAKE) stripbs )

# 'make update' can be used to install a revised version after making
# customizations or such.  Unlike 'make install', it doesn't delete everything
# from the target directory to have a clean start.
update: $(PRECHECK) $(GAME) recover $(VARDAT) spec_levs sys/unix/sysconf
#	(don't yank the old version out from under people who're playing it)
	-mv $(INSTDIR)/$(GAME) $(INSTDIR)/$(GAME).old
	-mv $(INSTDIR)/nhdat $(INSTDIR)/nhdat.old
# set up new versions of the game files
	( $(MAKE) dofiles )
# should already be present, but make sure
	touch $(VARDIR)/perm $(VARDIR)/record
# sysconf, but only if it does not exist
	true; $(SYSCONFENSURE)
# and a reminder
	@echo You may also want to install the man pages via the doc Makefile.

rootcheck:
	@true; $(ROOTCHECK)

install: rootcheck $(PRECHECK) $(GAME) recover $(VARDAT) spec_levs sys/unix/sysconf
	true; $(PREINSTALL)
# set up the directories
# not all mkdirs have -p; those that don't will create a -p directory
	-if test -n '$(SHELLDIR)'; then \
		mkdir -p $(SHELLDIR); fi
	rm -rf $(INSTDIR) $(VARDIR)
	-mkdir -p $(INSTDIR) $(VARDIR) $(VARDIR)/save
	if test -d ./-p; then rmdir ./-p; fi
	-$(CHOWN) $(GAMEUID) $(INSTDIR) $(VARDIR) $(VARDIR)/save
	$(CHGRP) $(GAMEGRP) $(INSTDIR) $(VARDIR) $(VARDIR)/save
# order counts here:
	chmod $(DIRPERM) $(INSTDIR)
	chmod $(VARDIRPERM) $(VARDIR) $(VARDIR)/save
# set up the game files
	( $(MAKE) dofiles )
# set up some additional files
	touch $(VARDIR)/perm $(VARDIR)/record $(VARDIR)/logfile $(VARDIR)/xlogfile \
         $(VARDIR)/livelog
	-( cd $(VARDIR) ; $(CHOWN) $(GAMEUID) perm record logfile xlogfile livelog ; \
			$(CHGRP) $(GAMEGRP) perm record logfile xlogfile livelog ; \
			chmod $(VARFILEPERM) perm record logfile xlogfile livelog )
# sysconf
	true; $(SYSCONFINSTALL)
# other steps from hints file
	true; $(POSTINSTALL)
# and a reminder
	@echo You may also want to reinstall the man pages via the doc Makefile.


# 'make clean' removes all the .o files, but leaves around all the executables
# and compiled data files
clean: clean-lib clean-keep-lib
	@true

clean-lib:
	-( cd $(LUATOP) && $(MAKE) clean )

clean-keep-lib:
	( cd src ; $(MAKE) clean )
	( cd util ; $(MAKE) clean )
	( cd dat ; $(MAKE) clean )
	( cd doc ; $(MAKE) clean )

# 'make spotless' returns the source tree to near-distribution condition.
# it removes .o files, executables, and compiled data files
spotless:: spotless-lib spotless-keep-lib
	@true

spotless-lib:: clean-lib
	-( cd lib/lua && rm $(LUABASELIB) )

spotless-keep-lib: clean-keep-lib
	( cd src ; $(MAKE) spotless )
	( cd util ; $(MAKE) spotless )
	( cd dat ; $(MAKE) spotless )
	( cd doc ; $(MAKE) spotless )
spotless-clean-submodule:
	@( if test -f submodules/lua/lua.h ; then \
	    git submodule deinit submodules/lua ; fi )

