###############################################################################
#
# File:         makefile
# RCS:          $Header: $
# Description:  
# Author:       Darryl Okahata
# Created:      Sat Oct  8 16:09:31 1994
# Modified:     Thu Oct 27 23:27:28 1994 (darrylo@home) darrylo@hostigos
# Language:     N/A
# Package:      N/A
# Status:       Experimental (Do Not Distribute)
#
# (C) Copyright 1994, Darryl Okahata, all rights reserved.
#
###############################################################################


# This is for debugging:
#DEBUG16=/d2
#DEBUG32=/d2
# This is for generating optimized code:
DEBUG16=/oilrt/5/fpi/fp5/zp4/oe=40
DEBUG32=/oilrt/5r/fpi/fp5/zp4/oe=40


#
# Define LSEEK_BE_BROKEN with WATCOM C/C++^32 10.0A or earlier, as these
# versions have a bug in the lseek() routine where, when a file's size is
# extended, the extended area is not always zero-filled.  This causes
# problems with dbm access.  It is not known if later releases fix this
# bug (it has been reported), as 10.0A is the latest version as this is
# being written.
#
.BEFORE
	set wcc386=$(DEBUG32) /DUSE_LOCAL_DIR_H /DMSTATS /DMSDOS \
		/DLSEEK_BE_BROKEN /i=msdos32
	set wcc=$(DEBUG16) /DMSDOS

# Perl's stack size:
PERL_STACKSIZE=256K

# LIBS_PATHS is a list of directories to search for libraries.
# This is currently unused, as full or relative pathnames to libraries
# are used.
LIBS_PATHS=.

# LIB_MODULES is a list of perl extension modules to add to the perl.exe
# binary.  This list is used to build perlmain.c, and so should only
# contain references to modules with bootstrap entry points.
# NOTE: The following is CASE-SENSITIVE!  Even though MSDOS is
# case-insensitive and limits the base filename to 8 characters, we need
# to preserve case and the long filenames, because Perl function names
# depend on this.  We don't have to worry about the long filenames
# because MSDOS will truncate them (usually ;-).
LIB_MODULES=\
	ext\DynaLoader\DynaLoader.lib \
	ext\DB_File\DB_File.lib \
	ext\Fcntl\Fcntl.lib \
	ext\SDBM_File\SDBM_File.lib

OTHER_LIBS=\
	$(LIB_MODULES) \
	..\db-1.85\port\watcom\libdb.lib \
	ext\sdbm_fil\sdbm\libsdbm.lib

# 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

# Plain ol' CFLAGS
CFLAGS=

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

LIBPERL=msdos32\perllib.lib

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

# perllib.lib object files:
PERLDOS_OBJ = \
	      msdos32\suffix.obj \
	      msdos32\usage.obj \
	      msdos32\perldos.obj

PERLLIB_OBJ = \
	      msdos32\perl.obj msdos32\malloc.obj msdos32\gv.obj \
	      msdos32\toke.obj msdos32\perly.obj msdos32\op.obj \
              msdos32\regcomp.obj msdos32\dump.obj msdos32\util.obj \
	      msdos32\mg.obj msdos32\hv.obj msdos32\av.obj msdos32\run.obj \
              msdos32\pp_hot.obj msdos32\sv.obj msdos32\pp.obj \
	      msdos32\scope.obj msdos32\pp_ctl.obj msdos32\pp_sys.obj \
              msdos32\doop.obj msdos32\doio.obj msdos32\regexec.obj \
	      msdos32\taint.obj msdos32\deb.obj $(PERLDOS_OBJ)

DOSLIB_OBJ = \
	      msdos32\msdos32.obj msdos32\dpmi.obj \
	      msdos32\director.obj \
	      msdos32\tempnam.obj msdos32\mktemp.obj \
	      msdos32\popen.obj msdos32\chdir.obj \
	      msdos32\cleanup.obj

DOSARGV_OBJ = \
		msdos32\getopt.obj msdos32\wildcard.obj \
		msdos32\dosglob.obj

.c.obj:
	$(CC) /c /fo=msdos32\$[*.obj $(CFLAGS) $[*

all:	miniperl.exe perl.exe x2p\a2p.exe .SYMBOLIC

perl:	perl.exe .SYMBOLIC

perl.exe:	msdos32\perlmain.obj $(LIBPERL) $(OTHER_LIBS) \
		msdos32\dosargv.lib preplibrary msdos32\perl.rsp
	wlink @msdos32\perl.rsp

msdos32\perl.rsp: makefile
	echo name perl.exe > msdos32\perl.rsp
	echo debug all >> msdos32\perl.rsp
	echo option stack=$(PERL_STACKSIZE) >> msdos32\perl.rsp
	echo option map >> msdos32\perl.rsp
	echo sort global >> msdos32\perl.rsp
	echo option caseexact >> msdos32\perl.rsp
	echo option dosseg >> msdos32\perl.rsp
	echo system dos4g >> msdos32\perl.rsp
	echo file msdos32\perlmain.obj >> msdos32\perl.rsp
	echo library $(LIBPERL) >> msdos32\perl.rsp
	echo library msdos32\doslib.lib >> msdos32\perl.rsp
	echo library msdos32\dosargv.lib >> msdos32\perl.rsp
	for %f in ($(LIBS_PATHS)) do echo libpath %f >> msdos32\perl.rsp
	for %f in ($(OTHER_LIBS)) do echo library %f >> msdos32\perl.rsp

miniperl.exe:	msdos32\miniperl.obj $(LIBPERL) \
		msdos32\doslib.lib msdos32\dosargv.lib msdos32\miniperl.rsp
	wlink @msdos32\miniperl.rsp

msdos32\miniperl.rsp: makefile
	echo name miniperl.exe > msdos32\miniperl.rsp
	echo debug all >> msdos32\miniperl.rsp
	echo option stack=$(PERL_STACKSIZE) >> msdos32\miniperl.rsp
	echo option map >> msdos32\miniperl.rsp
	echo sort global >> msdos32\miniperl.rsp
	echo libpath $(LIBS_PATHS) >> msdos32\miniperl.rsp
	echo option caseexact >> msdos32\miniperl.rsp
	echo option dosseg >> msdos32\miniperl.rsp
	echo system dos4g >> msdos32\miniperl.rsp
	echo file msdos32\miniperl.obj >> msdos32\miniperl.rsp
	echo library msdos32\doslib.lib >> msdos32\miniperl.rsp
	echo library msdos32\dosargv.lib >> msdos32\miniperl.rsp
	echo library $(LIBPERL) >> msdos32\miniperl.rsp

msdos32\perllib.lbc:	makefile
	-del msdos32\perllib.lbc
	for %f in ($(PERLLIB_OBJ)) do echo -+ %f >> msdos32\perllib.lbc

$(LIBPERL): $(PERLLIB_OBJ) msdos32\perllib.lbc
	del $(LIBPERL)
	wlib $(LIBPERL) @msdos32\perllib.lbc

msdos32\doslib.lib:	$(DOSLIB_OBJ) msdos32\doslib.lbc
	del msdos32\doslib.lib
	wlib msdos32\doslib.lib @msdos32\doslib.lbc

msdos32\doslib.lbc:	makefile
	-del msdos32\doslib.lbc
	for %f in ($(DOSLIB_OBJ)) do echo -+ %f >> msdos32\doslib.lbc

msdos32\dosargv.lib:	$(DOSARGV_OBJ) msdos32\dosargv.lbc
	del msdos32\dosargv.lib
	wlib msdos32\dosargv.lib @msdos32\dosargv.lbc

msdos32\dosargv.lbc:	makefile
	-del msdos32\dosargv.lbc
	for %f in ($(DOSARGV_OBJ)) do echo -+ %f >> msdos32\dosargv.lbc

$(LIBPERL): $(PERLLIB_OBJ) msdos32\perllib.lbc

msdos32\chdir.obj \
msdos32\director.obj \
msdos32\dosglob.obj \
msdos32\dpmi.obj \
msdos32\getopt.obj \
msdos32\glob.obj \
msdos32\mktemp.obj \
msdos32\msdos32.obj \
msdos32\popen.obj \
msdos32\suffix.obj \
msdos32\tempnam.obj \
msdos32\usage.obj \
msdos32\cleanup.obj \
msdos32\perldos.obj \
msdos32\wildcard.obj:
	$(CC) /c $(CFLAGS) /fo=$[*.obj $[*

preplibrary: miniperl.exe lib\config.pm .SYMBOLIC
	mkdir lib/auto
	@echo AutoSplitting perl library
	miniperl -Ilib msdos32\autosplit.dos lib/*.pm lib/*/*.pm

lib\config.pm: config.sh miniperl.exe
	miniperl configpm

# The target for perlmain.c needs to be somehow updated to be rebuilt if
# a module is added or deleted.
perlmain.c:	miniperl.exe msdos32\writemai.dos miniperl.c modules.dos
	miniperl msdos32\writemai.dos > perlmain.c

modules.dos:	makefile $(LIB_MODULES)
	-del modules.dos
	for %f in ($(LIB_MODULES)) do echo %f >> modules.dos

# This really isn't symbolic, but it forces the following to be done
ext\dynaloader\dynaloader.lib \
ext\dynaload\dynaload.lib: .SYMBOLIC
	cd ext\dynaload
	wmake/u
	cd ..\..

# This really isn't symbolic, but it forces the following to be done
ext\db_file\db_file.lib: .SYMBOLIC
	cd ext\db_file
	wmake/u
	cd ..\..

# This really isn't symbolic, but it forces the following to be done
ext\fcntl\fcntl.lib: .SYMBOLIC
	cd ext\fcntl
	wmake/u
	cd ..\..

# This really isn't symbolic, but it forces the following to be done
ext\sdbm_file\sdbm_file.lib \
ext\sdbm_fil\sdbm_fil.lib: .SYMBOLIC
	cd ext\sdbm_fil
	wmake/u
	cd ..\..

# This really isn't symbolic, but it forces the following to be done
ext\sdbm_file\sdbm\libsdbm.lib \
ext\sdbm_fil\sdbm\libsdbm.lib: .SYMBOLIC
	cd ext\sdbm_fil\sdbm
	wmake/u
	cd ..\..\..

x2p\a2p.exe:
	cd x2p
	wmake/u
	cd ..

###############################################################################
#
# Build the 16-bit perlglob executable:
#

B16_DIR = msdos32\16bit
PERLGLOB_OBJS = $(B16_DIR)\glob.obj $(B16_DIR)\getopt.obj \
		$(B16_DIR)\wildcard.obj $(B16_DIR)\dosglob.obj

CC16 = wcl /j /mc
CFLAGS16 = $(CFLAGS)

perlglob.exe:	$(PERLGLOB_OBJS) $(B16_DIR)\perlglob.rsp
	wlink @$(B16_DIR)\perlglob.rsp

$(B16_DIR)\perlglob.rsp:	makefile
	echo system dos > $(B16_DIR)\perlglob.rsp
	echo name perlglob.exe >> $(B16_DIR)\perlglob.rsp
	echo debug all >> $(B16_DIR)\perlglob.rsp
	echo option map >> $(B16_DIR)\perlglob.rsp
	echo option stack=60K >> $(B16_DIR)\perlglob.rsp
	echo option caseexact >> $(B16_DIR)\perlglob.rsp
	echo sort global >> $(B16_DIR)\perlglob.rsp
	for %f in ($(PERLGLOB_OBJS)) do echo file %f >> $(B16_DIR)\perlglob.rsp


$(B16_DIR)\glob.obj:		msdos32\glob.c
	$(CC16) /c $(CFLAGS16) /fo=$^*.obj $[@

$(B16_DIR)\getopt.obj:	msdos32\getopt.c
	$(CC16) /c $(CFLAGS16) /fo=$^*.obj $[@

$(B16_DIR)\wildcard.obj:	msdos32\wildcard.c
	$(CC16) /c $(CFLAGS16) /fo=$^*.obj $[@

$(B16_DIR)\dosglob.obj:	msdos32\dosglob.c
	$(CC16) /c $(CFLAGS16) /fo=$^*.obj $[@

###############################################################################

clean:	.SYMBOLIC
	del *.obj
	del *.err
	del *.map
	del msdos32\*.obj
	del msdos32\*.rsp
	del msdos32\*.lib
	del msdos32\*.bak
	del msdos32\*.lbc
	del $(B16DIR)\*.obj
	del $(B16DIR)\*.rsp
	del modules.dos
	del t\perl.exe
	cd ext\dynaload
	wmake/u clean
	cd ..\..
	cd ext\db_file
	wmake/u clean
	cd ..\..
	cd ext\fcntl
	wmake/u clean
	cd ..\..
	cd ext\sdbm_fil
	wmake/u clean
	cd ..\..
	cd ext\sdbm_fil\sdbm
	wmake/u clean
	cd ..\..\..
	cd x2p
	wmake/u clean
	cd ..

###############################################################################
# DEPENDENCIES (DO NOT CHANGE THIS LINE OR ANYTHING PAST IT)
msdos32\chdir.obj:	msdos32\chdir.c config.h
msdos32\director.obj:	msdos32\director.c msdos32\dir.h msdos32\dpmi.h
msdos32\dosglob.obj:	msdos32\dosglob.c msdos32\dir.h msdos32\dosglob.h
msdos32\dpmi.obj:	msdos32\dpmi.c msdos32\dpmi.h
msdos32\getopt.obj:	msdos32\getopt.c 
msdos32\glob.obj:	msdos32\glob.c 
msdos32\mktemp.obj:	msdos32\mktemp.c 
msdos32\msdos32.obj:	msdos32\msdos32.c EXTERN.h perl.h msdos32\dpmi.h
msdos32\popen.obj:	msdos32\popen.c 
msdos32\suffix.obj:	msdos32\suffix.c EXTERN.h perl.h
msdos32\tempnam.obj:	msdos32\tempnam.c 
msdos32\usage.obj:	msdos32\usage.c
msdos32\wildcard.obj:	msdos32\wildcard.c msdos32\dosglob.h
msdos32\av.obj:	av.c EXTERN.h perl.h
msdos32\deb.obj:	deb.c EXTERN.h perl.h
msdos32\doio.obj:	doio.c EXTERN.h perl.h
msdos32\doop.obj:	doop.c EXTERN.h perl.h
msdos32\dump.obj:	dump.c EXTERN.h perl.h
msdos32\gv.obj:	gv.c EXTERN.h perl.h
msdos32\hv.obj:	hv.c EXTERN.h perl.h
msdos32\malloc.obj:	malloc.c EXTERN.h perl.h
msdos32\mg.obj:	mg.c EXTERN.h perl.h
msdos32\miniperl.obj:	miniperl.c INTERN.h perl.h
msdos32\op.obj:	op.c EXTERN.h perl.h
msdos32\perl.obj:	perl.c EXTERN.h perl.h patchlevel.h
msdos32\perlmain.obj:	perlmain.c INTERN.h perl.h
msdos32\perly.obj:	perly.c EXTERN.h perl.h
msdos32\pp.obj:	pp.c EXTERN.h perl.h
msdos32\pp_ctl.obj:	pp_ctl.c EXTERN.h perl.h
msdos32\pp_hot.obj:	pp_hot.c EXTERN.h perl.h
msdos32\pp_sys.obj:	pp_sys.c EXTERN.h perl.h
msdos32\regcomp.obj:	regcomp.c EXTERN.h perl.h INTERN.h regcomp.h
msdos32\regexec.obj:	regexec.c EXTERN.h perl.h regcomp.h
msdos32\run.obj:	run.c EXTERN.h perl.h
msdos32\scope.obj:	scope.c EXTERN.h perl.h
msdos32\sv.obj:	sv.c EXTERN.h perl.h
msdos32\taint.obj:	taint.c EXTERN.h perl.h
msdos32\toke.obj:	toke.c EXTERN.h perl.h keywords.h
msdos32\util.obj:	util.c EXTERN.h perl.h
msdos32\usage.obj:	msdos32\usage.c
msdos32\cleanup.obj:	msdos32\cleanup.c
msdos32\perldos.obj:	msdos32\perldos.c EXTERN.h perl.h msdos32\dpmi.h
av.h:	
config.h:
cop.h:	
cv.h:	
msdos32\dir.h:	
msdos32\dosglob.h:	
dosish.h:	
msdos32\dpmi.h:	
embed.h:	
extern.h:	
form.h:	
gv.h:	
handy.h:	
hv.h:	
intern.h:	
keywords.h:	
mg.h:	
op.h:	
opcode.h:	
patchlev.h:	
perl.h:	embed.h config.h msdos32\dir.h dosish.h unixish.h handy.h regexp.h \
	sv.h util.h form.h gv.h cv.h opcode.h op.h cop.h av.h hv.h mg.h \
	scope.h perly.h pp.h proto.h
	wtouch perl.h
perly.h:	
pp.h:	
proto.h:	
regcomp.h:	
regexp.h:	
scope.h:	
sv.h:	
unixish.h:	
util.h:	
xsub.h:	
