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