# Makefile for Zip, ZipCloak, ZipNote and ZipSplit for
# 32-bit Microsoft Visual C++

# To use, do "nmake -f makefile.w32"

# This version disables assembly.
# Add -DNO_ASM to CFLAGS and comment out the ASMOBJS definition if
# you do not have masm 6.1X.

# 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 = $(LOCAL_ZIP)

!IFNDEF debug
NODEBUG=1
!ENDIF

# Uncomment the following macro to use the optimized assembler
# routines in Zip:
#ASMOBJS = match32.obj
CRCA_O = crci386c.obj
CFLG_ASM = -DASM_CRC

!IFDEF USEBZ2
LOC=$(LOC) -DBZIP2_SUPPORT
!IFNDEF debug
EXTLIB=$(EXTLIB) libbz2.lib
!ELSE
EXTLIB=$(EXTLIB) libbz2.lib
!ENDIF
!ENDIF

!IFDEF USEZLIB
LOC=$(LOC) -DUSE_ZLIB
ASMOBJS=
!IFNDEF debug
EXTLIB=$(EXTLIB) zlib.lib
!ELSE
EXTLIB=$(EXTLIB) zlib.lib
!ENDIF
!ENDIF

!IFDEF USEZLIB
USE_MSVCRT=1
!ELSE
!IFDEF USEBZIP2
USE_MSVCRT=1
!ELSE
USE_MSVCRT=0
!ENDIF
!ENDIF # USEZLIB

!IF $(USE_MSVCRT) == 1
CRTLIB=-MD
!ELSE
!IF "$(VS80COMNTOOLS)" == ""
CRTLIB=-ML
!ELSE
# no single-threaded CRT static lib, only multi-threaded in VC8
CRTLIB=-MT
!ENDIF
!ENDIF

!IFDEF NODEBUG
cdebug = -O2
cdbgsz = -O1
!ELSE
cdebug = -Od
cdbgsz = $(cdebug)
!ENDIF

# ------------- 32-bit Microsoft Visual C++ -------------
CC=cl -nologo
CFLAGS=-W3 $(cdebug) -DWIN32 $(CFLG_ASM) $(CRTLIB) $(LOC) -DNO_ASM
UTILFLAGS=$(CFLAGS) -DUTIL -Fo$@

# Remove "-coff" from ASFLAGS if you do not have MASM 6.11.

AS=ml -nologo
ASFLAGS=-c -coff -Cx

RC=rc

# If you build 16-bit executables with MS Visual C++ v1.0/1.5 and link them
# with the /KNOWEAS switch, you can build dual-mode MS-DOS/Win32 executables
# by passing the -stub switch to the 32-bit linker to specify the 16-bit part.

LD=link -nologo
LDFLAGS=user32.lib advapi32.lib /OPT:NOWIN98 /INCREMENTAL:NO /PDB:$*.pdb $(EXTLIB)
SYMS=/DEBUG:full /DEBUGTYPE:CV
!IFDEF debug
LDFLAGS=$(LDFLAGS) $(SYMS)
CFLAGS=$(CFLAGS) /Zi
!ELSE
LDFLAGS=$(LDFLAGS) /RELEASE
!IFDEF sym
LDFLAGS=$(LDFLAGS) $(SYMS)
CFLAGS=$(CFLAGS) /Zi
!ENDIF
!ENDIF

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

OBJI = deflate.obj trees.obj $(ASMOBJS) win32.obj win32zip.obj nt.obj win32i64.obj

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

ZIP_H = zip.h ziperr.h tailor.h win32/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) $*.c

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

zipup.obj:      zipup.c $(ZIP_H) revision.h crc32.h crypt.h win32/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

win32i64.obj:   win32/win32i64.c $(ZIP_H)
 $(CC) -c $(CFLAGS) -I. win32/win32i64.c

win32zip.obj:   win32/win32zip.c $(ZIP_H) win32/win32zip.h win32/nt.h
 $(CC) -c $(CFLAGS) -I. win32/win32zip.c

win32.obj:      win32/win32.c $(ZIP_H) win32/win32zip.h
 $(CC) -c $(CFLAGS) -I. win32/win32.c

nt.obj:         win32/nt.c $(ZIP_H) win32/nt.h
 $(CC) -c $(CFLAGS) -I. win32/nt.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

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

zipfile_.obj:   zipfile.c $(ZIP_H) crc32.h
 $(CC) -c $(UTILFLAGS) 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

win32_.obj:     win32/win32.c $(ZIP_H) win32/win32zip.h
 $(CC) -c $(UTILFLAGS) -I. win32/win32.c

crci386c.obj:   win32/crc_i386.c $(ZIP_H) crc32.h
 $(CC) -c $(CFLAGS) -I. -Fo$@ win32/crc_i386.c

crc_i386.obj:   win32/crc_i386.asm
 $(AS) $(ASFLAGS) win32\crc_i386.asm

match32.obj:    win32/match32.asm
 $(AS) $(ASFLAGS) win32\match32.asm

zip.res:        win32/zip.rc revision.h
	$(RC) /l 0x409 /fo$@ /i win32 /d WIN32 win32/zip.rc

zip.exe: $(OBJZ) $(OBJI) zip.res
 $(LD) $(LDFLAGS) $(OBJZ) $(OBJI) zip.res

zipcloak.exe: $(OBJC)
 $(LD) $(LDFLAGS) $(OBJC)

zipnote.exe: $(OBJN)
 $(LD) $(LDFLAGS) $(OBJN)

zipsplit.exe: $(OBJS)
 $(LD) $(LDFLAGS) $(OBJS)

clean:
 -del *.obj
 -del *.exe
