1#	NetHack Makefile (VMS) - for utility programs.
2#	NetHack 3.6	Makefile.utl	$NHDT-Date: 1542388602 2018/11/16 17:16:42 $	$NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.16 $
3# Copyright (c) 2011 by Robert Patrick Rankin
4# NetHack may be freely redistributed.  See license for details.
5
6#  Copy this file to [.util]Makefile. and then edit it as needed.
7#  The default configuration is for building with DEC C (aka Compaq C).
8#  Settings for CC and CFLAGS ought to match the ones used in [.src]Makefile.
9
10MAKE	= $(MMS)
11CD	= set default
12ECHO	= write sys$output
13MOVE	= rename/New		# within same device only
14MUNG	= search/Exact/Match=NOR	# to strip bogus #module directives
15NOOP	= continue
16RM	= delete/noConfirm
17RUN	= mcr			# simplest way to pass command line args
18TOUCH	= append/New _NLA0:	# only one file per $(TOUCH)
19# source tree, relative to 'src' and 'util'
20DAT = [-.dat]
21INC = [-.include]
22SYSSHR = [-.sys.share]
23SRC = [-.src]
24UTL = [-.util]
25VMS = [-.sys.vms]
26WINSHR = [-.win.share]
27WINX11 = [-.win.X11]
28# targets, with enough punctuation to keep MCR and DELETE happy
29MAKEDEFS= $(UTL)makedefs.exe;
30LEVCOMP = $(UTL)lev_comp.exe;
31DGNCOMP = $(UTL)dgn_comp.exe;
32DLB	= $(UTL)dlb.exe;
33RECOVER = $(UTL)recover.exe;
34# used by $(DAT)Makefile for synchronization
35MARKER	= $(UTL)util.timestamp;
36
37# if you are using gcc as your compiler,
38#	uncomment the CC definition below if it's not in your environment
39# CC = gcc
40
41CFLAGS	= /Prefix=All/Incl=$(INC)/noList	# DECC in native mode
42#CFLAGS	= /Include=$(INC)/noList	# VAXC or GNUC
43LFLAGS	= /noMap
44LIBS	= $(SRC)crtl.opt/Options,$(SRC)ident.opt/Options  # run-time library
45LINK	= link
46
47# If you don't have yacc, byacc, or bison or just don't want to run any of
48#	them, then make target "no_yacc" before trying to build lev_comp
49#	or dgn_comp.  You won't be able to modify *_comp.y though.
50# If you don't have lex or flex, then make target "no_lex" and leave
51#	*_comp.l alone.  $(VMS)lev_lex.h will be used to work-around some
52#	suspect code included in the distributed copies of *_lex.c.
53# If you do either of the above, the corresponding value of YACC and/or LEX
54#	below won't matter.
55#
56# Note:  VMS POSIX V1.1 lex and yacc generate code which contains an
57#	invalid #module directive; it order to prevent warnings for CC or
58#	choking by GCC, the SEARCH command is used in an attempt to strip
59#	then out.  Otherwise MMS would quit when making the affected targets.
60#	Each "munged" copy should be identical to its original if no #module
61#	directives are present.
62#
63# yacc/lex programs to use to generate *_comp.c, *_comp.h, and *_lex.c.
64# choose xxxOUT that matches xxx tool's output
65YACC	= bison /Define
66LEX	= flex
67#YACC	= yacc -d
68#LEX	= lex
69#YACC	= posix/Run posix$bin:yacc. "-d
70#LEX	= posix/Run posix$bin:lex. "
71# blank means foo.y -> foo_tab.c & foo_tab.h
72YACCOUT =		# bison
73#YACCOUT = ytab		# VMS POSIX
74#YACCOUT = y_tab	# DEC/Shell
75LEXOUT	= lexyy		# flex
76#LEXOUT  = lex_yy	# VMS POSIX
77
78
79# Nothing below this line should have to be changed.
80
81# linker options files
82LIBOPT	= $(SRC)crtl.opt;
83ID_OPT	= $(SRC)ident.opt;
84
85# timestamps for primary header files, matching src/Makefile
86CONFIG_H = $(SRC)config.h-t
87HACK_H   = $(SRC)hack.h-t
88
89# utility .c files
90MAKESRC    = makedefs.c
91SPLEVSRC   = lev_yacc.c lev_lex.c lev_main.c
92DGNCOMPSRC = dgn_yacc.c dgn_lex.c dgn_main.c
93RECOVSRC   = recover.c
94DLBSRC	   = dlb_main.c
95UTILSRCS   = $(MAKESRC) $(SPLEVSRC) $(DGNCOMPSRC) $(RECOVSRC) $(DLBSRC) panic.c
96
97VMSOBJS = $(SRC)vmsmisc.obj,$(SRC)vmsfiles.obj
98
99# object files that provide access to NetHack's names
100NAMEOBJ1 = $(SRC)monst.obj,$(SRC)objects.obj
101NAMEOBJ2 = $(SRC)drawing.obj,$(SRC)decl.obj
102NAMEOBJS = $(NAMEOBJ1),$(NAMEOBJ2)
103
104# object files for makedefs
105MAKEOBJS = makedefs.obj,$(NAMEOBJ1)
106
107# object files for special levels compiler
108SPLEVOBJS = lev_main.obj,lev_yacc.obj,lev_lex.obj,panic.obj,\
109	    $(SRC)alloc.obj,$(NAMEOBJS)
110
111# object files for dungeon compiler
112DGNCOMPOBJS = dgn_main.obj,dgn_yacc.obj,dgn_lex.obj,panic.obj,$(SRC)alloc.obj
113
114# object files for recovery utility
115RECOVOBJS = recover.obj
116
117# object files for dlb utility
118DLBOBJS = dlb_main.obj,panic.obj,$(SRC)alloc.obj,$(SRC)dlb.obj
119
120
121#	fake target
122default :
123      @ $(ECHO) "Oops!  No target(s) specified...."
124
125all	: $(MAKEDEFS) $(LEVCOMP) $(DGNCOMP) $(RECOVER) $(DLB)
126      @ $(ECHO) "util is up to date."
127
128#	special targets for folks without yacc/bison and or lex/flex
129no_yacc :
130	copy $(SYSSHR)%%%_yacc.c $(UTL)
131	copy $(SYSSHR)%%%_comp.h $(INC)
132      @ $(ECHO) "distributed yacc output (*_yacc.c) copied into place"
133no_lex :
134	copy $(SYSSHR)%%%_lex.c $(UTL)
135	copy $(VMS)lev_lex.h $(UTL)
136      @ $(ECHO) "distributed lex output (*_lex.c) copied into place"
137
138#	alternate target names for possible interactive use
139makedefs : $(MAKEDEFS)
140      @ $(ECHO) "makedefs is up to date."
141lev_comp : $(LEVCOMP)
142      @ $(ECHO) "lev_comp is up to date."
143dgn_comp : $(DGNCOMP)
144      @ $(ECHO) "dgn_comp is up to date."
145recover  : $(RECOVER)
146      @ $(ECHO) "recover is up to date."
147dlb	 : $(DLB)
148      @ $(ECHO) "dlb is up to date."
149
150$(LIBOPT) : $(SRC)Makefile.;		# linker options file
151	$(CD) $(SRC)
152	$(MAKE)$(MAKEFLAGS) $(LIBOPT)
153      @ $(CD) $(UTL)
154
155$(ID_OPT) : $(SRC)Makefile.;		# linker options file
156	$(CD) $(SRC)
157	$(MAKE)$(MAKEFLAGS) $(ID_OPT)
158      @ $(CD) $(UTL)
159
160#	dependencies for makedefs
161#
162$(MAKEDEFS) :	$(MAKEOBJS) $(VMSOBJS) $(LIBOPT) $(ID_OPT)
163	$(LINK) $(LFLAGS) $(MAKEOBJS),$(VMSOBJS),$(LIBS)
164      @ $(TOUCH) $(MARKER)
165
166makedefs.obj :	makedefs.c \
167		$(CONFIG_H) $(INC)permonst.h $(INC)objclass.h \
168		$(INC)monsym.h $(INC)artilist.h $(INC)dungeon.h \
169		$(INC)obj.h $(INC)monst.h $(INC)you.h $(INC)flag.h \
170		$(INC)dlb.h $(INC)patchlevel.h $(INC)qtext.h
171
172$(INC)onames.h	: $(MAKEDEFS)
173	$(RUN) $(MAKEDEFS) -o
174$(INC)pm.h	: $(MAKEDEFS)
175	$(RUN) $(MAKEDEFS) -p
176# both vis_tab.h and vis_tab.c are made at the same time by makedefs -z
177$(INC)vis_tab.h : $(SRC)vis_tab.c
178	$(TOUCH) $(INC)vis_tab.h
179$(SRC)vis_tab.c : $(MAKEDEFS)
180	$(RUN) $(MAKEDEFS) -z
181
182# the src Makefile is responsible for knowing when to call this, since
183# it knows all about the main src and include files
184$(INC)date.h :	$(MAKEDEFS)
185	$(RUN) $(MAKEDEFS) -v
186
187
188#	dependencies for lev_comp
189#
190$(LEVCOMP) : $(SPLEVOBJS) $(VMSOBJS) $(LIBOPT) $(ID_OPT)
191	$(LINK)/Exe=$(LEVCOMP) $(LFLAGS) $(SPLEVOBJS),$(VMSOBJS),$(LIBS)
192
193lev_yacc.obj : $(HACK_H) $(INC)sp_lev.h lev_yacc.c
194	$(CC) $(CFLAGS) lev_yacc.c
195lev_lex.obj  : $(HACK_H) $(INC)lev_comp.h $(INC)sp_lev.h lev_lex.c
196	@ if f$search("lev_lex.h").nes."" then	$(MOVE) lev_lex.h stdio.h
197	$(CC) $(CFLAGS) lev_lex.c
198	@ if f$search("stdio.h").nes."" then  $(MOVE) stdio.h lev_lex.h
199lev_main.obj : $(HACK_H) $(INC)sp_lev.h $(INC)tcap.h $(INC)date.h lev_main.c
200	$(CC) $(CFLAGS) lev_main.c
201panic.obj    : $(CONFIG_H)
202	$(CC) $(CFLAGS) panic.c
203
204$(INC)lev_comp.h : lev_yacc.c
205	$(TOUCH) $(INC)lev_comp.h
206
207lev_yacc.c : lev_comp.y
208	$(YACC) lev_comp.y
209	$(MUNG) 'f$parse("$(YACCOUT)","lev_comp_tab.c")' "#module" /Outp=lev_yacc.c
210	@ if f$search("''f$parse("$(YACCOUT)","lev_comp_tab.c")'").nes."" then \
211		$(RM) 'f$parse("$(YACCOUT)","lev_comp_tab.c")'
212	$(MOVE) 'f$parse("$(YACCOUT)","lev_comp_tab.h")' $(INC)lev_comp.h
213
214lev_lex.c : lev_comp.l
215	$(LEX) lev_comp.l
216	$(MUNG) 'f$parse("$(LEXOUT)","lev_comp_lex.c")' "#module" /Outp=lev_lex.c
217	@ if f$search("''f$parse("$(LEXOUT)","lev_comp_lex.c")'").nes."" then \
218		$(RM) 'f$parse("$(LEXOUT)","lev_comp_lex.c")'
219
220
221#	dependencies for dgn_comp
222#
223$(DGNCOMP) : $(DGNCOMPOBJS) $(VMSOBJS) $(LIBOPT) $(ID_OPT)
224	$(LINK)/Exe=$(DGNCOMP) $(LFLAGS) $(DGNCOMPOBJS),$(VMSOBJS),$(LIBS)
225
226dgn_yacc.obj : $(CONFIG_H) $(INC)dgn_file.h $(INC)date.h dgn_yacc.c
227	$(CC) $(CFLAGS) dgn_yacc.c
228dgn_lex.obj  : $(CONFIG_H) $(INC)dgn_comp.h $(INC)dgn_file.h dgn_lex.c
229	@ if f$search("lev_lex.h").nes."" then	$(MOVE) lev_lex.h stdio.h
230	$(CC) $(CFLAGS) dgn_lex.c
231	@ if f$search("stdio.h").nes."" then  $(MOVE) stdio.h lev_lex.h
232dgn_main.obj : $(CONFIG_H) dgn_main.c
233	$(CC) $(CFLAGS) dgn_main.c
234
235$(INC)dgn_comp.h : dgn_yacc.c
236	$(TOUCH) $(INC)dgn_comp.h
237
238dgn_yacc.c : dgn_comp.y
239	$(YACC) dgn_comp.y
240	$(MUNG) 'f$parse("$(YACCOUT)","dgn_comp_tab.c")' "#module" /Outp=dgn_yacc.c
241	@ if f$search("''f$parse("$(YACCOUT)","dgn_comp_tab.c")'").nes."" then \
242		$(RM) 'f$parse("$(YACCOUT)","dgn_comp_tab.c")'
243	$(MOVE) 'f$parse("$(YACCOUT)","dgn_comp_tab.h")' $(INC)dgn_comp.h
244
245dgn_lex.c : dgn_comp.l
246	$(LEX) dgn_comp.l
247	$(MUNG) 'f$parse("$(LEXOUT)","dgn_comp_lex.c")' "#module" /Outp=dgn_lex.c
248	@ if f$search("''f$parse("$(LEXOUT)","dgn_comp_lex.c")'").nes."" then \
249		$(RM) 'f$parse("$(LEXOUT)","dgn_comp_lex.c")'
250
251
252#	dependencies for recover
253#
254$(RECOVER) : $(RECOVOBJS) $(VMSOBJS) $(LIBOPT) $(ID_OPT)
255	$(LINK) $(LFLAGS) $(RECOVOBJS),$(VMSOBJS),$(LIBS)
256
257recover.obj : $(CONFIG_H) recover.c
258
259#	dependencies for dlb
260#
261$(DLB) : $(DLBOBJS) $(VMSOBJS) $(LIBOPT) $(ID_OPT)
262	$(LINK)/Exe=$(DLB) $(LFLAGS) $(DLBOBJS),$(VMSOBJS),$(LIBS)
263
264dlb_main.obj : $(CONFIG_H) $(INC)dlb.h dlb_main.c
265
266#	dependencies and build rules for tile utilities
267#
268TILEMAP    = $(UTL)tilemap.exe;
269GIF2TXT    = $(UTL)gif2txt.exe;
270TXT2PPM    = $(UTL)txt2ppm.exe;
271TILE2X11   = $(UTL)tile2x11.exe;
272TILEUTILS  = $(TILEMAP),$(GIF2TXT),$(TXT2PPM),$(TILE2X11)
273TEXTIO	   = $(UTL)tiletxt.obj,tiletext.obj,$(NAMEOBJS),$(SRC)vmsmisc.obj
274GIFREADERS = gifread.obj,panic.obj,$(SRC)alloc.obj
275PPMWRITERS = ppmwrite.obj,panic.obj,$(SRC)alloc.obj
276
277tileutils : $(TILEUTILS)
278	@ $(NOOP)
279
280$(GIF2TXT) : $(GIFREADERS) $(TEXTIO) $(LIBOPT) $(ID_OPT)
281	$(LINK)/Exe=$(GIF2TXT) $(LFLAGS) $(GIFREADERS),$(TEXTIO),$(LIBS)
282$(TXT2PPM) : $(PPMWRITERS) $(TEXTIO) $(LIBOPT) $(ID_OPT)
283	$(LINK)/Exe=$(TXT2PPM) $(LFLAGS) $(PPMWRITERS),$(TEXTIO),$(LIBS)
284$(TILE2X11) : tile2x11.obj $(TEXTIO) $(LIBOPT) $(ID_OPT)
285	$(LINK) $(LFLAGS) tile2x11.obj,$(TEXTIO),$(LIBS)
286$(TILEMAP) : tilemap.obj $(SRC)vmsmisc.obj $(LIBOPT) $(ID_OPT)
287	$(LINK) $(LFLAGS) tilemap.obj,$(SRC)vmsmisc.obj,$(LIBS)
288
289$(SRC)tile.c : $(TILEMAP)
290	$(RUN) $(TILEMAP)
291$(INC)tile.h : $(WINSHR)tile.h
292	copy $(WINSHR)tile.h $(INC)tile.h
293
294# Force an explicit directory prefix on tiletxt.obj so that we don't get
295# unwanted "sticky defaults" when $(TEXTIO) is used in a comma-separated
296# list on the link command line.
297#
298$(UTL)tiletxt.obj : $(HACK_H) $(WINSHR)tilemap.c
299	$(CC) $(CFLAGS) /Def=("TILETEXT")/Obj=$@ $(WINSHR)tilemap.c
300tilemap.obj  : $(HACK_H) $(WINSHR)tilemap.c
301tiletext.obj : $(CONFIG_H) $(INC)tile.h $(WINSHR)tiletext.c
302gifread.obj  : $(CONFIG_H) $(INC)tile.h $(WINSHR)gifread.c
303ppmwrite.obj : $(CONFIG_H) $(INC)tile.h $(WINSHR)ppmwrite.c
304tile2x11.obj : $(HACK_H) $(INC)tile.h $(INC)tile2x11.h $(WINX11)tile2x11.c
305
306
307# make sure object files from src are available when needed
308#
309$(SRC)alloc.obj : $(SRC)alloc.c $(CONFIG_H)
310	$(CD) $(SRC)
311	$(MAKE)$(MAKEFLAGS) alloc.obj
312      @ $(CD) $(UTL)
313
314$(SRC)monst.obj : $(SRC)monst.c $(CONFIG_H)
315	$(CD) $(SRC)
316	$(MAKE)$(MAKEFLAGS) monst.obj
317      @ $(CD) $(UTL)
318
319$(SRC)objects.obj : $(SRC)objects.c $(CONFIG_H)
320	$(CD) $(SRC)
321	$(MAKE)$(MAKEFLAGS) objects.obj
322      @ $(CD) $(UTL)
323
324$(SRC)decl.obj : $(SRC)decl.c $(HACK_H)
325	$(CD) $(SRC)
326	$(MAKE)$(MAKEFLAGS) decl.obj
327      @ $(CD) $(UTL)
328
329$(SRC)drawing.obj : $(SRC)drawing.c $(HACK_H)
330	$(CD) $(SRC)
331	$(MAKE)$(MAKEFLAGS) drawing.obj
332      @ $(CD) $(UTL)
333
334$(SRC)dlb.obj : $(SRC)dlb.c $(CONFIG_H) $(INC)dlb.h
335	$(CD) $(SRC)
336	$(MAKE)$(MAKEFLAGS) dlb.obj
337      @ $(CD) $(UTL)
338
339# make sure hack.h dependencies get transitive information
340$(HACK_H) : $(CONFIG_H)
341	$(CD) $(SRC)
342	$(MAKE)$(MAKEFLAGS) $(HACK_H)
343      @ $(CD) $(UTL)
344$(CONFIG_H) : $(INC)config.h
345	$(CD) $(SRC)
346	$(MAKE)$(MAKEFLAGS) $(CONFIG_H)
347      @ $(CD) $(UTL)
348
349# VMS specific dependencies
350$(SRC)vmsmisc.obj :	$(VMS)vmsmisc.c $(CONFIG_H)
351	$(CD) $(SRC)
352	$(MAKE)$(MAKEFLAGS) vmsmisc.obj
353      @ $(CD) $(UTL)
354
355$(SRC)vmsfiles.obj :	$(VMS)vmsfiles.c $(CONFIG_H)
356	$(CD) $(SRC)
357	$(MAKE)$(MAKEFLAGS) vmsfiles.obj
358      @ $(CD) $(UTL)
359
360
361clean :
362      - if f$search("*.*;-1").nes."" then  purge
363      - if f$search("*.obj") .nes."" then  $(RM) *.obj;
364
365spotless :	clean
366      - if f$search("%%%_lex.c") .nes."" then  $(RM) %%%_lex.c;
367      - if f$search("%%%_yacc.c").nes."" then  $(RM) %%%_yacc.c;
368      - if f$search("$(INC)%%%_comp.h").nes."" then  $(RM) $(INC)%%%_comp.h;*
369      - if f$search("$(INC)tile.h").nes."" then  $(RM) $(INC)tile.h;*
370      - if f$search("lev_lex.h") .nes."" then  $(RM) lev_lex.h;
371      - if f$search("*tab.c")	 .nes."" then  $(RM) *tab.c;
372      - if f$search("*.exe").nes."" then \
373 $(RM) $(MAKEDEFS),$(LEVCOMP),$(DGNCOMP),$(RECOVER),$(DLB)
374      - if f$search("*.exe").nes."" then  $(RM) $(TILEUTILS)
375      - if f$search("$(MARKER)").nes."" then  $(RM) $(MARKER)
376