Files
nethack/sys/windows/Makefile.mingw32
Pasi Kallinen d3e48dfad1 Tutorial: going down and up stairs
Adds the second tutorial level, tut-2.lua
2023-04-16 10:46:03 +03:00

1171 lines
33 KiB
Makefile

# NetHack 3.7 Makefile.mingw32
# 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 Makefile.mingw32:
# 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: install
#---------------------------------------------------------------
# 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 = N
#
#---------------------------------------------------------------
# Do you have a connection to the internet available that you want
# to utilize for obtaining prerequisite Lua source code and pdcurses source code
#
INTERNET_AVAILABLE = N
#
#---------------------------------------------------------------
# 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.#
# #
################################################
#
#==============================================================================
SKIP_NETHACKW = N
USE_LUADLL = Y
WANT_LUAC = N
ifndef LUA_VERSION
LUAVER=5.4.4
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
#
#==============================================================================
# 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)
ifdef GIT_HASH
GITHASH = -DNETHACK_GIT_SHA=\"$(GIT_HASH)\"
endif
ifdef GIT_BRANCH
GITBRANCH = -DNETHACK_GIT_BRANCH=\"$(GIT_BRANCH)\"
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)
# WSHR - Tile support files
# SNDSYS - sound suppport 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
WCURSES =../win/curses
WSHR =../win/share
QT =../win/Qt
SNDWAVDIR = ../sound/wav
#
# 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
ld = gcc
else
cc = gcc -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
else
CFLAGS += -DNDEBUG
LDFLAGS += -s
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 -Wno-missing-field-initializers -Wreturn-type \
-Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -pedantic \
-Wmissing-declarations -Wformat-nonliteral -Wunreachable-code \
-Wimplicit -Wimplicit-function-declaration -Wimplicit-int \
-Wmissing-prototypes -Wold-style-definition -Wstrict-prototypes
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 -luuid -lwinmm -lbcrypt
$(GAMEDIR):
@mkdir -p $@
$(OBJ):
@mkdir -p $@
CLEAN_DIR = $(GAMEDIR) $(OBJ)
#===============-=================================================
# LUA library
# Source from http://www.lua.org/ftp/lua-5.4.4.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 Makefile.mingw32 */" > $@
@echo "#include \"$(LUASRC)/lua.h\"" >> $@
@echo "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-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)))
#==========================================
# 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)
$(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
RTARGETS = $(GAMEDIR)/recover.txt $(GAMEDIR)/recover.exe
recover: $(RTARGETS)
$(GAMEDIR)/recover.txt: $(DOC)/recover.txt | $(GAMEDIR)
cp $< $@
$(GAMEDIR)/recover.exe: $(ROBJS) | $(GAMEDIR)
$(ld) $(LDFLAGS) $^ -o$@
$(OR)/recover.o: $(U)recover.c | $(OR)
$(cc) $(CFLAGSU) $< -o$@
# $(OR):
# @mkdir -p $@
CLEAN_FILE += $(RTARGETS) $(ROBJS)
#==========================================
# PDCurses
#==========================================
ifeq "$(ADD_CURSES)" "Y"
OP = $(O)pdcurses
PDCOBJS = $(addprefix $(OP)/, addch.o addchstr.o addstr.o attr.o beep.o bkgd.o border.o \
clear.o color.o debug.o delch.o deleteln.o getch.o getstr.o getyx.o \
inch.o inchstr.o initscr.o inopts.o insch.o insstr.o \
kernel.o keyname.o mouse.o move.o outopts.o overlay.o \
pad.o panel.o pdcclip.o pdcdisp.o pdcgetsc.o pdckbd.o pdcscrn.o pdcsetsc.o pdcutil.o printw.o \
refresh.o scanw.o scr_dump.o scroll.o slk.o termattr.o touch.o util.o window.o)
PDCSRC = $(PDCURSES_TOP)/pdcurses
PDCWINCON = $(PDCURSES_TOP)/wincon
PDCINCL = -I$(PDCURSES_TOP) -I$(PDCSRC) -I$(PDCWINCON)
PDCLIB = $(O)pdcurses.a
PDCDEP = $(PDCURSES_TOP)/curses.h
pdcurses: $(PDCLIB)
$(PDCLIB): $(PDCOBJS)
ar rcs $@ $^
$(OP)/%.o: $(PDCSRC)/%.c | $(OP)
$(cc) $(CFLAGS) $(PDCINCL) -D_LIB $< -o$@
$(OP)/%.o: $(PDCWINCON)/%.c | $(OP)
$(cc) $(CFLAGS) $(PDCINCL) -D_LIB $< -o$@
$(OP):
@mkdir -p $@
CLEAN_DIR += $(OP)
CLEAN_FILE += $(PDCLIB) $(PDCOBJS)
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)
$(ld) $(LDFLAGS) $^ -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)
$(ld) $(LDFLAGS) $^ -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)
#==========================================
# 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)
$(ld) $(LDFLAGS) $^ -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 --remote ../submodules/lua ; fi
fetchpdcurses:
@if [ ! -f $(PDCURSES_TOP)/curses.h ] ; then \
git submodule init ../submodules/pdcurses && \
git submodule update --remote ../submodules/pdcurses ; fi
else # GIT_AVAILABLE no
CURLLUASRC=http://www.lua.org/ftp/lua-5.4.4.tar.gz
CURLLUADST=lua-5.4.4.tar.gz
CURLPDCSRC=https://github.com/wmcbrine/PDCurses/archive/refs/tags/3.9.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 cmd 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 \
hack hacklib 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 restore rip rnd role rumors \
safeproc save sfstruct shk shknam sit sounds sp_lev spell steal steed \
symbols sys teleport timeout topten track trap u_init uhitm utf8map \
vault version vision weapon were wield windmain windows windsys wizard \
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
nethackw: $(NHWTARGETS)
$(GAMEDIR)/NetHackW.exe: $(NHWOBJS) $(NHWRES) $(DATEW_O) $(LUALIB) | $(GAMEDIR)
$(ld) $(LDFLAGS) -mwindows $^ $(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) $< -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: $(WSHR)/%.c $(NHLUAH) | $(ONHW)
$(cc) $(CFLAGSW) $< -o$@
$(NHWRES): $(MSWIN)/NetHackW.rc $(BMPS) $(WAV) $(MSWIN)/NetHack.ico | $(ONHW)
$(rc) --include-dir=$(MSWIN) $(RCFLAGS) --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"
CFLAGSNH += -DCURSES_GRAPHICS -DCHTYPE_32 -DPDC_NCMOUSE
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) $(SOUNDLIBLIBS) | $(GAMEDIR)
$(ld) $(LDFLAGS) -mconsole $^ $(LIBS) -static -lstdc++ -o$@
$(ONH)/%.o: $(SRC)/%.c $(NHLUAH) | $(ONH)
$(cc) $(CFLAGSNH) $< -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
# 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) $< -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: $(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 install lua makedefs recover pdcurses \
tile2bmp tilemap uudecode dlb nethackw nethack tileutil \
fetchlua fetchpdcurses
#
# Everything
#
all: install
TO_INSTALL = $(GAMEDIR)/NetHack.exe $(RTARGETS) $(GAMEDIRDLLS) \
$(addprefix $(GAMEDIR)/, $(addsuffix .template, sysconf .nethackrc) \
Guidebook.txt NetHack.txt license opthelp record symbols)
ifeq "$(HAVE_SOUNDLIB)" "Y"
TO_INSTALL += $(addprefix $(GAMEDIR)/, $(addsuffix .wav, $(WAVLIST)))
endif
ifeq "$(USE_LUADLL)" "Y"
TO_INSTALL += $(LUADLL)
endif
ifneq "$(SKIP_NETHACKW)" "Y"
TO_INSTALL += $(GAMEDIR)/NetHackW.exe
endif
ifeq "$(USE_DLB)" "Y"
TO_INSTALL += $(DLB)
endif
install: fetchlua fetchpdcurses $(TO_INSTALL)
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: $(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_INSTALL)
clean:
@-rm -f $(CLEAN_FILE)
@$(foreach dir, $(CLEAN_DIR), \
if [ -d $(dir) ] ; then rmdir -p --ignore $(dir) ; fi ; )
-include Makefile.mingw32.depend
-include .depend
# end of file