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