# Makefile for Zip, ZipCloak, ZipNote and ZipSplit for
# Microsoft C 5.1 and above.

# To use, do "make makefile.msc"

# Add -DSMALL_MEM or -DMEDIUM_MEM to the LOC macro if you wish to reduce
# the memory requirements.
# Add -DNO_ASM to CFLAGS and comment out the ASMOBJS definition if
# you do not have masm.
#
# If you want link Zip against zlib to replace the built-in deflate routines,
# the following changes are required:
# - in the definition of "LOC", add "-DUSE_ZLIB" and remove "-DNO_SECURE_TESTS"
# - comment out the "ASMOBJS" symbol definition
# - modify the linking command blocks for zip and zipcloak according to
#   the following scheme:
#   add a command line "echo ,,,zlib_$(ZIPMODEL); >> zip[c].rsp" just
#   before the "$(LD)..." line; and remove the semicolon character from the
#   "echo ..." line immediately preceding the just inserted command


# Optional nonstandard preprocessor flags (as -DMEDIUM_MEM or -DNO_ASM)
# should be added to the environment via "set LOCAL_ZIP=-DFOO" or added
# to the declaration of LOC here:
LOC = -DDOS -DDYN_ALLOC -DNO_SECURE_TESTS $(LOCAL_ZIP)

# Zip requires compact or large memory model.
# with 2.1, compact model exceeds 64k code segment; use large model
ZIPMODEL=L	# large model for Zip and ZipUtils

# name of Flag to select memory model for assembler compiles, supported
# values are __SMALL__ , __MEDIUM__ , __COMPACT__ , __LARGE__ :
ASMODEL=__LARGE__		# keep in sync with ZIPMODEL definition !!

# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc.
CPU_TYP = 0

# Uncomment the following macro to use the optimized assembler
# routines in Zip:
ASMOBJS = match.obj crc_i86.obj

ASCPUFLAG = __$(CPU_TYP)86

# ------------- Microsoft C 5.1, 6.0, 7.0 and VC++ Pro 1.0 -------------
CC=cl
MODEL=-A$(ZIPMODEL)
FP=
# With the feature additions of Zip 3, the default data segment gets occupied
# with too much initialized data to fit into 64k. As a workaround, for some
# source files with large amount of message strings, -Gt<num> is used to
# force data items of size <num> or larger into their own data segments.
COMMON_CFLAGS=-nologo -I. $(MODEL) $(FP) -DMSC $(LOC) -W3 -G$(CPU_TYP)
CFLAGS=$(COMMON_CFLAGS) -Ox
SPECFLAGS=$(COMMON_CFLAGS) -Oaict -Gs
# For MSC/C++ 7.0 and VC++ no special flags are needed:
# SPECFLAGS=$(CFLAGS)
UTILFLAGS=-DUTIL $(CFLAGS) -Fo

AS=masm
ASFLAGS=-ml -t -D$(ASCPUFLAG) -D$(ASMODEL) $(LOC)
#     For MSC 6.0, use:
#AS=ml
#ASFLAGS=-c -D$(ASCPUFLAG) -D$(ASMODEL) $(LOC)
# Supress -DDYN_ALLOC in ASFLAGS if you have suppressed it in CFLAGS

LD=link
LDFLAGS=/noi/farcall/packcode/e/st:0x1400/m
#     If you use an exe packer as recommended below, remove /e from LDFLAGS

# ------------- Common declarations:
STRIP=rem
#    If you don't have UPX, LZEXE, or PKLITE, get one of them. Then define:
#    (NOTE: upx needs a 386 or higher system to run the exe compressor)
#STRIP=upx --8086 --best
#    or
#STRIP=lzexe
#    or (if you've registered PKLITE)
#STRIP=pklite
#    and remove /e from LDFLAGS.
#    This makes a big difference in .exe size (and possibly load time)

# ------------- Used by install rule
# set BIN to the directory you want to install the executables to
BIN = c:\util

# variables
OBJZ = zip.obj crypt.obj ttyio.obj zipfile.obj zipup.obj fileio.obj util.obj \
	crc32.obj globals.obj

OBJI = deflate.obj trees.obj $(ASMOBJS) msdos.obj

OBJU = zipfile_.obj fileio_.obj util_.obj globals.obj msdos_.obj
OBJN = zipnote.obj $(OBJU)
OBJC = zipcloak.obj crc32_.obj crypt_.obj ttyio.obj $(OBJU)
OBJS = zipsplit.obj $(OBJU)

ZIP_H = zip.h ziperr.h tailor.h msdos/osdep.h

ZIPS = zip.exe zipnote.exe zipsplit.exe zipcloak.exe

zips:	$(ZIPS)

zip.obj:	zip.c $(ZIP_H) revision.h crc32.h crypt.h ttyio.h
	$(CC) -c $(CFLAGS) -Gt65 $*.c

# MSC 5.1 generates bad code on zipfile with -Ox
zipfile.obj:	zipfile.c $(ZIP_H) crc32.h
	$(CC) -c $(SPECFLAGS) $*.c

zipup.obj:	zipup.c $(ZIP_H) revision.h crc32.h crypt.h msdos/zipup.h
	$(CC) -c $(CFLAGS) $*.c

fileio.obj:	fileio.c $(ZIP_H) crc32.h
	$(CC) -c $(CFLAGS) $*.c

util.obj:	util.c $(ZIP_H)
	$(CC) -c $(CFLAGS) $*.c

globals.obj:	globals.c $(ZIP_H)
	$(CC) -c $(CFLAGS) $*.c

deflate.obj:	deflate.c $(ZIP_H)
	$(CC) -c $(CFLAGS) $*.c

trees.obj:	trees.c $(ZIP_H)
	$(CC) -c $(CFLAGS) $*.c

crc32.obj:	crc32.c $(ZIP_H) crc32.h
	$(CC) -c $(CFLAGS) $*.c

crypt.obj:	crypt.c $(ZIP_H) crypt.h crc32.h ttyio.h
	$(CC) -c $(CFLAGS) $*.c

ttyio.obj:	ttyio.c $(ZIP_H) crypt.h ttyio.h
	$(CC) -c $(CFLAGS) $*.c

msdos.obj:	msdos/msdos.c $(ZIP_H)
	$(CC) -c $(CFLAGS) msdos/$*.c

zipcloak.obj:	zipcloak.c $(ZIP_H) revision.h crc32.h crypt.h ttyio.h
	$(CC) -c $(CFLAGS) $*.c

zipnote.obj:	zipnote.c $(ZIP_H) revision.h
	$(CC) -c $(CFLAGS) $*.c

# MSC 5.1 dies on zipsplit with -Ox
zipsplit.obj:	zipsplit.c $(ZIP_H) revision.h
	$(CC) -c $(SPECFLAGS) $*.c

# MSC 5.1 generates bad code on zipfile with -Ox
zipfile_.obj:	zipfile.c $(ZIP_H) crc32.h
	$(CC) -c $(SPECFLAGS) -DUTIL -Fo$@ zipfile.c

fileio_.obj:	fileio.c $(ZIP_H) crc32.h
	$(CC) -c $(UTILFLAGS)$@ fileio.c

util_.obj:	util.c $(ZIP_H)
	$(CC) -c $(UTILFLAGS)$@ util.c

crc32_.obj:	crc32.c $(ZIP_H) crc32.h
	$(CC) -c $(UTILFLAGS)$@ crc32.c

crypt_.obj:	crypt.c $(ZIP_H) crypt.h crc32.h ttyio.h
	$(CC) -c $(UTILFLAGS)$@ crypt.c

msdos_.obj:	msdos/msdos.c $(ZIP_H)
	$(CC) -c $(UTILFLAGS)$@ msdos/msdos.c

crc_i86.obj:	msdos/crc_i86.asm
	$(AS) $(ASFLAGS) msdos\crc_i86.asm ;

match.obj:	msdos/match.asm
	$(AS) $(ASFLAGS) msdos\match.asm ;

# we must cut the command line to fit in the MS/DOS 128 byte limit:
zip.exe: $(OBJZ) $(OBJI)
	echo $(OBJZ)+ > zip.rsp
	echo $(OBJI); >> zip.rsp
	$(LD) $(LDFLAGS) @zip.rsp
	del zip.rsp
	$(STRIP) zip.exe

zipcloak.exe: $(OBJC)
	echo $(OBJC); > zipc.rsp
	$(LD) $(LDFLAGS) @zipc.rsp
	del zipc.rsp
	$(STRIP) zipcloak.exe

zipnote.exe: $(OBJN)
	echo $(OBJN); > zipn.rsp
	$(LD) $(LDFLAGS) @zipn.rsp
	del zipn.rsp
	$(STRIP) zipnote.exe

zipsplit.exe: $(OBJS)
	echo $(OBJS); > zips.rsp
	$(LD) $(LDFLAGS) @zips.rsp
	del zips.rsp
	$(STRIP) zipsplit.exe

# No `install' and `clean' target possible as long as MSC's old MAKE utility
# is supported (MSC 5.1 Make always tries to update ALL targets. The result
# is that install and clean are always executed, unless an error occured.)
#install:	$(ZIPS)
#	copy /b *.exe $(BIN)
#
#clean:
#	del *.obj
#	del *.exe
