1# Makefile for zlib using Microsoft (Visual) C
2# zlib is copyright (C) 1995-2006 Jean-loup Gailly and Mark Adler
3#
4# Usage:
5#   nmake -f win32/Makefile.msc                          (standard build)
6#   nmake -f win32/Makefile.msc LOC=-DFOO                (nonstandard build)
7
8# The toplevel directory of the source tree.
9#
10TOP = .
11
12# optional build flags
13LOC =
14
15# variables
16STATICLIB = zlib.lib
17SHAREDLIB = zlib1.dll
18IMPLIB    = zdll.lib
19SYMBOL_PREFIX =
20
21CC = cl
22LD = link
23AR = lib
24RC = rc
25CP = copy /y
26CFLAGS  = -nologo -MD -W3 -O2 -Oy- -Zi -Fd"zlib" $(LOC)
27WFLAGS  = \
28	-D_CRT_SECURE_NO_DEPRECATE \
29	-D_CRT_NONSTDC_NO_DEPRECATE \
30	-DX86_FEATURES \
31	-DX86_PCLMULQDQ_CRC \
32	-DX86_SSE2 \
33	-DX86_SSE42_ADLER32 \
34	-DX86_SSE42_CRC_INTRIN \
35	-DX86_SSE42_CRC_HASH \
36	-DX86_SSSE3_ADLER32 \
37	-DX86_AVX2 \
38	-DX86_AVX2_ADLER32 \
39	-DX86_AVX_CHUNKSET \
40	-DX86_SSE2_CHUNKSET
41
42LDFLAGS = -nologo -debug -incremental:no -opt:ref -manifest
43ARFLAGS = -nologo
44RCFLAGS = /dWIN32 /r
45DEFFILE = zlib.def
46RCFILE = zlib1.rc
47RESFILE = zlib1.res
48WITH_GZFILEOP = yes
49ZLIB_COMPAT =
50SUFFIX =
51
52OBJS = \
53	adler32.obj \
54	adler32_avx2.obj \
55	adler32_avx512.obj \
56	adler32_avx512_vnni.obj \
57	adler32_sse42.obj \
58	adler32_ssse3.obj \
59	adler32_fold.obj \
60	chunkset.obj \
61	chunkset_avx.obj \
62	chunkset_sse2.obj \
63	compare256.obj \
64	compare256_avx2.obj \
65	compare256_sse2.obj \
66	compress.obj \
67	cpu_features.obj \
68	crc32_braid.obj \
69	crc32_braid_comb.obj \
70	crc32_fold.obj \
71	crc32_fold_pclmulqdq.obj \
72	deflate.obj \
73	deflate_fast.obj \
74	deflate_huff.obj \
75	deflate_medium.obj \
76	deflate_quick.obj \
77	deflate_rle.obj \
78	deflate_slow.obj \
79	deflate_stored.obj \
80	functable.obj \
81	infback.obj \
82	inflate.obj \
83	inftrees.obj \
84	inffast.obj \
85	insert_string.obj \
86	insert_string_roll.obj \
87	insert_string_sse42.obj \
88	slide_hash.obj \
89	slide_hash_avx2.obj \
90	slide_hash_sse2.obj \
91	trees.obj \
92	uncompr.obj \
93	zutil.obj \
94	x86_features.obj \
95	#
96!if "$(ZLIB_COMPAT)" != ""
97WITH_GZFILEOP = yes
98WFLAGS = $(WFLAGS) -DZLIB_COMPAT
99DEFFILE = zlibcompat.def
100!else
101STATICLIB = zlib-ng.lib
102SHAREDLIB = zlib-ng1.dll
103IMPLIB = zngdll.lib
104DEFFILE = zlib-ng.def
105RCFILE = zlib-ng1.rc
106RESFILE = zlib-ng1.res
107SUFFIX = -ng
108!endif
109
110!if "$(WITH_GZFILEOP)" != ""
111WFLAGS = $(WFLAGS) -DWITH_GZFILEOP
112OBJS = $(OBJS) gzlib.obj gzread.obj gzwrite.obj
113!endif
114
115# targets
116all: $(STATICLIB) $(SHAREDLIB) $(IMPLIB) \
117     example.exe minigzip.exe example_d.exe minigzip_d.exe
118
119!if "$(SYMBOL_PREFIX)" != ""
120zlib_name_mangling$(SUFFIX).h: zlib_name_mangling$(SUFFIX).h.in
121	cscript $(TOP)\win32\replace.vbs $(TOP)\zlib_name_mangling$(SUFFIX).h.in zlib_name_mangling$(SUFFIX).h "@ZLIB_SYMBOL_PREFIX@" "$(SYMBOL_PREFIX)"
122!else
123zlib_name_mangling$(SUFFIX).h: zlib_name_mangling.h.empty
124	$(CP) $(TOP)\zlib_name_mangling.h.empty zlib_name_mangling$(SUFFIX).h
125!endif
126
127zlib$(SUFFIX).h: zlib$(SUFFIX).h.in
128	cscript $(TOP)\win32\replace.vbs $(TOP)\zlib$(SUFFIX).h.in zlib$(SUFFIX).h "@ZLIB_SYMBOL_PREFIX@" "$(SYMBOL_PREFIX)"
129
130gzread.c: gzread.c.in
131	cscript $(TOP)\win32\replace.vbs $(TOP)\gzread.c.in gzread.c "@ZLIB_SYMBOL_PREFIX@" "$(SYMBOL_PREFIX)"
132
133zconf: $(TOP)/zconf$(SUFFIX).h.in $(TOP)/zlib$(SUFFIX).h $(TOP)/zlib_name_mangling$(SUFFIX).h
134	$(CP) $(TOP)\zconf$(SUFFIX).h.in $(TOP)\zconf$(SUFFIX).h
135
136$(TOP)/win32/$(DEFFILE): $(TOP)/win32/$(DEFFILE).in
137	cscript $(TOP)\win32\replace.vbs $(TOP)/win32/$(DEFFILE).in $(TOP)/win32/$(DEFFILE) "@ZLIB_SYMBOL_PREFIX@" "$(SYMBOL_PREFIX)"
138
139$(STATICLIB): zconf $(OBJS)
140	$(AR) $(ARFLAGS) -out:$@ $(OBJS)
141
142$(IMPLIB): $(SHAREDLIB)
143
144$(SHAREDLIB): zconf $(TOP)/win32/$(DEFFILE) $(OBJS) $(RESFILE)
145	$(LD) $(LDFLAGS) -def:$(TOP)/win32/$(DEFFILE) -dll -implib:$(IMPLIB) \
146	  -out:$@ $(OBJS) $(RESFILE)
147	if exist $@.manifest \
148	  mt -nologo -manifest $@.manifest -outputresource:$@;2
149
150example.exe: example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB)
151	$(LD) $(LDFLAGS) example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB)
152	if exist $@.manifest \
153	  mt -nologo -manifest $@.manifest -outputresource:$@;1
154
155minigzip.exe: minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB)
156	$(LD) $(LDFLAGS) minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(STATICLIB)
157	if exist $@.manifest \
158	  mt -nologo -manifest $@.manifest -outputresource:$@;1
159
160example_d.exe: example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB)
161	$(LD) $(LDFLAGS) -out:$@ example.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB)
162	if exist $@.manifest \
163	  mt -nologo -manifest $@.manifest -outputresource:$@;1
164
165minigzip_d.exe: minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB)
166	$(LD) $(LDFLAGS) -out:$@ minigzip.obj gzlib2.obj gzread2.obj gzwrite2.obj $(IMPLIB)
167	if exist $@.manifest \
168	  mt -nologo -manifest $@.manifest -outputresource:$@;1
169
170{$(TOP)}.c.obj:
171	$(CC) -c $(WFLAGS) $(CFLAGS) $<
172
173gzlib2.obj: gzlib.c
174	$(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzlib2.obj gzlib.c
175
176gzread2.obj: gzread.c
177	$(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzread2.obj gzread.c
178
179gzwrite2.obj: gzwrite.c
180	$(CC) -c $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP -Fogzwrite2.obj gzwrite.c
181
182{$(TOP)/arch/x86}.c.obj:
183	$(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) $<
184
185{$(TOP)/test}.c.obj:
186	$(CC) -c -I$(TOP) $(WFLAGS) $(CFLAGS) -DWITH_GZFILEOP $<
187
188$(TOP)/zconf$(SUFFIX).h: zconf
189
190SRCDIR = $(TOP)
191# Keep the dependences in sync with top-level Makefile.in
192adler32.obj: $(SRCDIR)/adler32.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/functable.h $(SRCDIR)/adler32_p.h
193adler32_avx2.obj: $(SRCDIR)/arch/x86/adler32_avx2.c $(SRCDIR)/zbuild.h $(SRCDIR)/cpu_features.h $(SRCDIR)/adler32_p.h $(SRCDIR)/fallback_builtins.h
194adler32_avx512.obj: $(SRCDIR)/arch/x86/adler32_avx512.c $(SRCDIR)/zbuild.h $(SRCDIR)/cpu_features.h $(SRCDIR)/adler32_p.h $(SRCDIR)/arch/x86/adler32_avx512_p.h
195adler32_avx512_vnni.obj: $(SRCDIR)/arch/x86/adler32_avx512_vnni.c $(SRCDIR)/zbuild.h $(SRCDIR)/cpu_features.h $(SRCDIR)/adler32_p.h $(SRCDIR)/arch/x86/adler32_avx512_p.h
196adler32_sse42.obj: $(SRCDIR)/arch/x86/adler32_sse42.c $(SRCDIR)/zbuild.h $(SRCDIR)/cpu_features.h $(SRCDIR)/adler32_p.h $(SRCDIR)/adler32_fold.h \
197                   $(SRCDIR)/arch/x86/adler32_ssse3_p.h
198adler32_ssse3.obj: $(SRCDIR)/arch/x86/adler32_ssse3.c $(SRCDIR)/zbuild.h $(SRCDIR)/cpu_features.h $(SRCDIR)/adler32_p.h $(SRCDIR)/adler32_fold.h \
199                   $(SRCDIR)/arch/x86/adler32_ssse3_p.h
200adler32_fold.obj: $(SRCDIR)/adler32_fold.c $(SRCDIR)/zbuild.h $(SRCDIR)/adler32_fold.h $(SRCDIR)/functable.h
201functable.obj: $(SRCDIR)/functable.c $(SRCDIR)/zbuild.h $(SRCDIR)/functable.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/zendian.h $(SRCDIR)/arch/x86/x86_features.h
202gzlib.obj: $(SRCDIR)/gzlib.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h
203gzread.obj: $(SRCDIR)/gzread.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h
204gzwrite.obj: $(SRCDIR)/gzwrite.c $(SRCDIR)/zbuild.h $(SRCDIR)/gzguts.h $(SRCDIR)/zutil_p.h
205compress.obj: $(SRCDIR)/compress.c $(SRCDIR)/zbuild.h $(SRCDIR)/zlib$(SUFFIX).h
206uncompr.obj: $(SRCDIR)/uncompr.c $(SRCDIR)/zbuild.h $(SRCDIR)/zlib$(SUFFIX).h
207chunkset.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h
208chunkset_avx.obj: $(SRCDIR)/arch/x86/chunkset_avx.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h
209chunkset_sse2.obj: $(SRCDIR)/arch/x86/chunkset_sse2.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h
210cpu_features.obj: $(SRCDIR)/cpu_features.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h
211crc32_braid.obj: $(SRCDIR)/crc32_braid.c $(SRCDIR)/zbuild.h $(SRCDIR)/zendian.h $(SRCDIR)/deflate.h $(SRCDIR)/functable.h $(SRCDIR)/crc32_braid_p.h $(SRCDIR)/crc32_braid_tbl.h
212crc32_braid_comb.obj: $(SRCDIR)/crc32_braid_comb.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/crc32_braid_p.h $(SRCDIR)/crc32_braid_tbl.h $(SRCDIR)/crc32_braid_comb_p.h
213crc32_fold.obj: $(SRCDIR)/crc32_fold.c $(SRCDIR)/zbuild.h
214crc32_fold_pclmulqdq.obj: $(SRCDIR)/arch/x86/crc32_fold_pclmulqdq.c $(SRCDIR)/crc32_fold.h $(SRCDIR)/zbuild.h
215deflate.obj: $(SRCDIR)/deflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
216deflate_fast.obj: $(SRCDIR)/deflate_fast.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
217deflate_huff.obj: $(SRCDIR)/deflate_huff.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
218deflate_medium.obj: $(SRCDIR)/deflate_medium.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
219deflate_quick.obj: $(SRCDIR)/deflate_quick.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h $(SRCDIR)/trees_emit.h
220deflate_rle.obj: $(SRCDIR)/deflate_rle.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
221deflate_slow.obj: $(SRCDIR)/deflate_slow.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
222deflate_stored.obj: $(SRCDIR)/deflate_stored.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/deflate_p.h $(SRCDIR)/functable.h
223infback.obj: $(SRCDIR)/infback.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h
224inffast.obj: $(SRCDIR)/inffast.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h
225inflate.obj: $(SRCDIR)/inflate.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h $(SRCDIR)/inflate.h $(SRCDIR)/inffast.h $(SRCDIR)/functable.h $(SRCDIR)/functable.h
226inftrees.obj: $(SRCDIR)/inftrees.c $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/inftrees.h
227slide_hash.obj: $(SRCDIR)/slide_hash.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h
228slide_hash_avx2.obj: $(SRCDIR)/arch/x86/slide_hash_avx2.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h
229slide_hash_sse2.obj: $(SRCDIR)/arch/x86/slide_hash_sse2.c $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h
230trees.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/deflate.h $(SRCDIR)/trees_tbl.h
231zutil.obj: $(SRCDIR)/zbuild.h $(SRCDIR)/zutil.h $(SRCDIR)/zutil_p.h
232
233example.obj: $(TOP)/test/example.c $(TOP)/zbuild.h $(TOP)/zlib$(SUFFIX).h
234
235minigzip.obj: $(TOP)/test/minigzip.c $(TOP)/zbuild.h $(TOP)/zlib$(SUFFIX).h
236
237$(RESFILE): $(TOP)/win32/$(RCFILE)
238	$(RC) $(RCFLAGS) /fo$@ $(TOP)/win32/$(RCFILE)
239
240# testing
241test: example.exe minigzip.exe
242	example
243	echo hello world | minigzip | minigzip -d
244
245testdll: example_d.exe minigzip_d.exe
246	example_d
247	echo hello world | minigzip_d | minigzip_d -d
248
249
250# cleanup
251clean:
252	-del $(STATICLIB)
253	-del $(SHAREDLIB)
254	-del $(IMPLIB)
255	-del *.obj
256	-del *.res
257	-del *.exp
258	-del *.exe
259	-del *.pdb
260	-del *.manifest
261
262distclean: clean
263	-del zconf$(SUFFIX).h
264	-del zlib$(SUFFIX).h
265	-del zlib_name_mangling$(SUFFIX).h
266	-del $(TOP)\win32\zlib.def
267	-del $(TOP)\win32\zlibcompat.def
268	-del $(TOP)\win32\zlib-ng.def
269	-del gzread.c
270