Expand the use of the sys/unix Makefiles to be used for both normal local builds and installs, as well as cross-compiles for other platforms/targets. Up until now, the primary unix Makefiles have treated util/host-side component compiles, links and target object files just the same as the game component compiles, links, and target object files. Unfortunately, that meant that cross-compile effort typically had to re-invent Makefiles specific to the cross-compile, creating a maintenance burden and deviation from the typical local unix build and providing a daunting obstacle to those that want to establish build for a target environment/platform. This change distinguishes between util/host-side component builds, links, and component builds and targets object files destined for the game (and other target platforms) in the Makefiles. In theory, this will ease the effort for people that want to try to resurrect NetHack perhaps on an old platform where it is no longer viable to build NetHack-3.7 on the platform itself using old, outdated compile tools, possibly with an old, outdated C dialect. Some details: - Game-related targets in the Makefiles (as opposed to util/host-side targets that will be executed on the host), which could be destined for another platform in a cross-compile scenario are prefixed with $(TARGETPFX) so that they are distinguished. The default scenario where no cross-compiler is involved, is to define TARGETPFX to nothing, and therefore meant to have no effect. - Game-related compile and link commands in the Makefiles and their associated command line flags are distinguished from util/host-side compile and link commands in the Makefiles by using $(TARGET_CC), $(TARGET_CFLAGS), $(TARGET_LINK), $(TARGET_LFLAGS), $(TARGET_CXX), $(TARGET_CXXFLAGS), $(TARGET_LIBS). Those are used in the Makefile in place of $(CC), $(CFLAGS), $(LINK), $(LFLAGS), $(CXX), $(CXXFLAGS), $(LIBS). The default scenario where no cross-compiler is involved, defines the TARGET_ version of those Makefile variables to match their typical non-TARGET_ ounterparts. - The dependency lists in the Makefiles includes the $(TARGETPFX) prefix for stuff that would potentially be produced from a cross-compile build. - It adds pregame targets and $(PREGAME) variable, so that hints files can add some additional stuff if required for a cross-compile scenario. The default scenario where no cross-compiler is involved doesn't do anything for $(PREGAME). - It adds $(BUILDMORE) target and variable, so that hints files can add some additional things to be built for a cross-compile scenario. - It adds a "package" target and $(PACKAGE) variable, so that hints files can add steps for the target platform in a cross-compile scenario. The "install" target assumes local build and placement and isn't really applicable to a cross-compile scenario where the results really just need to be bundled up for transport to the target platform. - Also, this adds a pair of include files that can be updated with some cross-compile recipes as they evolve. They are named "cross-pre.2020" (for stuff to be included in the PRE section) and "cross-post.2020" for stuff to be included in the POST section via sys/unix/setup.sh. Those are included in sys/unix/hints/linux.2020 and sys/unix/hints/macOS.2020 hints files.
388 lines
12 KiB
Makefile
388 lines
12 KiB
Makefile
# Makefile for NetHack's utility programs.
|
|
# NetHack 3.7 Makefile.utl $NHDT-Date: 1596498292 2020/08/03 23:44:52 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.51 $
|
|
# Copyright (c) 2018 by Robert Patrick Rankin
|
|
# NetHack may be freely redistributed. See license for details.
|
|
|
|
# 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
|
|
|
|
# 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]
|
|
|
|
# ----------------------------------------
|
|
#
|
|
# 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_LINK := $(LINK)
|
|
|
|
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)
|
|
LINK = $(ACTUAL_LINK)
|
|
|
|
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 $(DGNCOMPSRC) $(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
|
|
|
|
# object files for makedefs
|
|
MAKEOBJS = makedefs.o $(OMONOBJ)
|
|
|
|
# object files for recovery utility
|
|
RECOVOBJS = 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)
|
|
TARGET_LINK = $(LINK)
|
|
TARGET_LFLAGS = $(LFLAGS)
|
|
TARGET_CXX = $(CXX)
|
|
TARGET_CXXFLAGS = $(CXXFLAGS)
|
|
|
|
# dependencies for makedefs
|
|
#
|
|
makedefs: $(MAKEOBJS) mdgrep.h
|
|
$(LINK) $(LFLAGS) -o makedefs $(MAKEOBJS)
|
|
|
|
makedefs.o: makedefs.c ../src/mdlib.c $(CONFIG_H) ../include/permonst.h \
|
|
../include/objclass.h ../include/monsym.h \
|
|
../include/artilist.h ../include/dungeon.h ../include/obj.h \
|
|
../include/monst.h ../include/you.h ../include/flag.h \
|
|
../include/dlb.h ../include/patchlevel.h
|
|
$(CC) $(CFLAGS) -c makedefs.c -o $@
|
|
|
|
# Don't require perl to build; that is why mdgrep.h is spelled wrong below.
|
|
mdgreph: mdgrep.pl
|
|
perl mdgrep.pl
|
|
|
|
../include/onames.h: makedefs
|
|
./makedefs -o
|
|
../include/pm.h: makedefs
|
|
./makedefs -p
|
|
../include/vis_tab.h: makedefs
|
|
./makedefs -z
|
|
# makedefs -z makes both vis_tab.h and vis_tab.c, but writes the .h first
|
|
../src/vis_tab.c: ../include/vis_tab.h
|
|
|
|
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 )
|
|
|
|
# support code used by several of the utility programs (but not makedefs)
|
|
panic.o: panic.c $(CONFIG_H)
|
|
$(CC) $(CFLAGS) -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 $(DGNCOMPSRC) $(CALLOC) | sed '/_flsbuf/d'
|
|
|
|
|
|
# dependencies for recover
|
|
#
|
|
recover: $(RECOVOBJS)
|
|
$(LINK) $(LFLAGS) -o recover $(RECOVOBJS) $(LIBS)
|
|
|
|
recover.o: recover.c $(CONFIG_H) ../include/date.h
|
|
|
|
|
|
# dependencies for dlb
|
|
#
|
|
dlb: $(DLBOBJS)
|
|
$(CC) $(LFLAGS) -o dlb $(DLBOBJS) $(LIBS)
|
|
|
|
dlb_main.o: dlb_main.c $(CONFIG_H) ../include/dlb.h ../include/date.h
|
|
$(CC) $(CFLAGS) -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)
|
|
$(LINK) $(LFLAGS) -o gif2txt $(GIFREADERS) $(TEXT_IO) $(LIBS)
|
|
txt2ppm: $(PPMWRITERS) $(TEXT_IO)
|
|
$(LINK) $(LFLAGS) -o txt2ppm $(PPMWRITERS) $(TEXT_IO) $(LIBS)
|
|
|
|
tile2x11: tile2x11.o $(TEXT_IO)
|
|
$(LINK) $(LFLAGS) -o tile2x11 tile2x11.o $(TEXT_IO) $(LIBS)
|
|
|
|
tile2img.ttp: tile2img.o bitmfile.o $(TEXT_IO)
|
|
$(LINK) $(LFLAGS) -o tile2img.ttp tile2img.o bitmfile.o $(TEXT_IO) $(LIBS)
|
|
|
|
tile2bmp: tile2bmp.o $(TEXT_IO)
|
|
$(LINK) $(LFLAGS) -o tile2bmp tile2bmp.o $(TEXT_IO)
|
|
|
|
xpm2img.ttp: xpm2img.o bitmfile.o
|
|
$(LINK) $(LFLAGS) -o xpm2img.ttp xpm2img.o bitmfile.o $(LIBS)
|
|
|
|
tile2beos: tile2beos.o $(TEXT_IO)
|
|
$(LINK) $(LFLAGS) -o tile2beos tile2beos.o $(TEXT_IO) -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
|
|
$(LINK) $(LFLAGS) -o tilemap tilemap.o $(LIBS)
|
|
../src/tile.c: tilemap
|
|
./tilemap
|
|
|
|
../include/tile.h: ../win/share/tile.h
|
|
cp ../win/share/tile.h ../include/tile.h
|
|
tiletext.o: ../win/share/tiletext.c $(CONFIG_H) ../include/tile.h
|
|
$(CC) $(CFLAGS) -c ../win/share/tiletext.c -o $@
|
|
tiletxt.c: ./Makefile
|
|
@echo '/* alternate compilation for tilemap.c to create tiletxt.o' > tiletxt.c
|
|
@echo ' that does not rely on "cc -c -o tiletxt.o tilemap.c"' >> tiletxt.c
|
|
@echo ' since many pre-POSIX compilers did not support that */' >> tiletxt.c
|
|
echo '#define TILETEXT' >> tiletxt.c
|
|
echo '#include "../win/share/tilemap.c"' >> tiletxt.c
|
|
@echo '/*tiletxt.c*/' >> tiletxt.c
|
|
tiletxt.o: tiletxt.c ../win/share/tilemap.c $(HACK_H)
|
|
$(CC) $(CFLAGS) -c tiletxt.c -o $@
|
|
tilemap.o: ../win/share/tilemap.c $(HACK_H)
|
|
$(CC) $(CFLAGS) -c ../win/share/tilemap.c -o $@
|
|
|
|
gifread.o: ../win/share/gifread.c $(CONFIG_H) ../include/tile.h
|
|
$(CC) $(CFLAGS) -c ../win/share/gifread.c -o $@
|
|
ppmwrite.o: ../win/share/ppmwrite.c $(CONFIG_H) ../include/tile.h
|
|
$(CC) $(CFLAGS) -c ../win/share/ppmwrite.c -o $@
|
|
|
|
tile2bmp.o: ../win/share/tile2bmp.c $(HACK_H) ../include/tile.h
|
|
$(CC) $(CFLAGS) -c ../win/share/tile2bmp.c -o $@
|
|
|
|
tile2x11.o: ../win/X11/tile2x11.c $(HACK_H) ../include/tile.h \
|
|
../include/tile2x11.h
|
|
$(CC) $(CFLAGS) -c ../win/X11/tile2x11.c -o $@
|
|
|
|
tile2img.o: ../win/gem/tile2img.c $(HACK_H) ../include/tile.h \
|
|
../include/bitmfile.h
|
|
$(CC) $(CFLAGS) -c ../win/gem/tile2img.c -o $@
|
|
xpm2img.o: ../win/gem/xpm2img.c $(HACK_H) ../include/bitmfile.h
|
|
$(CC) $(CFLAGS) -c ../win/gem/xpm2img.c -o $@
|
|
bitmfile.o: ../win/gem/bitmfile.c ../include/bitmfile.h
|
|
$(CC) $(CFLAGS) -c ../win/gem/bitmfile.c -o $@
|
|
|
|
tile2beos.o: ../win/BeOS/tile2beos.cpp $(HACK_H) ../include/tile.h
|
|
$(CXX) $(CFLAGS) -c ../win/BeOS/tile2beos.cpp -o $@
|
|
|
|
tileedit: tileedit.cpp $(TEXT_IO)
|
|
$(QTDIR)/bin/moc -o tileedit.moc tileedit.h
|
|
$(CC) -o tileedit -I../include -I$(QTDIR)/include -L$(QTDIR)/lib \
|
|
tileedit.cpp $(TEXT_IO) -lqt
|
|
|
|
# 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
|
|
$(OBJDIR)/alloc.o: ../src/alloc.c $(CONFIG_H)
|
|
$(CC) $(CFLAGS) -c ../src/alloc.c -o $@
|
|
$(OBJDIR)/drawing.o: ../src/drawing.c $(CONFIG_H)
|
|
$(CC) $(CFLAGS) -c ../src/drawing.c -o $@
|
|
$(OBJDIR)/decl.o: ../src/decl.c $(CONFIG_H)
|
|
$(CC) $(CFLAGS) -c ../src/decl.c -o $@
|
|
$(OBJDIR)/monst.o: ../src/monst.c $(CONFIG_H)
|
|
$(CC) $(CFLAGS) -c ../src/monst.c -o $@
|
|
$(OBJDIR)/objects.o: ../src/objects.c $(CONFIG_H)
|
|
$(CC) $(CFLAGS) -c ../src/objects.c -o $@
|
|
$(OBJDIR)/dlb.o: ../src/dlb.c $(CONFIG_H) ../include/dlb.h
|
|
$(CC) $(CFLAGS) -c ../src/dlb.c -o $@
|
|
|
|
# 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)
|
|
|
|
clean:
|
|
-rm -f *.o
|
|
|
|
spotless: clean
|
|
-rm -f ../include/tile.h tiletxt.c
|
|
-rm -f makedefs recover dlb
|
|
-rm -f gif2txt txt2ppm tile2x11 tile2img.ttp xpm2img.ttp \
|
|
tilemap tileedit tile2bmp
|