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