# NetHack 3.7 GNUmakefile # Copyright (c) 2022 by Feiyun Wang #-Copyright (c) 2022 by Michael Allison # NetHack may be freely redistributed. See license for details. # #============================================================================== # # Win32 Compilers Tested with this GNUmakefile: # mingw-w64 # from: # https://sourceforge.net/p/mingw-w64/wiki2/GeneralUsageInstructions/ # Toolchain for 32 and 64 bit Windows target # #============================================================================== # This is used for building two versions of NetHack: # # A tty port utilizing the Win32 Console I/O subsystem, Console # NetHack. # # A Win32 native port built on the Windows API, Graphical NetHack or # NetHackW. # # If you have any questions read the sys/windows/Install.windows file included # with the distribution. # #============================================================================== # # The default make target (so just typing 'mingw32-make'). # default: package #--------------------------------------------------------------- # Where do you want the game to be built (which folder)? # If not present prior to compilation it gets created. # GAMEDIR = ../binary # #--------------------------------------------------------------- # Do you want to include integration with any sound libraries that work with # this Makefile? Add the list below. If you change the list do 'nmake clean'. # # There is glue in here for the following: windsound fmod # Obtaining the 3rd party library, including its .h files, is up to you. # # windsound uses built-in Microsoft API's, no 3rd party download is required. SOUND_LIBRARIES = windsound # #--------------------------------------------------------------- # Do you want debug information in the executable? # DEBUGINFO = Y # #--------------------------------------------------------------- # Required for CRASHREPORT (but doesn't work yet, so off). CRASHREPORT = N # #--------------------------------------------------------------- # Do you have a connection to the internet available that you want # to utilize for obtaining prerequisite Lua source code and pdcursesmod # source code. Defaults to Y. INTERNET_AVAILABLE = Y # #--------------------------------------------------------------- # Do you have git commands available and NetHack in a git repository? # GIT_AVAILABLE = N # #--------------------------------------------------------------- # Do you want to turn on the same gcc warnings as on Unix builds? # GCC_EXTRA_WARNINGS = N # #=============================================== #======= End of Modification Section =========== #=============================================== # ################################################ # # # Nothing below here should have to be changed.# # # ################################################ # #============================================================================== $(info Using $(lastword $(MAKEFILE_LIST))) SKIP_NETHACKW = N USE_LUADLL = Y WANT_LUAC = N ifndef LUA_VERSION LUAVER=5.4.6 else LUAVER=$(LUA_VERSION) endif # if GIT=1 is passed on the make command, allow use of git and internet ifeq "$(GIT)" "1" INTERNET_AVAILABLE=Y GIT_AVAILABLE=Y endif ifeq "$(git)" "1" INTERNET_AVAILABLE=Y GIT_AVAILABLE=Y endif PDCURSES=pdcursesmod PDCURSESFLAGS = -DPDC_WIDE -DPDC_RGB # #============================================================================== # Sanity checks for prerequisite Lua and pdcurses # LUA_MAY_PROCEED=N ADD_CURSES=N PDCURSES_TOP= # First, Lua ifeq "$(INTERNET_AVAILABLE)" "Y" ifeq "$(GIT_AVAILABLE)" "Y" LUATOP=../submodules/lua LUASRC=$(LUATOP) LUA_MAY_PROCEED=Y else # GIT_AVAILABLE LUATOP = ../lib/lua-$(LUAVER) LUASRC = $(LUATOP)/src LUA_MAY_PROCEED=Y endif # GIT_AVAILABLE else # INTERNET_AVAILABLE not # The internet is not available for obtaining Lua using either # method (git or download). Check to see if it is available already, with # precedence given to ../submodules, then ../lib. # ifneq ("$(wildcard ../submodules/lua/lua.h)", "") LUATOP=../submodules/lua LUASRC=$(LUATOP) LUA_MAY_PROCEED=Y else ifneq ("$(wildcard ../lib/lua-$(LUAVER)/src/lua.h)", "") LUATOP = ../lib/lua-$(LUAVER) LUASRC = $(LUATOP)/src LUA_MAY_PROCEED=Y else endif # Lua sources ifeq "$(LUA_MAY_PROCEED)" "Y" $(info No internet connection was authorized in the Makefile,) $(info but a copy of lua-$(LUAVER) was found in $(LUASRC), so that will be used.) endif # LUA_MAY_PROCEED endif # INTERNET_AVAILABLE ifneq "$(LUA_MAY_PROCEED)" "Y" ifneq "$(INTERNET_AVAILABLE)" "Y" $(info Your Makefile settings do not allow use of the internet to obtain Lua) endif # INTERNET_AVAILABLE $(info and no copy of Lua was found in either ../submodules/lua or ../lib/lua-$(LUAVER).) $(info Change your make command line to include:) $(info GIT=1) $(info or modify your Makefile to set the following:) $(info INTERNET_AVAILABLE=Y) $(info GIT_AVAILABLE=Y) $(error Stopping because NetHack 3.7 requires Lua for its build.) endif # LUA_MAY_PROCEED # Now, pdcurses ifeq "$(INTERNET_AVAILABLE)" "Y" ifeq "$(GIT_AVAILABLE)" "Y" PDCURSES_TOP=../submodules/$(PDCURSES) ADD_CURSES=Y else # GIT_AVAILABLE PDCURSES_TOP=../lib/$(PDCURSES) ADD_CURSES=Y endif # GIT_AVAILABLE else # INTERNET_AVAILABLE is not Y below # Your Makefile settings to not allow $(PDCURSES) to be obtained by # git or by download). Check to see if it is available at one of # the expected locations already, with precedence given to ../submodules, # then ../lib. # ifneq ("$(wildcard ../submodules/$(PDCURSES)/curses.h)", "") PDCURSES_TOP=../submodules/$(PDCURSES) ADD_CURSES=Y else ifneq ("$(wildcard ../lib/$(PDCURSES)/curses.h)", "") PDCURSES_TOP=../lib/$(PDCURSES) ADD_CURSES=Y endif # $(PDCURSES) sources available somewhere ifeq "$(ADD_CURSES)" "Y" $(info Your Makefile settings do not allow $(PDCURSES) to be obtained by) $(info git or by download, but a copy of $(PDCURSES) was found in $(PDCURSES_TOP),) $(info so that will be used.) endif # ADD_CURSES == Y endif # INTERNET_AVAILABLE ifneq "$(ADD_CURSES)" "Y" $(info NetHack 3.7 will be built without support for the curses window-port.) endif ifeq "$(INTERNET_AVAILABLE)" "Y" ifeq "$(GIT_AVAILABLE)" "Y" GIT_HASH := $(shell echo `git rev-parse --verify HEAD` 2>&1) GIT_BRANCH := $(shell echo `git rev-parse --abbrev-ref HEAD` 2>&1) GIT_PREFIX := $(shell echo `git config nethack.substprefix` 2>&1) ifdef GIT_HASH GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\" endif ifdef GIT_BRANCH GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\" endif ifdef GIT_PREFIX GITPREFIX = -DNETHACK_GIT_PREFIX=\"$(GIT_PREFIX)\" endif endif endif #============================================================================== # The version of the game this Makefile was designed for NETHACK_VERSION="3.7.0" # A brief version for use in macros NHV1=$(subst .,,$(NETHACK_VERSION)) NHV=$(subst ",,$(NHV1)) # # Source directories. Makedefs hardcodes these, don't change them. # # INCL - NetHack include files # DAT - NetHack data files # DOC - NetHack documentation files # UTIL - Utility source # SRC - Main source # SSYS - Shared system files # MSWSYS - mswin specific files # TTY - window port files (tty) # MSWIN - window port files (win32) # WCURSES - window port files (curses) # WCHAIN - window port files (chain) # WSHR - Tile support files # SNDSYS - sound support files for win32 # QT - QT window support files INCL =../include DAT =../dat DOC =../doc UTIL =../util SRC =../src SSYS =../sys/share SNDSYS =../sound/windsound MSWSYS =../sys/windows TTY =../win/tty MSWIN =../win/win32 WCHAIN =../win/chain WCURSES =../win/curses WSHR =../win/share QT =../win/Qt SNDWAVDIR = ../sound/wav BinDir = ../binary PkgDir = ../package # # Object directory. # OBJ = o # # Shorten up the location for some files # O = $(OBJ)/ U = $(UTIL)/ # To store all the level files, # help files, etc. in a single library file. # USE_DLB = Y is left uncommented USE_DLB = Y #========================================== #========================================== # Setting up the compiler and linker # macros. All builds include the base ones. #========================================== #========================================== ifdef CI_COMPILER cc = gcc -c cxx = g++ -c ld = gcc DEBUGINFO = N else cc = gcc -c cxx = g++ -c ld = gcc endif ifeq "$(MSYSTEM)" "MINGW32" rc = windres --target=pe-i386 else # MINGW64 rc = windres --target=pe-x86-64 endif ifeq "$(MSYSTEM)" "MINGW32" arch = x86 else # MINGW64 arch = x64 endif # # Handle user settings # CFLAGS = -mms-bitfields -I../include -I../sys/windows LDFLAGS = ifeq "$(DEBUGINFO)" "Y" CFLAGS += -g -D_DEBUG LIBUCRT = -lucrtbased else CFLAGS += -DNDEBUG LDFLAGS += -s LIBUCRT= endif ifeq "$(USE_DLB)" "Y" DLBFLG = -DDLB else DLBFLG = endif ifeq "$(GCC_EXTRA_WARNINGS)" "Y" # # These match the warnings enabled on the linux.370 and macOS.370 hints builds # CFLAGSXTRA = -Wall -Wextra -Wreturn-type -Wunused -Wswitch -Wshadow \ -Wwrite-strings -pedantic -Wmissing-declarations \ -Wunreachable-code -Wimplicit \ -Wimplicit-function-declaration -Wimplicit-int \ -Wmissing-prototypes -Wold-style-definition \ -Wstrict-prototypes -Wnonnull -Wformat-overflow \ -Wmissing-parameter-type -Wimplicit-fallthrough \ -Wno-cast-function-type -Wno-format CPPFLAGSXTRA = -Wall -Wextra -Wno-missing-field-initializers -Wreturn-type \ -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -pedantic \ -Wmissing-declarations -Wformat-nonliteral -Wunreachable-code endif COMMONDEF = -DWIN32 -DWINVER=0x0601 -D_WIN32_WINNT=0x0601 DLLDEF = $(COMMONDEF) -D_WINDOWS -D_USRDLL -D_WINDLL CONSOLEDEF = $(COMMONDEF) -D_CONSOLE # To build util targets CFLAGSU = $(CFLAGS) $(CONSOLEDEF) $(DLBFLG) LIBS = -lcomctl32 -lgdi32 -lole32 -lshell32 -luserenv -luuid -lwinmm \ -lrpcrt4 -lbcrypt $(LIBUCRT) $(GAMEDIR): @mkdir -p $@ $(OBJ): @mkdir -p $@ CLEAN_DIR = $(GAMEDIR) $(OBJ) #================================================================= # LUA library # Source from http://www.lua.org/ftp/lua-5.4.6.tar.gz #================================================================= OLUA = $(O)lua LUAOBJS = $(addprefix $(OLUA)/, $(addsuffix .o, lapi lauxlib lbaselib lcode lcorolib lctype \ ldblib ldebug ldo ldump lfunc lgc linit liolib llex lmathlib lmem \ loadlib lobject lopcodes loslib lparser lstate lstring lstrlib ltable ltablib ltm \ lundump lutf8lib lvm lzio)) LUADLL = $(GAMEDIR)/lua-$(LUAVER).dll LUAIMP = $(OLUA)/lua-$(LUAVER).dll.a ULUADLL = $(U)$(notdir $(LUADLL)) LUASTATIC = $(OLUA)/lua-$(LUAVER).a LUATARGETS = $(U)lua.exe ifeq "$(USE_LUADLL)" "Y" LUALIB = $(LUAIMP) LUATARGETS += $(LUADLL) $(ULUADLL) $(LUAIMP) else LUALIB = $(LUASTATIC) LUATARGETS += $(LUASTATIC) endif ifeq "$(WANT_LUAC)" "Y" LUATARGETS += $(U)luac.exe endif lua: $(LUATARGETS) $(U)lua.exe: $(OLUA)/lua.o $(LUALIB) $(ld) $(LDFLAGS) $^ -o$@ $(LUADLL): $(ULUADLL) cp $< $@ $(ULUADLL) $(LUAIMP): $(LUAOBJS) | $(OLUA) $(ld) $(LDFLAGS) -fPIC -shared -Wl,--export-all-symbols -Wl,--add-stdcall-alias \ -Wl,--out-implib=$(LUAIMP) $^ -o$(ULUADLL) $(LUASTATIC): $(LUAOBJS) | $(OLUA) ar rcs $@ $^ $(OLUA)/%.o: $(LUASRC)/%.c | $(OLUA) $(cc) $(CFLAGS) $< -o$@ $(U)luac.exe: $(OLUA)/luac.o $(LUALIB) $(ld) $(LDFLAGS) $^ -o$@ $(OLUA): @mkdir -p $@ CLEAN_DIR += $(OLUA) CLEAN_FILE += $(LUATARGETS) $(LUAOBJS) $(OLUA)/lua.o $(OLUA)/luac.o #========================================== # nhlua.h #========================================== NHLUAH = $(INCL)/nhlua.h $(NHLUAH): echo "/* nhlua.h - generated by GNUmakefile */" > $@ @echo "#include \"$(LUASRC)/lua.h\"" >> $@ @echo "ATTRNORETURN LUA_API int (lua_error) (lua_State *L) NORETURN;" >>$@ @echo "#include \"$(LUASRC)/lualib.h\"" >> $@ @echo "#include \"$(LUASRC)/lauxlib.h\"" >> $@ @echo "/*nhlua.h*/" >> $@ CLEAN_FILE += $(NHLUAH) #=========================================== # Lua level files, dungeon file, quest files #=========================================== LUALIST = air Arc-fila Arc-filb Arc-goal Arc-loca Arc-strt \ asmodeus astral baalz Bar-fila Bar-filb Bar-goal \ Bar-loca Bar-strt bigrm-1 bigrm-10 bigrm-11 bigrm-2 \ bigrm-12 \ bigrm-3 bigrm-4 bigrm-5 bigrm-6 bigrm-7 bigrm-8 \ bigrm-9 castle Cav-fila Cav-filb Cav-goal Cav-loca \ Cav-strt dungeon earth fakewiz1 fakewiz2 fire \ Hea-fila Hea-filb Hea-goal Hea-loca Hea-strt hellfill \ juiblex Kni-fila Kni-filb Kni-goal Kni-loca Kni-strt \ knox medusa-1 medusa-2 medusa-3 medusa-4 minefill \ minend-1 minend-2 minend-3 minetn-1 minetn-2 minetn-3 \ minetn-4 minetn-5 minetn-6 minetn-7 Mon-fila Mon-filb \ Mon-goal Mon-loca Mon-strt nhcore nhlib oracle \ orcus Pri-fila Pri-filb Pri-goal Pri-loca Pri-strt \ quest Ran-fila Ran-filb Ran-goal Ran-loca Ran-strt \ Rog-fila Rog-filb Rog-goal Rog-loca Rog-strt Sam-fila \ Sam-filb Sam-goal Sam-loca Sam-strt sanctum soko1-1 \ soko1-2 soko2-1 soko2-2 soko3-1 soko3-2 soko4-1 \ soko4-2 themerms Tou-fila Tou-filb Tou-goal Tou-loca \ Tou-strt tower1 tower2 tower3 Val-fila Val-filb \ Val-goal Val-loca Val-strt valley water Wiz-fila \ Wiz-filb Wiz-goal Wiz-loca Wiz-strt wizard1 wizard2 \ wizard3 tut-1 tut-2 LUAFILES = $(addprefix $(DAT)/, $(addsuffix .lua, $(LUALIST))) #========================================== # Hacklib #========================================== HACKLIBLIST = hacklib HACKLIBSRC = $(addprefix ../src/,$(addsuffix .c, $(HACKLIBLIST))) HL = $(O)hacklib HLHACKLIB = $(HL)/hacklib.a HLHACKLIBOBJS = $(addprefix $(HL)/, $(addsuffix .o, $(HACKLIBLIST))) HLTARGETS = $(HLHACKLIB) $(HLHACKLIBOBJS) $(HL)/hacklib.a: $(HLHACKLIBOBJS) ar rcs $@ $^ $(HL)/hacklib.o: $(HACKLIBSRC) | $(HL) $(HL)/%.o: $(SRC)/%.c | $(HL) $(cc) $(CFLAGSU) $< -o$@ $(HL): @mkdir -p $@ CLEAN_DIR += $(HL) CLEAN_FILE += $(HLTARGETS) #========================================== # Makedefs #========================================== OM = $(O)makedefs MOBJS = $(addprefix $(OM)/, alloc.o date.o makedefs.o monst.o objects.o panic.o) MTARGETS = $(U)makedefs.exe makedefs: $(MTARGETS) $(U)makedefs.exe: $(MOBJS) $(HLHACKLIB) $(ld) $(LDFLAGS) $^ -o$@ $(OM)/%.o: $(SRC)/%.c $(NHLUAH) | $(OM) $(cc) $(CFLAGSU) -DENUM_PM $< -o$@ $(OM)/%.o: $(U)%.c $(NHLUAH) | $(OM) $(cc) $(CFLAGSU) -DENUM_PM $< -o$@ $(OM): @mkdir -p $@ CLEAN_DIR += $(OM) CLEAN_FILE += $(MTARGETS) $(MOBJS) #========================================== # Recover #========================================== OR = $(OBJ) ROBJS = $(OR)/recover.o $(OR)/rversion.o RTARGETS = $(GAMEDIR)/recover.txt $(GAMEDIR)/recover.exe recover: $(RTARGETS) $(GAMEDIR)/recover.txt: $(DOC)/recover.txt | $(GAMEDIR) cp $< $@ $(GAMEDIR)/recover.exe: $(ROBJS) $(HLHACKLIB) | $(GAMEDIR) $(ld) $(LDFLAGS) $^ -o$@ $(OR)/recover.o: $(U)recover.c | $(OR) $(cc) $(CFLAGSU) $< -o$@ $(OR)/rversion.o: $(SRC)/version.c | $(OR) $(cc) $(CFLAGSU) -DMINIMAL_FOR_RECOVER $< -o$@ # $(OR): # @mkdir -p $@ CLEAN_FILE += $(RTARGETS) $(ROBJS) #========================================== # PDCurses #========================================== ifeq "$(ADD_CURSES)" "Y" #https://github.com/Bill-Gray/PDCursesMod/issues/333 PDCMOD_WORKAROUND = -std=gnu17 PDCCOMMONSRC = addch addchstr addstr attr beep bkgd border clear \ color debug delch deleteln getch getstr getyx inch \ inchstr initscr inopts insch insstr kernel keyname \ mouse move outopts overlay pad panel printw refresh \ scanw scr_dump scroll slk termattr touch util window PDCCOMMONOBJS = $(addsuffix .o, $(PDCCOMMONSRC)) OP = $(O)$(PDCURSES) PDCOBJS = $(addprefix $(OP)/, $(PDCCOMMONOBJS) \ pdcclip.o pdcdisp.o pdcgetsc.o pdckbd.o pdcscrn.o pdcsetsc.o pdcutil.o) PDCSRC = $(PDCURSES_TOP)/pdcurses PDCWINCON = $(PDCURSES_TOP)/wincon PDCINCL = -I$(PDCURSES_TOP) -I$(PDCSRC) PDCLIB = $(O)$(PDCURSES).a PDCDEP = $(PDCURSES_TOP)/curses.h $(PDCURSES): $(PDCLIB) $(PDCLIB): $(PDCOBJS) ar rcs $@ $^ $(OP)/%.o: $(PDCSRC)/%.c | $(OP) $(cc) $(CFLAGS) $(PDCMOD_WORKAROUND) $(PDCURSESFLAGS) $(PDCINCL) -D_LIB $< -o$@ $(OP)/%.o: $(PDCWINCON)/%.c | $(OP) $(cc) $(CFLAGS) $(PDCMOD_WORKAROUND) $(PDCURSESFLAGS) $(PDCINCL) -I$(PDCWINCON) -D_LIB $< -o$@ $(OP): @mkdir -p $@ CLEAN_DIR += $(OP) CLEAN_FILE += $(PDCLIB) $(PDCOBJS) ifneq ("$(wildcard $(PDCURSES_TOP)/wingui/pdcwin.h)", "") # $(PDCURSES) in use; enable Curses graphics on NetHackW OPW = $(O)$(PDCURSES)w PDCWOBJS = $(addprefix $(OPW)/, $(PDCCOMMONOBJS) \ pdcclip.o pdcdisp.o pdcgetsc.o pdckbd.o pdcscrn.o pdcsetsc.o pdcutil.o) PDCWINGUI = $(PDCURSES_TOP)/wingui PDCWLIB = $(O)$(PDCURSES)w.a $(PDCURSES)w: $(PDCWLIB) $(PDCWLIB): $(PDCWOBJS) ar rcs $@ $^ $(OPW)/%.o: $(PDCSRC)/%.c | $(OPW) $(cc) $(CFLAGS) $(PDCMOD_WORKAROUND) $(PDCURSESFLAGS) $(PDCINCL) -D_LIB $< -o$@ $(OPW)/%.o: $(PDCWINGUI)/%.c | $(OPW) $(cc) $(CFLAGS) $(PDCMOD_WORKAROUND) $(PDCURSESFLAGS) $(PDCINCL) -I$(PDCWINGUI) -D_LIB $< -o$@ $(OPW): @mkdir -p $@ CLEAN_DIR += $(OPW) CLEAN_FILE += $(PDCWLIB) $(PDCWOBJS) endif endif #========================================== # tile2bmp #========================================== OT = $(O)tile2bmp TOBJS = $(addprefix $(OT)/, drawing.o monst.o objects.o tile2bmp.o tiletext.o tiletxt.o) TTARGETS = $(U)tile2bmp.exe tile2bmp: $(TTARGETS) $(U)tile2bmp.exe: $(TOBJS) $(HLHACKLIB) $(ld) $(LDFLAGS) $(HLHACKLIB) $^ -o$@ $(OT)/tiletxt.o: $(WSHR)/tilemap.c $(NHLUAH) | $(OT) $(cc) $(CFLAGSU) -DTILETEXT $< -o$@ $(OT)/%.o: $(WSHR)/%.c $(NHLUAH) | $(OT) $(cc) $(CFLAGSU) $< -o$@ $(OT)/%.o: $(SRC)/%.c $(NHLUAH) | $(OT) $(cc) $(CFLAGSU) $< -o$@ $(OT): @mkdir -p $@ CLEAN_DIR += $(OT) CLEAN_FILE += $(TTARGETS) $(TOBJS) #========================================== # Optional Tile Utilities #========================================== TEXT_IO = $(addprefix $(OT)/, drawing.o monst.o objects.o tiletext.o tiletxt.o) TUCOMMON = $(OT)/alloc.o $(OT)/panic.o TUOBJS = $(TUCOMMON) $(TEXT_IO) T32OBJS = $(OT)/tilete32.o $(OT)/tiletx32.o TEXT_IO32 = $(addprefix $(OT)/, drawing.o monst.o objects.o) $(T32OBJS) TU32OBJS = $(TUCOMMON) $(TEXT_IO32) GIFOBJ = $(OT)/gifread.o GIF32OBJ = $(OT)/gifrd32.o PPMOBJ = $(OT)/ppmwrite.o BMP32OBJ = $(OT)/til2bm32.o TILEFILES32 = $(addprefix $(WSHR)/, mon32.txt obj32.txt oth32.txt) TUTARGETS = $(U)gif2txt.exe $(U)gif2tx32.exe $(U)txt2ppm.exe $(U)til2bm32.exe tileutil: $(TUTARGETS) $(U)gif2txt.exe: $(GIFOBJ) $(TUOBJS) $(ld) $(LDFLAGS) $^ -o$@ $(U)gif2tx32.exe: $(GIF32OBJ) $(TU32OBJS) $(ld) $(LDFLAGS) $^ -o$@ $(U)txt2ppm.exe: $(PPMOBJ) $(TUOBJS) $(ld) $(LDFLAGS) $^ -o$@ $(U)til2bm32.exe: $(BMP32OBJ) $(TEXT_IO32) $(ld) $(LDFLAGS) $^ -o$@ $(OT)/tilete32.o: $(WSHR)/tiletext.c $(NHLUAH) | $(OT) $(cc) $(CFLAGSU) -DTILE_X=32 -DTILE_Y=32 $< -o$@ $(OT)/tiletx32.o: $(WSHR)/tilemap.c $(NHLUAH) | $(OT) $(cc) $(CFLAGSU) -DTILETEXT -DTILE_X=32 -DTILE_Y=32 $< -o$@ $(GIF32OBJ): $(WSHR)/gifread.c $(NHLUAH) | $(OT) $(cc) $(CFLAGSU) -DTILE_X=32 -DTILE_Y=32 $< -o$@ $(BMP32OBJ): $(WSHR)/tile2bmp.c $(NHLUAH) | $(OT) $(cc) $(CFLAGSU) -DTILE_X=32 -DTILE_Y=32 $< -o$@ $(OT)/panic.o: $(UTIL)/panic.c $(NHLUAH) | $(OT) $(cc) $(CFLAGSU) $< -o$@ $(MSWIN)/tiles32.bmp: $(U)til2bm32.exe $(TILEFILES32) $< $@ CLEAN_FILE += $(TUTARGETS) $(GIFOBJ) $(GIF32OBJ) $(PPMOBJ) $(BMP32OBJ) \ $(T32OBJS) $(TUCOMMON) #========================================== # tilemap #========================================== OTM = $(OBJ)/tilemap TMOBJS = $(addprefix $(OTM)/, drawing.o monst.o objects.o tilemap.o) TMTARGETS = $(SRC)/tile.c $(U)tilemap.exe tilemap: $(SRC)/tile.c $(SRC)/tile.c: $(U)tilemap.exe $< $(U)tilemap.exe: $(TMOBJS) $(HLHACKLIB) $(ld) $(LDFLAGS) $(HLHACKLIB) $^ -o$@ $(OTM)/tilemap.o: $(WSHR)/tilemap.c $(NHLUAH) | $(OTM) $(cc) $(CFLAGSU) $< -o$@ $(OTM)/%.o: $(SRC)/%.c $(NHLUAH) | $(OTM) $(cc) $(CFLAGSU) $< -o$@ $(OTM): @mkdir -p $@ CLEAN_DIR += $(OTM) # tilemap.exe will create tilemappings.lst CLEAN_FILE += $(TMTARGETS) $(TMOBJS) $(SRC)/tilemappings.lst #========================================== # uudecode #========================================== OU = $(OBJ) UOBJS = $(OU)/uudecode.o UTARGETS = $(U)uudecode.exe $(MSWIN)/NetHack.ico uudecode: $(UTARGETS) $(U)uudecode.exe: $(UOBJS) $(ld) $(LDFLAGS) $^ -o$@ $(OU)/uudecode.o: $(SSYS)/uudecode.c | $(OU) $(cc) $(CFLAGS) $(CONSOLEDEF) $< -o$@ # $(OU): # @mkdir -p $@ $(MSWIN)/NetHack.ico: $(U)uudecode.exe $(MSWSYS)/nhico.uu $^ mv nethack.ico $@ CLEAN_FILE += $(UTARGETS) $(UOBJS) #========================================== # sfctool #========================================== # # Requires universal-ctags. # pacman -S ctags # .PHONY: sfctool CONFIG_H = ../include/color.h ../include/config.h ../include/config1.h \ ../include/coord.h ../include/cstd.h ../include/fnamesiz.h \ ../include/global.h ../include/integer.h ../include/micro.h \ ../include/patchlevel.h ../include/pcconf.h \ ../include/tradstdc.h ../include/unixconf.h \ ../include/vmsconf.h ../include/warnings.h \ ../include/windconf.h HACK_H = $(CONFIG_H) ../include/align.h ../include/artilist.h \ ../include/attrib.h ../include/botl.h ../include/context.h \ ../include/decl.h ../include/defsym.h ../include/display.h \ ../include/dungeon.h ../include/engrave.h ../include/flag.h \ ../include/hack.h ../include/lint.h ../include/mextra.h \ ../include/mkroom.h ../include/monattk.h ../include/mondata.h \ ../include/monflag.h ../include/monst.h ../include/monsters.h \ ../include/nhlua.h ../include/obj.h ../include/objclass.h \ ../include/objects.h ../include/permonst.h ../include/prop.h \ ../include/quest.h ../include/rect.h ../include/region.h \ ../include/rm.h ../include/savefile.h ../include/sfprocs.h \ ../include/seffects.h ../include/selvar.h \ ../include/skills.h ../include/sndprocs.h ../include/spell.h \ ../include/stairs.h ../include/sym.h ../include/sys.h \ ../include/timeout.h ../include/trap.h ../include/vision.h \ ../include/weight.h ../include/winprocs.h \ ../include/wintype.h ../include/you.h ../include/youprop.h OSFC = $(O)sfctool SFCTARGETS = $(U)sftags.exe $(GAMEDIR)/sfctool.exe SFCCOREOBJS = SFCCOREOBJS = sfctool sf-alloc sf-artifact sf-calendar sf-cfgfiles sfdata \ sf-date sf-decl sf-dungeon sf-end sf-engrave \ sf-files sf-light sf-mdlib sf-mkmaze sf-mkroom sf-monst \ sf-nhlua sf-objects sf-o_init panic sf-region sf-restore \ sf-rumors sfbase sfexpasc sf-struct strutil sf-sys \ sf-timeout sf-track sf-version sf-worm sf-windsys SFCTOOLOBJS = $(addprefix $(OSFC)/, $(addsuffix .o, $(SFCCOREOBJS))) SFCTOOLBIN = $(GAMEDIR)/sfctool.exe SFFLAGS = -DSFCTOOL -DNOPANICTRACE -DNOCRASHREPORT -DNO_CHRONICLE sfctool: $(SFCTARGETS) #$(info SFCTOOLOBJS=$(SFCTOOLOBJS)) $(SFCTOOLBIN): $(HLHACKLIB) $(SFCTOOLOBJS) $(ld) $(LDFLAGS) $^ $(HLHACKLIB) $(LIBS) -o$@ $(OSFC)/sfctool.o: $(U)sfctool.c $(HACK_H) $(INCL)/sfprocs.h | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(U)sfctool.c -o$@ $(OSFC)/sf-alloc.o: $(SRC)/alloc.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/alloc.c -o$@ $(OSFC)/sf-artifact.o: $(SRC)/artifact.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/artifact.c -o$@ $(OSFC)/sf-calendar.o: $(SRC)/calendar.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/calendar.c -o$@ $(OSFC)/sf-cfgfiles.o: $(SRC)/cfgfiles.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/cfgfiles.c -o$@ $(OSFC)/sfdata.o: $(U)sfdata.c $(HACK_H) $(INCL)/sfprocs.h $(INCL)/sfproto.h | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(U)sfdata.c -o$@ $(OSFC)/sf-date.o: $(SRC)/date.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/date.c -o$@ $(OSFC)/sf-decl.o: $(SRC)/decl.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/decl.c -o$@ $(OSFC)/sf-dungeon.o: $(SRC)/dungeon.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/dungeon.c -o$@ $(OSFC)/sf-end.o: $(SRC)/end.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/end.c -o$@ $(OSFC)/sf-engrave.o: $(SRC)/engrave.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/engrave.c -o$@ $(OSFC)/sf-files.o: $(SRC)/files.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/files.c -o$@ $(OSFC)/sf-light.o: $(SRC)/light.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/light.c -o$@ $(OSFC)/sf-mdlib.o: $(SRC)/mdlib.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/mdlib.c -o$@ $(OSFC)/sf-mkmaze.o: $(SRC)/mkmaze.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/mkmaze.c -o$@ $(OSFC)/sf-mkroom.o: $(SRC)/mkroom.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/mkroom.c -o$@ $(OSFC)/sf-monst.o: $(SRC)/monst.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/monst.c -o$@ $(OSFC)/sf-nhlua.o: $(SRC)/nhlua.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/nhlua.c -o$@ $(OSFC)/sf-objects.o: $(SRC)/objects.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/objects.c -o$@ $(OSFC)/sf-o_init.o: $(SRC)/o_init.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/o_init.c -o$@ $(OSFC)/panic.o: $(U)panic.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(U)panic.c -o$@ $(OSFC)/sf-region.o: $(SRC)/region.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/region.c -o$@ $(OSFC)/sf-restore.o: $(SRC)/restore.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/restore.c -o$@ $(OSFC)/sf-rumors.o: $(SRC)/\rumors.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/rumors.c -o$@ $(OSFC)/sfbase.o: $(SRC)/sfbase.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/sfbase.c -o$@ $(OSFC)/sfexpasc.o: $(U)sfexpasc.c $(HACK_H) $(INCL)/sfprocs.h $(INCL)/sfproto.h | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(U)sfexpasc.c -o$@ $(OSFC)/sf-struct.o: $(SRC)/sfstruct.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/sfstruct.c -o$@ $(OSFC)/strutil.o: $(SRC)/strutil.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/strutil.c -o$@ $(OSFC)/sf-sys.o: $(SRC)/sys.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/sys.c -o$@ $(OSFC)/sf-timeout.o: $(SRC)/timeout.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/timeout.c -o$@ $(OSFC)/sf-track.o: $(SRC)/track.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/track.c -o$@ $(OSFC)/sf-version.o: $(SRC)/version.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/version.c -o$@ $(OSFC)/sf-worm.o: $(SRC)/worm.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(SRC)/worm.c -o$@ $(OSFC)/sf-windsys.o: $(MSWSYS)/windsys.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) $(SFFLAGS) -c $(MSWSYS)/windsys.c -o$@ CTAGSCMD = ctags CTAGSOPT = --language-force=c --sort=no -D"Bitfield(x,n)=unsigned x : n" --excmd=pattern $(U)sftags.exe: $(HLHACKLIB) $(OSFC)/sftags.o $(ld) $(LDFLAGS) -mwindows $(OSFC)/sftags.o $(HLHACKLIB) $(LIBS) -o$@ $(OSFC)/sftags.o: $(U)sftags.c $(HACK_H) | $(OSFC) $(cc) $(CFLAGSU) -c $(U)sftags.c -o$@ $(INCL)/sfproto.h: $(U)sf.tags $(U)sftags.exe $(U)sftags $(U)sfdata.c: $(U)sf.tags $(U)sftags.exe $(U)sftags # dependencies for sftags # CTAGDEP = $(INCL)/align.h $(INCL)/artifact.h $(SRC)/artifact.c \ $(INCL)/artilist.h $(INCL)/attrib.h $(SRC)/bones.c \ $(INCL)/context.h $(INCL)/coord.h $(INCL)/decl.h \ $(SRC)/decl.c $(INCL)/dungeon.h $(INCL)/engrave.h \ $(SRC)/engrave.c $(INCL)/flag.h $(INCL)/func_tab.h \ $(INCL)/global.h $(INCL)/hack.h $(INCL)/mextra.h \ $(INCL)/mkroom.h $(INCL)/monst.h $(INCL)/defsym.h \ $(INCL)/obj.h $(INCL)/objclass.h $(INCL)/prop.h \ $(INCL)/quest.h $(INCL)/rect.h $(INCL)/region.h \ $(INCL)/rm.h $(INCL)/skills.h $(INCL)/spell.h \ $(INCL)/stairs.h $(INCL)/sys.h $(INCL)/timeout.h \ $(INCL)/trap.h $(INCL)/you.h $(INCL)/wintype.h $(U)sf.tags: $(CTAGDEP) $(CTAGSCMD) $(CTAGSOPT) -f $@ $(INCL)/align.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/artifact.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)/artifact.c $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/artilist.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/attrib.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)/bones.c $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/context.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/coord.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/decl.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)/decl.c $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/dungeon.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/engrave.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(SRC)/engrave.c $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/flag.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/func_tab.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/global.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/hack.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/mextra.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/mkroom.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/monst.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/defsym.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/obj.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/objclass.h # $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/permonst.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/prop.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/quest.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/rect.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/region.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/rm.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/skills.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/spell.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/stairs.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/sys.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/timeout.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/trap.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/you.h $(CTAGSCMD) $(CTAGSOPT) -a -f $@ $(INCL)/wintype.h $(OSFC): @mkdir -p $@ CLEAN_DIR += $(OSFC) CLEAN_FILE += $(SFCTARGETS) $(SFCTOOLOBJS) $(U)sf.tags $(U)sfdata.c $(INCL)/sfproto.h #========================================== # Data librarian #========================================== ODLB = $(O)dlb DLBOBJS = $(addprefix $(ODLB)/, alloc.o dlb.o dlb_main.o panic.o) DAT_CLEAN = $(addprefix $(DAT)/, data oracles options porthelp rumors engrave epitaph bogusmon) DAT_NOCLEAN = $(addprefix $(DAT)/, help hh cmdhelp keyhelp history opthelp optmenu \ wizhelp license engrave epitaph bogusmon tribute) DLBLST = $(DAT)/dlb.lst DLB = $(GAMEDIR)/nhdat$(NHV) DTARGETS = $(U)dlb.exe $(DAT_CLEAN) $(DLBLST) $(DLB) dlb: $(DTARGETS) $(U)dlb.exe: $(DLBOBJS) $(HLHACKLIB) $(ld) $(LDFLAGS) $(HLHACKLIB) $^ -o$@ $(ODLB)/%.o: $(SRC)/%.c $(NHLUAH) | $(ODLB) $(cc) $(CFLAGSU) $< -o$@ $(ODLB)/%.o: $(U)%.c $(NHLUAH) | $(ODLB) $(cc) $(CFLAGSU) $< -o$@ $(ODLB): @mkdir -p $@ $(DAT)/data: $(U)makedefs.exe $(DAT)/data.base $< -d $(DAT)/oracles: $(U)makedefs.exe $(DAT)/oracles.txt $< -h $(DAT)/options $(INCL)/date.h: $(U)makedefs.exe $< -v $(DAT)/porthelp: $(MSWSYS)/porthelp cp $< $@ $(DAT)/rumors: $(U)makedefs.exe $(DAT)/rumors.tru $(DAT)/rumors.fal $< -r $(DAT)/engrave: $(DAT)/bogusmon $(DAT)/epitaph: $(DAT)/bogusmon $(DAT)/bogusmon: $(U)makedefs.exe $(DAT)/bogusmon.txt $(DAT)/engrave.txt $(DAT)/epitaph.txt $< -s $(DLBLST): $(LUAFILES) | $(DAT_CLEAN) $(DAT_NOCLEAN) echo data > $(DLBLST) echo oracles >> $(DLBLST) echo options >> $(DLBLST) if [ -f $(DAT)/ttyoptions ] ; then echo ttyoptions >> $(DLBLST) ; fi if [ -f $(DAT)/guioptions ] ; then echo guioptions >> $(DLBLST) ; fi echo porthelp >> $(DLBLST) echo rumors >> $(DLBLST) echo help >> $(DLBLST) echo hh >> $(DLBLST) echo cmdhelp >> $(DLBLST) echo keyhelp >> $(DLBLST) echo history >> $(DLBLST) echo opthelp >> $(DLBLST) echo optmenu >> $(DLBLST) echo wizhelp >> $(DLBLST) echo license >> $(DLBLST) echo engrave >> $(DLBLST) echo epitaph >> $(DLBLST) echo bogusmon >> $(DLBLST) echo tribute >> $(DLBLST) cd $(DAT) ; ls -1 *.lua >> $(DLBLST) $(DLB): $(U)dlb.exe $(DLBLST) | $(GAMEDIR) $(U)dlb.exe CcIf $(dir $(DLBLST)) $(notdir $(DLBLST)) $(SRC)/nhdat mv $(SRC)/nhdat$(NHV) $@ CLEAN_DIR += $(ODLB) CLEAN_FILE += $(DTARGETS) $(DLBOBJS) $(INCL)/date.h #============================================ # Fetching other source files that are needed #============================================ ifeq "$(INTERNET_AVAILABLE)" "Y" ifeq "$(GIT_AVAILABLE)" "Y" fetchlua: @if [ ! -f $(LUASRC)/lua.h ] ; then \ git submodule init ../submodules/lua && \ git submodule update ../submodules/lua ; fi # git submodule update --remote ../submodules/lua ; fi fetchpdcurses: @if [ ! -f $(PDCURSES_TOP)/curses.h ] ; then \ git submodule init ../submodules/$(PDCURSES) && \ git submodule update ../submodules/$(PDCURSES) ; fi # git submodule update --remote ../submodules/$(PDCURSES) ; fi else # GIT_AVAILABLE no CURLLUASRC=http://www.lua.org/ftp/lua-5.4.6.tar.gz CURLLUADST=lua-5.4.6.tar.gz CURLPDCSRC=https://github.com/Bill-Gray/PDCursesMod/archive/refs/tags/v4.5.1.zip CURLPDCDST=$(PDCURSES).zip fetchlua: @if [ ! -f $(LUASRC)/lua.h ] ; then \ mkdir -p ../lib ; \ cd ../lib ; \ curl -L $(CURLLUASRC) -o $(CURLLUADST) ; \ /c/Windows/System32/tar -xvf $(CURLLUADST) ; \ cd ../src ; \ fi fetchpdcurses: mkdir -p ../lib @if [ ! -f $(PDCURSES_TOP)/curses.h ] ; then \ cd ../lib ; \ curl -L $(CURLPDCSRC) -o $(CURLPDCDST) ; \ mkdir -p $(PDCURSES) ; \ /c/Windows/System32/tar -C $(PDCURSES) --strip-components=1 -xvf $(CURLPDCDST) ; \ cd ../src ; \ fi endif # GIT_AVAILABLE endif # INTERNET_AVAILABLE #========================================== # Soundlib Choices #========================================== SNDLIBCHOICES = $(strip $(SOUND_LIBRARIES)) # # windsound # WINDSOUND = $(findstring windsound, $(SNDLIBCHOICES)) ifeq "$(WINDSOUND)" "windsound" $(info Including windsound integration) SOUND_WINDSOUND=Y HAVE_SOUNDLIB=Y NEED_USERSOUNDS=Y NEED_SEAUTOMAP=Y NEED_WAV=Y #SOUNDLIBINCL += SOUNDLIBDEFS += -DSND_LIB_WINDSOUND SOUNDLIBOBJS += windsound #WINDSOUNDLIBDIR = #SOUNDLIBLIBS += #WINDSOUNDLIBDLL = #GAMEDIRDLLS += endif # # fmod # FMOD = $(findstring fmod, $(SNDLIBCHOICES)) ifeq "$(FMOD)" "fmod" $(info Including fmod integration) SOUND_FMOD=Y HAVE_SOUNDLIB=Y NEED_USERSOUNDS=Y NEED_SEAUTOMAP=Y NEED_WAV=Y FMODROOT = ../lib/fmod/api/core SOUNDLIBINCL += -I$(FMODROOT)/inc SOUNDLIBDEFS += -DSND_LIB_FMOD SOUNDLIBOBJS += fmod FMODLIBDIR = $(FMODROOT)/lib/$(arch) ifeq "$(arch)" "x86" SOUNDLIBLIBS += -L $(FMODLIBDIR) FMODLIBDLL = fmod_vc.dll SOUNDLIBLIBS += -lfmod else SOUNDLIBLIBS += -L $(FMODLIBDIR) FMODLIBDLL = fmod_vc.dll SOUNDLIBLIBS += $(FMODLIBDIR)/$(FMODLIBDLL) endif FMODDIR = ../sound/fmod GAMEDIRDLLS += $(GAMEDIR)/$(FMODLIBDLL) ifeq "$(arch)" "x86" FMODLINKLIB = $(FMODLIBDIR)/fmod_vc.lib else #x64 mingw32-x64 builds supposedly can link right with the DLL, no import lib FMODLINKLIB = $(FMODLIBDIR)/$(FMODLIBDLL) endif $(info ---------------------------------------------------------------------) $(info ** NOTES for fmod sound library integration **) $(info For fmod integration, this Makefile expects:) $(info fmod include directory : $(FMODROOT)/inc) $(info fmod library directory : $(FMODLIBDIR)) $(info fmod library to link with : $(FMODLINKLIB)) $(info fmod library dll : $(FMODLIBDIR)/$(FMODLIBDLL)) $(info ---------------------------------------------------------------------) FMOD_MISSING= ifeq (,$(wildcard $(FMODROOT)/inc)) FMOD_MISSING += $(FMODROOT)\inc $(info Error: missing $(FMODROOT)/inc) endif ifeq (,$(wildcard $(FMODLIBDIR))) FMOD_MISSING += $(FMODLIBDIR) $(info Error: missing $(FMODLIBDIR)) endif ifeq (,$(wildcard $(FMODLINKLIB))) FMOD_MISSING += $(FMODLINKLIB) $(info Error: missing $(FMODLINKLIB)) endif ifeq (,$(wildcard $(FMODLIBDIR)/$(FMODLIBDLL))) FMOD_MISSING += $(FMODLIBDIR)/$(FMODLIBDLL) $(info Error: missing $(FMODLIBDIR)/$(FMODLIBDLL)) endif ifneq "$(FMOD_MISSING)" "" $(error Error: Cannot proceed with fmod integration included) endif endif #========================================== # Soundlib Support #========================================== WAVLIST = se_squeak_A se_squeak_B se_squeak_B_flat se_squeak_C \ se_squeak_D se_squeak_D_flat se_squeak_E \ se_squeak_E_flat se_squeak_F se_squeak_F_sharp \ se_squeak_G se_squeak_G_sharp sound_Bell sound_Bugle_A \ sound_Bugle_B sound_Bugle_C sound_Bugle_D sound_Bugle_E \ sound_Bugle_F sound_Bugle_G sound_Drum_Of_Earthquake \ sound_Fire_Horn sound_Frost_Horn sound_Leather_Drum \ sound_Magic_Harp_A sound_Magic_Harp_B sound_Magic_Harp_C \ sound_Magic_Harp_D sound_Magic_Harp_E sound_Magic_Harp_F \ sound_Magic_Harp_G sound_Magic_Flute_A sound_Magic_Flute_B \ sound_Magic_Flute_C sound_Magic_Flute_D sound_Magic_Flute_E \ sound_Magic_Flute_F sound_Magic_Flute_G sound_Tooled_Horn_A \ sound_Tooled_Horn_B sound_Tooled_Horn_C sound_Tooled_Horn_D \ sound_Tooled_Horn_E sound_Tooled_Horn_F sound_Tooled_Horn_G \ sound_Wooden_Flute_A sound_Wooden_Flute_B sound_Wooden_Flute_C \ sound_Wooden_Flute_D sound_Wooden_Flute_E \ sound_Wooden_Flute_F sound_Wooden_Flute_G \ sound_Wooden_Harp_A sound_Wooden_Harp_B \ sound_Wooden_Harp_C sound_Wooden_Harp_D \ sound_Wooden_Harp_E sound_Wooden_Harp_F \ sound_Wooden_Harp_G sa2_xplevelup sa2_xpleveldown WAVS = $(addprefix $(SNDWAVDIR)/, $(addsuffix .wav, $(WAVLIST))) ifeq "$(HAVE_SOUNDLIB)" "Y" ifeq "$(NEED_USERSOUNDS)" "Y" SOUNDLIBDEFS += -DUSER_SOUNDS endif ifeq "$(NEED_SEAUTOMAP)" "Y" SOUNDLIBDEFS += -DSND_SOUNDEFFECTS_AUTOMAP endif ifeq "$(NEED_WAV)" "Y" $(info Built-in sound file integration included) #RCFLAGS = --include-dir=$(SNDWAVDIR) --define RCWAV WAV = $(WAVS) endif # NEED_WAV else $(info No soundlib integration) endif # HAVE_SOUNDLIB #========================================== # nethackw #========================================== COREOBJS = $(addsuffix .o, allmain alloc apply artifact attrib ball bones botl \ calendar cfgfiles cmd coloratt cppregex \ dbridge decl detect dig display dlb do do_name do_wear \ dog dogmove dokick dothrow drawing dungeon \ eat end engrave exper explode extralev files fountain \ getpos glyphs hack insight invent isaac64 light lock \ mail makemon mcastu mdlib mhitm mhitu minion mklev mkmap mkmaze mkobj mkroom \ mon mondata monmove monst mplayer mthrowu muse music \ nhlobj nhlsel nhlua windsound o_init objects objnam options \ pager pickup pline polyself potion pray priest quest questpgr \ random read rect region report restore rip rnd role rumors \ safeproc save sfbase sfstruct shk shknam sit selvar sounds sp_lev \ spell stairs steal steed strutil \ symbols sys teleport timeout topten track trap u_init uhitm utf8map \ vault version vision weapon were wield windmain windows windsys wizard \ wizcmds worm worn write zap $(SOUNDLIBOBJS)) CFLAGSW = $(CFLAGS) $(CFLAGSXTRA) $(SOUNDLIBINCL) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DSAFEPROCS -DNOTTYGRAPHICS $(SOUNDLIBDEFS) CPPFLAGSW = $(CFLAGS) $(CPPFLAGSXTRA) $(COMMONDEF) $(DLBFLG) -DTILES -D_WINDOWS -DMSWIN_GRAPHICS -DSAFEPROCS -DNOTTYGRAPHICS $(SOUNDLIBDEFS) ONHW = $(O)nethackw NHWONLY = $(addsuffix .o, mhaskyn mhdlg mhfont mhinput mhmain mhmap mhmenu \ mhmsgwnd mhrip mhsplash mhstatus mhtext mswproc tile NetHackW win10) NHWOBJS = $(addprefix $(ONHW)/, $(COREOBJS) $(NHWONLY)) DATEW_O = $(addsuffix .o, $(addprefix $(ONHW)/, date)) TILEFILES = $(addprefix $(WSHR)/, monsters.txt objects.txt other.txt) BMPS = $(addprefix $(MSWIN)/, $(addsuffix .bmp, mnsel mnselcnt mnunsel petmark pilemark rip splash tiles)) NHWRES = $(ONHW)/winres.o NHWTARGETS = $(GAMEDIR)/NetHackW.exe ifneq "$(PDCWINGUI)" "" CFLAGSW += $(NHCURSESFLAGS) NHWONLY += $(addsuffix .o, cursdial cursinit cursinvt cursmain cursmesg cursmisc cursstat curswins guitty) endif # uncomment for WINCHAIN #COREOBJS += $(addsuffix .o, wc_chainin wc_chainout wc_trace) # XXX mess for testing libbacktrace ifeq "$(CRASHREPORT)" "Y" CFLAGS += -I/mingw64/include -g -static -gdwarf LIBS += -L/mingw64/lib -lbacktrace endif nethackw: $(NHWTARGETS) $(GAMEDIR)/NetHackW.exe: $(NHWOBJS) $(NHWRES) $(DATEW_O) \ $(LUALIB) $(HLHACKLIB) $(PDCWLIB) | $(GAMEDIR) $(ld) $(LDFLAGS) -mwindows $^ $(HLHACKLIB) $(LIBS) -static -lstdc++ \ $(SOUNDLIBLIBS) -o$@ $(ONHW)/%.o: $(SRC)/%.c $(NHLUAH) | $(ONHW) $(cc) $(CFLAGSW) $< -o$@ # In NetHack 3.7, date.c must be recompiled after any other file is compiled, # otherwise the game internal build timestamp (and potentially git hash) # will not be accurate. # Therefore, date must not be included in COREOBJS (and by extension # NHWOBJS, NHWONLY). That allows those to be listed as explicit dependencies # to ensure that date.c is always recompiled again after anything else that # was just recompiled. date.h is not used in the build of NetHack 3.7. # $(ONHW)/date.o: $(SRC)/date.c $(NHWOBJS) | $(ONHW) $(cc) $(CFLAGSW) $(GITHASH) $(GITBRANCH) $(GITPREFIX) $< -o$@ $(ONHW)/cppregex.o: $(SSYS)/cppregex.cpp $(NHLUAH) | $(ONHW) $(cc) $(CPPFLAGSW) $< -o$@ $(ONHW)/%.o: $(SSYS)/%.c $(NHLUAH) | $(ONHW) $(cc) $(CFLAGSW) $< -o$@ ifeq "$(SOUND_WINDSOUND)" "Y" $(ONHW)/%.o: ../sound/windsound/%.c $(NHLUAH) | $(ONHW) $(cc) $(CFLAGSW) $< -o$@ endif ifeq "$(SOUND_FMOD)" "Y" $(ONHW)/%.o: ../sound/fmod/%.c $(NHLUAH) | $(ONHW) $(cc) $(CFLAGSW) $< -o$@ endif $(ONHW)/%.o: $(MSWSYS)/%.c $(NHLUAH) | $(ONHW) $(cc) $(CFLAGSW) $< -o$@ $(ONHW)/%.o: $(MSWIN)/%.c $(NHLUAH) | $(ONHW) $(cc) $(CFLAGSW) $< -o$@ $(ONHW)/%.o: $(WCHAIN)/%.c $(NHLUAH) | $(ONHW) $(cc) $(CFLAGSW) $< -o$@ $(ONHW)/%.o: $(WSHR)/%.c $(NHLUAH) | $(ONHW) $(cc) $(CFLAGSW) $< -o$@ $(ONHW)/%.o: $(WCURSES)/%.c $(NHLUAH) | $(ONHW) $(cc) $(CFLAGSW) $(PDCINCL) $< -o$@ $(NHWRES): $(MSWIN)/NetHackW.rc $(MSWIN)/NetHackW.exe.manifest \ $(BMPS) $(WAV) $(MSWIN)/NetHack.ico | $(ONHW) $(rc) --include-dir=$(MSWIN) $(RCFLAGS) -DVIA_MAKE --input=$< -o$@ $(MSWIN)/tiles.bmp: $(U)tile2bmp.exe $(TILEFILES) $< $@ $(MSWIN)/%.bmp: $(U)uudecode.exe $(MSWIN)/%.uu $^ mv $(notdir $@) $@ $(SNDWAVDIR)/%.wav: $(U)uudecode.exe $(SNDWAVDIR)/%.uu $^ mv $(notdir $@) $@ $(ONHW): @mkdir -p $@ CLEAN_DIR += $(ONHW) CLEAN_FILE += $(NHWTARGETS) $(NHWOBJS) $(NHWRES) $(BMPS) $(WAV) #========================================== # nethack #========================================== CFLAGSNH = $(CFLAGSU) $(CFLAGSXTRA) $(SOUNDLIBINCL) -DNO_TILE_C -DSAFEPROCS -D_LIB -DWIN32CON $(SOUNDLIBDEFS) CPPFLAGSNH = $(CFLAGSU) $(CPPFLAGSXTRA) -DNO_TILE_C -DSAFEPROCS -D_LIB -DWIN32CON $(SOUNDLIBDEFS) ONH = $(O)nethack NHONLY = consoletty.o getline.o topl.o wintty.o ifeq "$(ADD_CURSES)" "Y" NHCURSESFLAGS = -DCURSES_GRAPHICS -DCURSES_UNICODE $(PDCURSESFLAGS) -DPDC_NCMOUSE CFLAGSNH += $(NHCURSESFLAGS) NHONLY += $(addsuffix .o, cursdial cursinit cursinvt cursmain cursmesg cursmisc cursstat curswins) endif DATE_O = $(addsuffix .o, $(addprefix $(ONH)/, date)) NHOBJS = $(addprefix $(ONH)/, $(COREOBJS) $(NHONLY)) NHRES = $(ONH)/conres.o NHTARGET = $(GAMEDIR)/NetHack.exe nethack: $(NHTARGET) $(GAMEDIR)/NetHack.exe: $(NHOBJS) $(NHRES) $(DATE_O) $(LUALIB) $(PDCLIB) $(HLHACKLIB) \ $(SOUNDLIBLIBS) | $(GAMEDIR) $(ld) $(LDFLAGS) -mconsole $^ $(HLHACKLIB) $(LIBS) -static -lstdc++ -o$@ $(ONH)/%.o: $(SRC)/%.c $(NHLUAH) | $(ONH) $(cc) $(CFLAGSNH) $< -o$@ #========================================== # package #========================================== TARGET_CPU = x64 NHV=370 PKGFILES = nethackrc.template Guidebook.txt license NetHack.exe NetHack.txt \ NetHackW.exe opthelp nhdat370 record symbols sysconf.template FILESTOZIP = $(addprefix $(GAMEDIR)/, $(PKGFILES)) MAINZIP = $(PkgDir)/nethack-$(NHV)-win-$(TARGET_CPU)-msys2.zip package: binary $(FILESTOZIP) $(MAINZIP) @echo NetHack Windows package created: $(MAINZIP) $(MAINZIP): $(FILESTOZIP) | $(PkgDir) /c/Windows/System32/tar -a -cf $(MAINZIP) -C $(GAMEDIR) $(PKGFILES) @echo NetHack Windows package created: $(MAINZIP) $(PkgDir): @mkdir -p $@ CLEAN_DIR += $(PkgDir) CLEAN_FILE += $(MAINZIP) # In NetHack 3.7, date.c must be recompiled after any other file is compiled, # otherwise the game internal build timestamp (and potentially git hash) # will not be accurate. # Therefore, date must not be included in COREOBJS (and by extension # NHOBJS). That allows those to be listed as explicit dependencies of date.o # to ensure that date.c is always recompiled again after anything else that # was just recompiled. date.h is not used in the build of NetHack 3.7. # $(ONH)/date.o: $(SRC)/date.c $(NHOBJS) $(NHRES) | $(ONH) $(cc) $(CFLAGSNH) $(GITHASH) $(GITBRANCH) $(GITPREFIX) $< -o$@ $(ONH)/cppregex.o: $(SSYS)/cppregex.cpp $(NHLUAH) | $(ONH) $(cc) $(CPPFLAGSNH) $< -o$@ $(ONH)/%.o: $(SSYS)/%.c $(NHLUAH) | $(ONH) $(cc) $(CFLAGSNH) $< -o$@ ifeq "$(SOUND_WINDSOUND)" "Y" $(ONH)/%.o: ../sound/windsound/%.c $(NHLUAH) | $(ONH) $(cc) $(CFLAGSNH) $< -o$@ endif ifeq "$(SOUND_FMOD)" "Y" $(ONH)/%.o: ../sound/fmod/%.c $(NHLUAH) | $(ONH) $(cc) $(CFLAGSNH) $< -o$@ endif $(ONH)/%.o: $(MSWSYS)/%.c $(NHLUAH) | $(ONH) $(cc) $(CFLAGSNH) $< -o$@ $(ONH)/%.o: $(MSWIN)/%.c $(NHLUAH) | $(ONH) $(cc) $(CFLAGSNH) $< -o$@ $(ONH)/%.o: $(WCHAIN)/%.c $(NHLUAH) | $(ONH) $(cc) $(CFLAGSNH) $< -o$@ $(ONH)/%.o: $(WSHR)/%.c $(NHLUAH) | $(ONH) $(cc) $(CFLAGSNH) $< -o$@ $(ONH)/%.o: $(TTY)/%.c $(NHLUAH) | $(ONH) $(cc) $(CFLAGSNH) $< -o$@ $(ONH)/%.o: $(WCURSES)/%.c $(NHLUAH) | $(ONH) $(cc) $(CFLAGSNH) $(PDCINCL) $< -o$@ $(NHRES): $(MSWIN)/NetHack.rc $(WAV) $(MSWIN)/NetHack.ico | $(ONH) $(rc) --include-dir=$(MSWIN) $(RCFLAGS) --input=$< -o$@ $(ONH): @mkdir -p $@ CLEAN_DIR += $(ONH) CLEAN_FILE += $(NHTARGET) $(NHOBJS) $(NHRES) #========================================== #=============== TARGETS ================== #========================================== .PHONY: all clean default binary lua makedefs recover $(PDCURSES) $(PDCURSES)w \ tile2bmp tilemap uudecode dlb nethackw nethack tileutil \ fetchlua fetchpdcurses # # Everything # all: package TO_BINARY = $(GAMEDIR)/NetHack.exe $(RTARGETS) $(GAMEDIRDLLS) \ $(addprefix $(GAMEDIR)/, \ $(addsuffix .template, sysconf nethackrc symbols) \ Guidebook.txt NetHack.txt license opthelp record) ifeq "$(HAVE_SOUNDLIB)" "Y" TO_BINARY += $(addprefix $(GAMEDIR)/, $(addsuffix .wav, $(WAVLIST))) endif ifeq "$(USE_LUADLL)" "Y" TO_BINARY += $(LUADLL) endif ifneq "$(SKIP_NETHACKW)" "Y" TO_BINARY += $(GAMEDIR)/NetHackW.exe endif ifeq "$(USE_DLB)" "Y" TO_BINARY += $(DLB) endif binary: fetchlua fetchpdcurses $(TO_BINARY) ifdef CI_COMPILER ls -l $(SRC) ls -l $(DAT) ls -l $(UTIL) endif ifneq "$(USE_DLB)" "Y" cp $(DAT)/*.dat $(GAMEDIR)/ endif @echo NetHack is up to date. ifdef SOUND_FMOD $(GAMEDIR)/$(FMODLIBDLL): $(FMODLIBDIR)/$(FMODLIBDLL) cp $< $@ endif $(GAMEDIR)/symbols.template: $(DAT)/symbols cp $< $@ $(GAMEDIR)/NetHack.txt: $(DOC)/nethack.txt cp $< $@ $(GAMEDIR)/record: touch $@ $(GAMEDIR)/%: $(DAT)/% cp $< $@ $(GAMEDIR)/%: $(DOC)/% cp $< $@ $(GAMEDIR)/%: $(MSWSYS)/% cp $< $@ $(GAMEDIR)/%: $(SNDWAVDIR)/% cp $< $@ CLEAN_FILE += $(TO_BINARY) clean: @-rm -f $(CLEAN_FILE) @$(foreach dir, $(CLEAN_DIR), \ if [ -d $(dir) ] ; then rmdir -p --ignore $(dir) ; fi ; ) -include GNUmakefile.depend -include .depend # end of file