Files
nethack/sys/unix/Makefile.utl
nhmall b9b4755fe3 expand sys/unix Makefiles scope
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.
2020-09-28 16:25:31 -04:00

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