summaryrefslogtreecommitdiff
path: root/msdos/makefile.wat
blob: dd4d8cd275b552788de2d4f5d87306449401e627 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# WMAKE makefile for 16 bit MSDOS or 32 bit DOS extender (PMODE/W or DOS/4GW)
# using Watcom C/C++ v11.0+, by Paul Kienitz, last revised 07 Aug 2005.
# Makes Zip.exe, ZipNote.exe, ZipCloak.exe, and ZipSplit.exe.
#
# Invoke from Zip source dir with "WMAKE -F MSDOS\MAKEFILE.WAT [targets]"
# To build with debug info use "WMAKE DEBUG=1 ..."
# To build with no assembly modules use "WMAKE NOASM=1 ..."
# To make the PMODE/W version use "WMAKE PM=1 ..."
# To make the DOS/4GW version use "WMAKE GW=1 ..." (overrides PM=1)
#   Note: specifying PM or GW without NOASM requires that the win32 source
#   directory be present, so it can access the 32 bit assembly sources.
#   PMODE/W is recommended over DOS/4GW for best performance.
# To create a low memory usage version of Zip, use "WMAKE WSIZE=8192 ..."
#   (or whatever power of two less than 32768 you wish) -- this also causes
#   SMALL_MEM to be defined.  Compression performance will be reduced.
#   This currently is not supported with PM=1 or GW=1.
#
# Other options to be fed to the compiler and assembler can be specified in
# an environment variable called LOCAL_ZIP.

variation = $(%LOCAL_ZIP)

# Stifle annoying "Delete this file?" questions when errors occur:
.ERASE

.EXTENSIONS:
.EXTENSIONS: .exe .obj .c .h .asm

# We maintain multiple sets of object files in different directories so that
# we can compile msdos, dos/4gw or pmode/w, and win32 versions of Zip without
# their object files interacting.  The following var must be a directory name
# ending with a backslash.  All object file names must include this macro
# at the beginning, for example "$(O)foo.obj".

!ifdef GW
PM = 1      # both protected mode formats use the same object files
!endif

!ifdef DEBUG
!  ifdef PM
OBDIR = od32d
!  else
!    ifdef WSIZE
OBDIR = od16l
size = -DWSIZE=$(WSIZE) -DSMALL_MEM
!    else
OBDIR = od16d
size = -DMEDIUM_MEM
!    endif
!  endif
!else
!  ifdef PM
OBDIR = ob32d
!  else
!    ifdef WSIZE
OBDIR = ob16l
size = -DWSIZE=$(WSIZE) -DSMALL_MEM
!    else
OBDIR = ob16d
size = -DMEDIUM_MEM
!    endif
!  endif
!endif
O = $(OBDIR)\   # comment here so backslash won't continue the line

# The assembly hot-spot code in crc_i[3]86.asm and match[32].asm is
# optional.  This section controls its usage.

!ifdef NOASM
  # C source
asmob =
cvars = $+$(cvars)$- -DDYN_ALLOC -DNO_ASM   # or ASM_CRC might default on!
# "$+$(foo)$-" means expand foo as it has been defined up to now; normally,
# this make defers inner expansion until the outer macro is expanded.
!else  # !NOASM
asmob = $(O)crc.obj $(O)match.obj
!  ifdef PM
cvars = $+$(cvars)$- -DASM_CRC -DASMV       # no DYN_ALLOC with match32.asm
crc_s = win32\crc_i386.asm   # requires that the win32 directory be present
mat_s = win32\match32.asm    # ditto
!  else
cvars = $+$(cvars)$- -DDYN_ALLOC -DASM_CRC -DASMV
avars = $+$(avars)$- -DDYN_ALLOC
crc_s = msdos\crc_i86.asm
mat_s = msdos\match.asm
!  endif
!endif

# Now we have to pick out the proper compiler and options for it.  This gets
# pretty complicated with the PM, GW, DEBUG, and NOASM options...

link   = wlink
asm    = wasm

!ifdef PM
cc     = wcc386
# Use Pentium Pro timings, register args, static strings in code:
cflags = -bt=DOS -mf -6r -zt -zq
aflags = -bt=DOS -mf -3 -zq
cvars  = $+$(cvars)$- -DDOS $(variation)
avars  = $+$(avars)$- -DWATCOM_DSEG $(variation)

!  ifdef GW
lflags = sys DOS4G
!  else
# THIS REQUIRES THAT PMODEW.EXE BE FINDABLE IN THE COMMAND PATH.
# It does NOT require you to add a pmodew entry to wlink.lnk or wlsystem.lnk.
defaultlibs = libpath %WATCOM%\lib386 libpath %WATCOM%\lib386\dos
lflags = format os2 le op osname='PMODE/W' op stub=pmodew.exe $(defaultlibs)
!  endif

!else   # plain 16-bit DOS:

cc     = wcc
# Use plain 8086 instructions, large memory model, static strings in code:
cflags = -bt=DOS -ml -0 -zt -zq
aflags = -bt=DOS -ml -0 -zq
cvars  = $+$(cvars)$- -DDOS $(size) $(variation)
avars  = $+$(avars)$- $(size) $(variation)
lflags = sys DOS
!endif  # !PM

# Specify optimizations, or a nonoptimized debugging version:

!ifdef DEBUG
cdebug = -od -d2
ldebug = d w all op symf
!else
!  ifdef PM
cdebug = -s -obhikl+rt -oe=100 -zp8
# -oa helps slightly but might be dangerous.
!  else
cdebug = -s -oehiklrt
!  endif
ldebug = op el
!endif

# How to compile most sources:
.c.obj:
	$(cc) $(cdebug) $(cflags) $(cvars) $[@ -fo=$@

# Our object files.  OBJZ is for Zip, OBJC is for ZipCloak, OBJN is for
# ZipNote, and OBJS is for ZipSplit:

OBJZ2 = $(O)zip.obj $(O)crypt.obj $(O)ttyio.obj $(O)zipfile.obj $(O)zipup.obj
OBJZA = $(OBJZ2) $(O)util.obj $(O)fileio.obj $(O)deflate.obj
OBJZB = $(O)trees.obj $(O)globals.obj $(O)crc32.obj $(asmob) $(O)msdos.obj

OBJU2 = $(O)zipfile_.obj $(O)fileio_.obj $(O)util_.obj $(O)globals.obj
OBJ_U = $(OBJU2) $(O)msdos_.obj

OBJC  = $(O)zipcloak.obj $(O)crc32_.obj $(O)crypt_.obj $(O)ttyio.obj $(OBJ_U)

OBJN  = $(O)zipnote.obj $(OBJ_U)

OBJS  = $(O)zipsplit.obj $(OBJ_U)

# Common header files included by all C sources:

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


# HERE WE GO!  By default, make all targets:
all: Zip.exe ZipNote.exe ZipCloak.exe ZipSplit.exe

# Convenient shorthand options for single targets:
z:   Zip.exe       .SYMBOLIC
n:   ZipNote.exe   .SYMBOLIC
c:   ZipCloak.exe  .SYMBOLIC
s:   ZipSplit.exe  .SYMBOLIC

Zip.exe:	$(OBDIR) $(OBJZA) $(OBJZB) $(OBJV)
	set WLK_VA=file {$(OBJZA)}
	set WLK_VB=file {$(OBJZB) $(OBJV)}
	$(link) $(lflags) $(ldebug) name $@ @WLK_VA @WLK_VB
	set WLK_VA=
	set WLK_VB=
# We use WLK_VA and WLK_VB to keep the size of each command under 256 chars.

ZipNote.exe:	$(OBDIR) $(OBJN)
	set WLK_VAR=file {$(OBJN)}
	$(link) $(lflags) $(ldebug) name $@ @WLK_VAR
	set WLK_VAR=

ZipCloak.exe:	$(OBDIR) $(OBJC)
	set WLK_VAR=file {$(OBJC)}
	$(link) $(lflags) $(ldebug) name $@ @WLK_VAR
	set WLK_VAR=

ZipSplit.exe:	$(OBDIR) $(OBJS)
	set WLK_VAR=file {$(OBJS)}
	$(link) $(lflags) $(ldebug) name $@ @WLK_VAR
	set WLK_VAR=

# Source dependencies:

$(O)crc32.obj:    crc32.c $(ZIP_H) crc32.h
$(O)crypt.obj:    crypt.c $(ZIP_H) crypt.h crc32.h ttyio.h
$(O)deflate.obj:  deflate.c $(ZIP_H)
$(O)fileio.obj:   fileio.c $(ZIP_H) crc32.h
$(O)globals.obj:  globals.c $(ZIP_H)
$(O)trees.obj:    trees.c $(ZIP_H)
$(O)ttyio.obj:    ttyio.c $(ZIP_H) crypt.h ttyio.h
$(O)util.obj:     util.c $(ZIP_H)
$(O)zip.obj:      zip.c $(ZIP_H) crc32.h crypt.h revision.h ttyio.h
$(O)zipfile.obj:  zipfile.c $(ZIP_H) crc32.h
$(O)zipup.obj:    zipup.c $(ZIP_H) revision.h crc32.h crypt.h msdos\zipup.h
$(O)zipnote.obj:  zipnote.c $(ZIP_H) revision.h
$(O)zipcloak.obj: zipcloak.c $(ZIP_H) revision.h crc32.h crypt.h ttyio.h
$(O)zipsplit.obj: zipsplit.c $(ZIP_H) revision.h

# Special case object files:

$(O)msdos.obj:    msdos\msdos.c $(ZIP_H)
	$(cc) $(cdebug) $(cflags) $(cvars) msdos\msdos.c -fo=$@

$(O)match.obj:    $(mat_s)
	$(asm) $(aflags) $(avars) $(mat_s) -fo=$@

$(O)crc.obj:      $(crc_s)
	$(asm) $(aflags) $(avars) $(crc_s) -fo=$@

# Variant object files for ZipNote, ZipCloak, and ZipSplit:

$(O)zipfile_.obj: zipfile.c $(ZIP_H) crc32.h
	$(cc) $(cdebug) $(cflags) $(cvars) -DUTIL zipfile.c -fo=$@

$(O)fileio_.obj:  fileio.c $(ZIP_H) crc32.h
	$(cc) $(cdebug) $(cflags) $(cvars) -DUTIL fileio.c -fo=$@

$(O)util_.obj:    util.c $(ZIP_H)
	$(cc) $(cdebug) $(cflags) $(cvars) -DUTIL util.c -fo=$@

$(O)crc32_.obj:   crc32.c $(ZIP_H) crc32.h
	$(cc) $(cdebug) $(cflags) $(cvars) -DUTIL crc32.c -fo=$@

$(O)crypt_.obj:   crypt.c $(ZIP_H) crc32.h crypt.h ttyio.h
	$(cc) $(cdebug) $(cflags) $(cvars) -DUTIL crypt.c -fo=$@

$(O)msdos_.obj:   msdos\msdos.c $(ZIP_H)
	$(cc) $(cdebug) $(cflags) $(cvars) -DUTIL msdos\msdos.c -fo=$@

# Creation of subdirectory for intermediate files
$(OBDIR):
	-mkdir $@

# Unwanted file removal:

clean:     .SYMBOLIC
	del $(O)*.obj

cleaner:   clean  .SYMBOLIC
	del Zip.exe
	del ZipNote.exe
	del ZipCloak.exe
	del ZipSplit.exe