###############################################################################
#
# Makefile for compiling Perl under MS-DOS & WATCOM C/C++^32, version 9.5
#	(Optionally, perlglob.exe may be compiled with Borland C++ 3.1.  This
#	is necessary for maximum functionality under MS Windows.)
# This Makefile has been tested with WATCOM C/C++^32, version 9.5b.
#
# This Makefile originally came from an MSDOS Makefile by Diomidis Spinellis
# (March 1990).  It has been so heavily modified, that it hardly resembles
# the original.  It is, unfortunately, still a minimal Makefile.
#
# To compile Perl under WATCOM C/C++^32, version 9.5, see the
# instructions in the README.DOS file.
#
###############################################################################


# Directory containing gdbm.lib:
#LIBS_PATH=../gdbm-1.5		# OBSOLETE!
#DBM_LIB=gdbm.lib		# OBSOLETE!
LIBS_PATH=../db-1.73/port/watcom
DBM_LIB=libdb.lib
DBM_INCLUDE=..\db-1.73\port\watcom\include
# Destination directory for executables
DESTDIR=/bin

# Perl's stack size:
PERL_STACKSIZE=256K

# NOTE: THE FOLLOWING COMMENTS ARE OBSOLETE:
#------------------------------------------------------------------------------
# For debugging, use:
# DEBUG=/d2 /DRCHECK /DUSE_LOCAL_DIR_H /DMSTATS
# For production code, use (stack overflow checking should always be
# turned on):
#DEBUG=/oilrt /4r /zp4 /oe=40 /DUSE_LOCAL_DIR_H /DMSTATS
#DEBUG=/oilrt/5r/fpi/fp5/zp4/oe=40 /DUSE_LOCAL_DIR_H /DMSTATS
#------------------------------------------------------------------------------
# The following is the only thing that is needed.  The debug or optimization
# flags are now set via the WCC386 environment variable, as the command line
# is too long when these flags are set via the command line.
DEBUG=/DUSE_LOCAL_DIR_H /DMSTATS

# Yacc is needed if perly.y changes, or if perly.c or perly.h doesn't exist or
# is out-of-date.  Note that some versions of PC yacc run out of memory
# parsing perly.y, and so you'll need something that can handle it.  If you
# can't find a suitable PC yacc, you can always use a Un*x yacc and manually
# transfer the files to the PC.
#
# Yacc flags
YFLAGS=-d
YACC=byacc

###############################################################################
# Nothing past this point should have to be changed
###############################################################################

# Use the protected-mode compiler, with signed chars:
# CC=wcl386 /p /j	# For WATCOM C/386 9.0 and earlier
CC=wcl386 /j

# Cflags for the files that break under the optimiser
CPLAIN=$(DEBUG) /i=. /i=$(DBM_INCLUDE) /DCRIPPLED_CC
# Cflags for all the rest
CFLAGS=$(CPLAIN)

# Source files
SRC =	array.c cmd.c cons.c consarg.c doarg.c doio.c dolist.c dump.c eval.c \
	form.c hash.c perl.c perly.c regcomp.c regexec.c stab.c str.c toke.c \
	util.c usersub.c msdos32.c popen.c directory.c chdir.c usage.c \
	mktemp.c dpmi.c tempnam.c malloc.c suffix.c \
	dosglob.c wildcard.c


# Object files
OBJ =	perl.obj array.obj cmd.obj cons.obj consarg.obj doarg.obj doio.obj \
	dolist.obj dump.obj eval.obj form.obj hash.obj perly.obj regcomp.obj \
	regexec.obj stab.obj str.obj toke.obj util.obj usersub.obj \
	msdos32.obj popen.obj directory.obj chdir.obj usage.obj mktemp.obj \
	dpmi.obj tempnam.obj malloc.obj suffix.obj \
	dosglob.obj wildcard.obj

# Files in the MS-DOS distribution
DOSFILES=config.h dir.h director.c glob.c makefile msdos32.c popen.c \
	usage.c chdir.c mktemp.c dpmi.c dpmi.h tempnam.c suffix.c \
	dosglob.c dosglob.h wildcard.c \
	readme.msd changes.dds wishlist.dds patches manifest


.c.obj:
	$(CC) /c $(CFLAGS) $[*

#
# Default target:
#
# Note that a Windows-incompatible version of perlglob.exe is compiled by
# default.
#
all: perl.exe bperlglob.exe .SYMBOLIC
	@echo Compilation done.

perl.exe: $(OBJ) perl.rsp
	wlink @perl.rsp

perl.rsp: makefile
	echo name perl.exe > perl.rsp
	echo debug all >> perl.rsp
	echo option stack=$(PERL_STACKSIZE) >> perl.rsp
	echo option map >> perl.rsp
	echo sort global >> perl.rsp
	echo libpath $(LIBS_PATH) >> perl.rsp
	echo option caseexact >> perl.rsp
	echo option dosseg >> perl.rsp
	echo system dos4g >> perl.rsp
	for %f in ($(OBJ)) do echo file %f >> perl.rsp
	echo library $(DBM_LIB) >> perl.rsp

# Borland C++ version of perlglob.exe (works under Windows).
# Note that the executable is called "perlglob.exe", even though the target
# is called "bperlglob.exe".
bperlglob.exe: glob.c getopt.c .SYMBOLIC
	-del glob.obj
	-del getopt.obj
	-del wildcard.obj
	-del dosglob.obj
	bcc -v -N -mc -DMSDOS -eperlglob.exe glob.c getopt.c \
		wildcard.c dosglob.c
	# Delete the .obj files, so that there's no chance of mixing BC++ and
	# WATCOM C .obj files.
	del glob.obj
	del getopt.obj
	del wildcard.obj
	del dosglob.obj

# WATCOM C version of perlglob.exe (does not work with perl & Windows):
perlglob.exe: glob.obj getopt.obj wildcard.obj dosglob.obj \
	      director.obj dpmi.obj
	echo name perlglob.exe > perlg.rsp
	echo debug all >> perlg.rsp
	echo option stack=20k >> perlg.rsp
	echo option caseexact >> perlg.rsp
	echo file glob.obj >> perlg.rsp
	echo file getopt.obj >> perlg.rsp
	echo file wildcard.obj >> perlg.rsp
	echo file dosglob.obj >> perlg.rsp
	echo file director.obj >> perlg.rsp
	echo file dpmi.obj >> perlg.rsp
	echo option dosseg >> perlg.rsp
	echo system dos4g >> perlg.rsp
	wlink @perlg.rsp

perly.h perly.c: perly.y
	$(YACC) $(YFLAGS) perly.y
	ren y_tab.c perly.c
	ren y_tab.h perly.h
	echo extern YYSTYPE yylval; >>perly.h

consarg.obj:	consarg.c EXTERN.h perl.h
	$(CC) $(CPLAIN) -c consarg.c

util.obj:	util.c EXTERN.h perl.h
	$(CC) $(CPLAIN) -c util.c

#
# IMPORTANT!
# DO NOT INSTALL PERL USING ANY FORM OF .EXE COMPRESSION (e.g, exepack).
# Doing so will make the perl binary totally unusable, as the WATCOM stub
# loader (a 16-bit program) does an exec() of the 32-bit DOS/4GW extender,
# and this extender has to be able to read and parse the .EXE file (which
# it cannot, if the .EXE file has been packed).
#
install: all .SYMBOLIC
	copy perl.exe $(DESTDIR)/perl.exe
	copy glob.exe $(DESTDIR)/glob.exe

clean:	.SYMBOLIC
	-del *.obj
	-del *.err
	#-del *.exe
	# Keep these around, in case someone doesn't have a PC version of yacc
	#-del perly.h
	#-del perly.c
	-del perl.rsp
	-del perlg.rsp

tags:	.SYMBOLIC
	ctags *.c *.h *.xc


###############################################################################
# DEPENDENCIES (DO NOT CHANGE THIS LINE OR ANYTHING PAST IT)
array.obj:	array.c EXTERN.h perl.h
chdir.obj:	chdir.c config.h
cmd.obj:	cmd.c EXTERN.h perl.h
cons.obj:	cons.c EXTERN.h perl.h perly.h
director.obj:	dir.h dpmi.h
doarg.obj:	doarg.c EXTERN.h perl.h
doio.obj:	doio.c EXTERN.h perl.h
dolist.obj:	dolist.c EXTERN.h perl.h
dosglob.obj:	dosglob.c dosglob.h
dpmi.obj:	dpmi.c dpmi.h
dump.obj:	dump.c EXTERN.h perl.h
eval.obj:	eval.c EXTERN.h perl.h
form.obj:	form.c EXTERN.h perl.h
getopt.obj:	getopt.c 
glob.obj:	glob.c 
hash.obj:	hash.c EXTERN.h perl.h
malloc.obj:	malloc.c EXTERN.h perl.h
mktemp.obj:	mktemp.c 
msdos32.obj:	msdos32.c EXTERN.h perl.h dpmi.h
perl.obj:	perl.c EXTERN.h perl.h perly.h patchlevel.h
popen.obj:	popen.c 
regcomp.obj:	regcomp.c EXTERN.h perl.h INTERN.h regcomp.h
regexec.obj:	regexec.c EXTERN.h perl.h regcomp.h
stab.obj:	stab.c EXTERN.h perl.h
str.obj:	str.c EXTERN.h perl.h perly.h
toke.obj:	toke.c EXTERN.h perl.h perly.h
usage.obj:	usage.c 
usersub.obj:	usersub.c EXTERN.h perl.h
