Files
nethack/sys/unix/Makefile.utl
2024-10-05 16:48:52 -04:00

448 lines
15 KiB
Makefile

# Makefile for NetHack's utility programs.
# NetHack 3.7 Makefile.utl $NHDT-Date: 1693334279 2023/08/29 18:37:59 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.68 $
# Copyright (c) 2018 by Robert Patrick Rankin
# NetHack may be freely redistributed. See license for details.
#
# Note: as of nethack 3.7, 'lev_comp' and 'dgn_comp' are no longer present
# so use of yacc and lex to build them is no longer required.
#
# Root of source tree:
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 'foo.o')
# MAKE = make
# NetHack 3.7 began introducing C99 code.
#
# If your compiler needs an appropriate switch to accept C99 code.
# CSTD = -std=c99
# if you are using gcc as your compiler,
# uncomment the CC definition below if it's not in your environment
# CC = gcc
#
# For Bull DPX/2 systems at B.O.S. 2.0 or higher use the following:
#
# CC = gcc -ansi -D_BULL_SOURCE -D_XOPEN_SOURCE -D_POSIX_SOURCE
#
# If you are using GCC 2.2.2 or higher on a DPX/2, just use:
#
# CC = gcc -ansi
#
# For HP/UX 10.20 with GCC:
# CC = gcc -D_POSIX_SOURCE
#
# if your make doesn't define a default SHELL properly, you may need
# the line below (Atari users will need a bourne work-alike)
# SHELL = /bin/sh
# for Atari
# SHELL=E:/GEMINI2/MUPFEL.TTP
# flags may have to be changed as required
# flags for 286 Xenix:
# CFLAGS = -Ml2t16 -O -LARGE -I../include
# LFLAGS = -Ml -F 4000 -SEG 512
# flags for 286 Microport SysV-AT
# CFLAGS = -DDUMB -Ml -I../include
# LFLAGS = -Ml
# flags for Atari GCC (3.2.1)
# CFLAGS = -O -I../include
# LFLAGS = -s
# flags for Atari GCC (3.3)
# CFLAGS = -mshort -O2 -I../include
# LFLAGS = -mshort -s
# flags for Apollos using their native cc
# (as long as it claims to be __STDC__ but isn't)
# CFLAGS = -DAPOLLO -O -I../include
# flags for AIX 3.1 cc on IBM RS/6000 to define
# a suitable subset of standard libraries
# (note that there is more info regarding the "-qchars=signed"
# switch in file Install.unx note 8)
# CFLAGS = -D_NO_PROTO -D_XOPEN_SOURCE -O -I../include -qchars=signed
# and for AIX 3.2:
# CFLAGS = -D_NO_PROTO -D_XOPEN_SOURCE -D_ALL_SOURCE -O -I../include -qchars=signed
# flags for A/UX 2.01 using native cc or c89
# gcc predefines AUX so that's not needed there
# CFLAGS = -ZS -D_POSIX_SOURCE -O -I../include -DAUX
# flags for IRIX 4.0.x using native cc
# SGI cc 3.10 will fail to compile makedefs with -O
# CFLAGS = -I../include -D__STDC__ -woff 100,293
# flags for Linux
# compile normally
# CFLAGS = -O2 -fomit-frame-pointer -I../include
# LFLAGS = -L/usr/X11R6/lib
# OR compile backwards compatible a.out format
# CFLAGS = -O2 -b i486-linuxaout -fomit-frame-pointer -I../include
# LFLAGS = -b i486-linuxaout -L/usr/X11R6/lib
# flags for BeOS using the command line
# BeOS on a Mac/BeBox:
#CC = mwcc
#CFLAGS = -I../include
# BeOS on Intel:
# the default values are fine
# flags for debugging:
# CFLAGS = -g -I../include
#CFLAGS = -O -I../include
#LFLAGS =
# -lm required by lua
LFLAGS += -lm
# we specify C preprocessor flags via CFLAGS; files built with default rules
# might include $(CPPFLAGS) which could get a value from user's environment;
# we avoid that by forcing it empty rather than by overriding default rules
CPPFLAGS =
LIBS =
OBJDIR = ../src
# if you change this to 1, feedback while building will omit -Dthis -Wthat
# -Isomewhere so that each file being compiled is listed on one short line;
# it requires support for '$<' in rules with more than one prerequisite
# (rather than just in suffix default rule), such as is implemented by
# gnu make and others which have picked up its extensions;
# allowed values are 0, 1, and empty (which behaves like 0)
QUIETCC=0
# TODO? the link/load commands below are handled differently from the ones
# in Makefile.src; these use '$(CC) $(LFLAGS)' and ought to be changed to use
# $(LD) or $(LINK) as appropriate [quiet mode echoes a misleading $< value]
# [LINK might be defined to use $(CXX); we don't want that here.]
CLINK=$(CC)
CXXLINK=$(CXX)
# ----------------------------------------
#
# Nothing below this line should have to be changed.
# Verbosity definitions, begin
# Set QUIETCC=1 above to output less feedback while building.
# CC and CXX obey verbosity, LD and LINK don't.
# AT is @ when not verbose, empty otherwise
ACTUAL_CC := $(CC)
ACTUAL_CXX := $(CXX)
ACTUAL_LD := $(LD)
ACTUAL_CLINK := $(CLINK)
CC_V0 = $(ACTUAL_CC)
CC_V = $(CC_V0)
CC_V1 = @echo "[CC] $<"; $(ACTUAL_CC)
CC = $(CC_V$(QUIETCC))
CXX_V0 = $(ACTUAL_CXX)
CXX_V = $(CXX_V0)
CXX_V1 = @echo "[CXX] $<"; $(ACTUAL_CXX)
CXX = $(CXX_V$(QUIETCC))
# LD and LINK might be based on invoking CC and may not be able to substitute
# for QUIETCC, so feedback from them is handled differently (via $AT)
LD = $(ACTUAL_LD)
CLINK = $(ACTUAL_CLINK)
AT_V0 :=
AT_V := $(AT_V0)
AT_V1 := @
AT = $(AT_V$(QUIETCC))
# Verbosity, end
# timestamps for primary header files, matching src/Makefile
CONFIG_H = ../src/config.h-t
HACK_H = ../src/hack.h-t
# utility .c files
MAKESRC = makedefs.c ../src/mdlib.c
RECOVSRC = recover.c
DLBSRC = dlb_main.c
UTILSRCS = $(MAKESRC) panic.c $(RECOVSRC) $(DLBSRC)
# files that define all monsters and objects
CMONOBJ = ../src/monst.c ../src/objects.c
OMONOBJ = $(OBJDIR)/monst.o $(OBJDIR)/objects.o
# files that provide access to NetHack's names
CNAMING = ../src/drawing.c $(CMONOBJ)
ONAMING = $(OBJDIR)/drawing.o $(OMONOBJ)
# dynamic memory allocation
CALLOC = ../src/alloc.c panic.c
OALLOC = $(OBJDIR)/alloc.o panic.o
# build time info
CDATE = ../src/date.c
ODATE = $(OBJDIR)/date.o
# hacklib utility routines
HACKLIB = $(OBJDIR)/hacklib.a
HACKLIBSRC = ../src/hacklib.c
HACKLIBOBJ = $(OBJDIR)/hacklib.o panic.o
# object files for makedefs
MAKEOBJS = makedefs.o $(OMONOBJ) $(ODATE) $(OALLOC)
# object files for recovery utility
RECOVOBJS = $(TARGETPFX)recover.o
# object files for the data librarian
DLBOBJS = dlb_main.o $(OBJDIR)/dlb.o $(OALLOC)
# Distinguish between the build tools for the native host
# and the build tools for the target environment in commands.
# This allows the same set of Makefiles to be used for native
# builds and for cross-compiles by overriding these in hints
# files or on the command line.
TARGETPFX=
TARGET_CC = $(CC)
TARGET_CFLAGS = $(CFLAGS) $(CSTD)
TARGET_CLINK = $(CLINK)
TARGET_LFLAGS = $(LFLAGS)
TARGET_CXX = $(CXX)
TARGET_CXXFLAGS = $(CXXFLAGS)
TARGET_AR = $(AR)
# dependencies for makedefs
#
makedefs: $(HACKLIB) $(MAKEOBJS) mdgrep.h
$(CLINK) $(LFLAGS) -o makedefs $(MAKEOBJS) $(HACKLIB)
# note: the headers listed here are maintained manually rather than via
# 'make depend'; only the ones which are directly included by
# makedefs.c are listed, without various nested ones that they include;
# for makedefs (but not for nethack's core), mdlib.c gets included
# rather than be compiled separately
makedefs.o: makedefs.c ../src/mdlib.c $(CONFIG_H) \
../include/permonst.h ../include/objclass.h \
../include/artilist.h ../include/dungeon.h ../include/obj.h \
../include/monst.h ../include/monsters.h ../include/objects.h \
../include/you.h ../include/context.h ../include/flag.h \
../include/dlb.h ../include/patchlevel.h mdgrep.h
$(CC) $(CFLAGS) $(CSTD) -c makedefs.c -o $@
$(OBJDIR)/hacklib.o: $(HACKLIBSRC)
# Don't require perl to build; that is why mdgrep.h is spelled wrong below.
mdgreph: mdgrep.pl
perl mdgrep.pl
# These are for reference purposes only. They aren't required in the build.
../include/onames.h: makedefs ../include/objects.h
./makedefs -o
../include/pm.h: makedefs ../include/monsters.h
./makedefs -p
lintdefs:
@lint -axbh -I../include -DLINT $(MAKESRC) $(CMONOBJ) | sed '/_flsbuf/d'
# we defer this makedefs call to the src Makefile, since it knows all about
# the main src and include files date.h is a timestamp for
../include/date.h::
@( cd ../src ; $(MAKE) ../include/date.h )
$(HACKLIB): $(CONFIG_H) $(HACKLIBSRC) panic.o
@( cd ../src ; $(MAKE) hacklib.a )
# support code used by several of the utility programs (but not makedefs)
panic.o: panic.c $(CONFIG_H)
$(CC) $(CFLAGS) $(CSTD) -c panic.c -o $@
# with all of extern.h's functions to complain about, we drown in
# 'defined but not used' without -u
lintdgn:
@lint -axhu -I../include -DLINT $(UTILSRCS) $(CALLOC) \
| sed '/_flsbuf/d'
# dependencies for recover
#
$(TARGETPFX)recover: $(RECOVOBJS) $(TARGETPFX)$(HACKLIB)
$(TARGET_CLINK) $(TARGET_LFLAGS) -o recover \
$(RECOVOBJS) $(TARGETPFX)$(HACKLIB) $(LIBS)
$(TARGETPFX)recover.o: recover.c $(CONFIG_H)
$(TARGET_CC) $(TARGET_CFLAGS) $(CSTD) -c recover.c -o $@
# dependencies for dlb
#
dlb: $(DLBOBJS) $(HACKLIB)
$(CLINK) $(LFLAGS) -o dlb $(DLBOBJS) $(HACKLIB) $(LIBS)
dlb_main.o: dlb_main.c $(CONFIG_H) ../include/dlb.h
$(CC) $(CFLAGS) $(CSTD) -c dlb_main.c -o $@
# dependencies for tile utilities
#
TEXT_IO = tiletext.o tiletxt.o $(OALLOC) $(ONAMING)
GIFREADERS = gifread.o
PPMWRITERS = ppmwrite.o
tileutils: tilemap gif2txt txt2ppm tile2x11
gif2txt: $(GIFREADERS) $(TEXT_IO)
$(CLINK) $(LFLAGS) -o gif2txt $(GIFREADERS) $(TEXT_IO) $(LIBS)
txt2ppm: $(PPMWRITERS) $(TEXT_IO)
$(CLINK) $(LFLAGS) -o txt2ppm $(PPMWRITERS) $(TEXT_IO) $(LIBS)
tile2x11: tile2x11.o $(TEXT_IO) $(HACKLIB)
$(CLINK) $(LFLAGS) -o tile2x11 tile2x11.o $(TEXT_IO) \
$(HACKLIB) $(LIBS)
tile2img.ttp: tile2img.o bitmfile.o $(TEXT_IO)
$(CLINK) $(LFLAGS) -o tile2img.ttp tile2img.o bitmfile.o \
$(TEXT_IO) $(LIBS)
tile2bmp: tile2bmp.o $(TEXT_IO) $(HACKLIB)
$(CLINK) $(LFLAGS) -o tile2bmp tile2bmp.o $(TEXT_IO) $(HACKLIB)
xpm2img.ttp: xpm2img.o bitmfile.o
$(CLINK) $(LFLAGS) -o xpm2img.ttp xpm2img.o bitmfile.o $(LIBS)
tile2beos: tile2beos.o $(TEXT_IO) $(HACKLIB)
$(CXXLINK) $(LFLAGS) -o tile2beos tile2beos.o \
$(TEXT_IO) $(HACKLIB) -lbe
#--compiling and linking in one step leaves extra debugging files (in their
# own subdirectories!) on OSX; compile and link separately to suppress
# that without mucking about with extra OS-specific CFLAGS and/or LFLAGS
#tilemap: ../win/share/tilemap.c $(HACK_H)
# $(CC) $(CFLAGS) $(LFLAGS) -o tilemap ../win/share/tilemap.c $(LIBS)
tilemap: tilemap.o $(OBJDIR)/objects.o $(OBJDIR)/monst.o $(OBJDIR)/drawing.o \
$(HACKLIB)
$(CLINK) $(LFLAGS) -o tilemap tilemap.o $(OBJDIR)/objects.o \
$(OBJDIR)/monst.o $(OBJDIR)/drawing.o $(HACKLIB) \
$(LIBS)
../src/tile.c: tilemap
./tilemap
tiletext.o: ../win/share/tiletext.c $(CONFIG_H) ../win/share/tile.h
$(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/share/tiletext.c -o $@
tiletxt.o: ../win/share/tiletxt.c ../win/share/tilemap.c $(HACK_H)
$(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/share/tiletxt.c -o $@
tilemap.o: ../win/share/tilemap.c $(HACK_H)
$(CC) $(CFLAGS) $(CSTD) -c ../win/share/tilemap.c -o $@
gifread.o: ../win/share/gifread.c $(CONFIG_H) ../win/share/tile.h
$(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/share/gifread.c -o $@
ppmwrite.o: ../win/share/ppmwrite.c $(CONFIG_H) ../win/share/tile.h
$(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/share/ppmwrite.c -o $@
tile2bmp.o: ../win/share/tile2bmp.c $(HACK_H) ../win/share/tile.h
$(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/share/tile2bmp.c -o $@
tile2x11.o: ../win/X11/tile2x11.c $(HACK_H) ../win/share/tile.h \
../include/tile2x11.h
$(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/X11/tile2x11.c -o $@
tile2img.o: ../win/gem/tile2img.c $(HACK_H) ../win/share/tile.h \
../include/bitmfile.h
$(CC) $(CFLAGS) $(CSTD) -I../win/share -c ../win/gem/tile2img.c -o $@
xpm2img.o: ../win/gem/xpm2img.c $(HACK_H) ../include/bitmfile.h
$(CC) $(CFLAGS) $(CSTD) -c ../win/gem/xpm2img.c -o $@
bitmfile.o: ../win/gem/bitmfile.c ../include/bitmfile.h
$(CC) $(CFLAGS) $(CSTD) -c ../win/gem/bitmfile.c -o $@
tile2beos.o: ../win/BeOS/tile2beos.cpp $(HACK_H) ../win/share/tile.h
$(CXX) $(CFLAGS) $(CSTD) -I../win/share -c ../win/BeOS/tile2beos.cpp -o $@
# note: tileedit.cpp was developed for Qt2 and will not compile using Qt5
tileedit.o: ../win/Qt/tileedit.cpp
$(CXX) -I../include -I$(QTDIR)/include ../win/Qt/tileedit.cpp
tileedit: tileedit.o $(TEXT_IO)
$(QTDIR)/bin/moc -o tileedit.moc tileedit.h
$(CXXLINK) -o tileedit -L$(QTDIR)/lib tileedit.o $(TEXT_IO) -lqt
uudecode: uudecode.o
$(CLINK) $(LFLAGS) -o uudecode uudecode.o $(LIBS)
uudecode.o: ../sys/share/uudecode.c
$(CC) $(CFLAGS) $(CSTD) -c -o uudecode.o ../sys/share/uudecode.c
# using dependencies like
# ../src/foo::
# @( cd ../src ; $(MAKE) foo )
# would always force foo to be up-to-date according to the src Makefile
# when it's needed here. Unfortunately, some makes believe this syntax
# means foo always changes, instead of foo should always be checked.
# therefore, approximate via config.h dependencies, and hope that anybody
# changing anything other than basic configuration also knows when not
# to improvise things not in the instructions, like 'make makedefs' here
# in util...
# make sure host object files from src are available when needed
# (note: these dependencies have been copied from Makefile.src so only come
# indirectly from 'make depend', hence are subject to bit rot as src changes)
$(OBJDIR)/alloc.o: ../src/alloc.c $(CONFIG_H) ../include/nhlua.h
$(CC) $(CFLAGS) $(CSTD) -c ../src/alloc.c -o $@
$(OBJDIR)/drawing.o: ../src/drawing.c $(CONFIG_H) ../include/color.h \
../include/rm.h ../include/objclass.h ../include/defsym.h \
../include/objects.h ../include/sym.h
$(CC) $(CFLAGS) $(CSTD) -c ../src/drawing.c -o $@
$(OBJDIR)/decl.o: ../src/decl.c $(HACK_H)
$(CC) $(CFLAGS) $(CSTD) -c ../src/decl.c -o $@
$(OBJDIR)/monst.o: ../src/monst.c $(CONFIG_H) ../include/permonst.h \
../include/align.h ../include/monattk.h ../include/monflag.h \
../include/monsters.h ../include/wintype.h ../include/sym.h \
../include/defsym.h ../include/color.h
$(CC) $(CFLAGS) $(CSTD) -c ../src/monst.c -o $@
$(OBJDIR)/objects.o: ../src/objects.c $(CONFIG_H) ../include/obj.h \
../include/prop.h ../include/skills.h ../include/color.h \
../include/objclass.h ../include/defsym.h ../include/objects.h
$(CC) $(CFLAGS) $(CSTD) -c ../src/objects.c -o $@
$(OBJDIR)/dlb.o: ../src/dlb.c $(CONFIG_H) ../include/dlb.h
$(CC) $(CFLAGS) $(CSTD) -c ../src/dlb.c -o $@
# this differs substantially from what Makefile.src specifies
$(OBJDIR)/date.o: ../src/date.c $(CONFIG_H)
$(CC) $(CFLAGS) $(CSTD) -c ../src/date.c -o $@
../include/nhlua.h:
@( cd .. ; $(MAKE) lua_support )
# make sure hack.h dependencies get transitive information
$(HACK_H): $(CONFIG_H)
@( cd ../src ; $(MAKE) $(HACK_H) )
$(CONFIG_H): ../include/config.h
@( cd ../src ; $(MAKE) $(CONFIG_H) )
SYSSHARE=../sys/share/
tags: $(UTILSRCS)
@ctags -tw $(UTILSRCS)
# note: 3.6 copied tile.h from win/share/ to include/ and if someone
# switches branches from 3.6 to 3.7 without executing 'make spotless'
# first, the old tile.h sticks around and gets found during compile
# instead of current one; various tile utilities won't build in that
# mis-configuration so allow 'make clean' and 'make spotless' in 3.7
# to fix things up by deleting the out of date file (if present)
clean-fixup:
-rm -f ../include/tile.h
clean: clean-fixup
-rm -f *.o
spotless: clean
-rm -f makedefs recover dlb $(HACKLIB)
-rm -f gif2txt txt2ppm tile2x11 tile2img.ttp xpm2img.ttp \
tilemap tileedit tile2bmp uudecode