1#***************************************************************************
2#                                  _   _ ____  _
3#  Project                     ___| | | |  _ \| |
4#                             / __| | | | |_) | |
5#                            | (__| |_| |  _ <| |___
6#                             \___|\___/|_| \_\_____|
7#
8# Copyright (C) 1999 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
9#
10# This software is licensed as described in the file COPYING, which
11# you should have received as part of this distribution. The terms
12# are also available at http://curl.haxx.se/docs/copyright.html.
13#
14# You may opt to use, copy, modify, merge, publish, distribute and/or sell
15# copies of the Software, and permit persons to whom the Software is
16# furnished to do so, under the terms of the COPYING file.
17#
18# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19# KIND, either express or implied.
20#
21#***************************************************************************
22
23###########################################################################
24#
25# Makefile for building libcurl with MSVC 6, 7, 8, 9 and 10
26#
27# Usage: see usage message below
28#        Should be invoked from winbuild directory
29#        Edit the paths and desired library name
30#        SSL path is only required if you intend compiling
31#        with SSL.
32#
33# This make file leaves the result either a .lib or .dll file
34# in the \lib directory. It should be called from the \lib
35# directory.
36#
37# An option would have been to allow the source directory to
38# be specified, but I saw no requirement.
39#
40# Another option would have been to leave the .lib and .dll
41# files in the "cfg" directory, but then the make file
42# in \src would need to be changed.
43#
44##############################################################
45
46CFGSET=FALSE
47WINBUILD_DIR=`cd`
48ZIP        = zip.exe
49
50!IF "$(VC)"=="6"
51CC_NODEBUG  = cl.exe /O2 /DNDEBUG
52CC_DEBUG    = cl.exe /Od /Gm /Zi /D_DEBUG /GZ
53CFLAGS     = /I. /I../include /nologo /W3 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
54!ELSE
55CC_NODEBUG  = cl.exe /O2 /DNDEBUG
56CC_DEBUG    = cl.exe /Od /D_DEBUG /RTC1 /Z7 /LDd /W3
57CFLAGS      = /I. /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL
58!ENDIF
59
60LFLAGS     = /nologo /machine:$(MACHINE)
61LNKDLL     = link.exe /DLL
62LNKLIB     = link.exe /lib
63
64CFLAGS_PDB = /Zi
65LFLAGS_PDB = /incremental:no /opt:ref,icf
66
67CFLAGS_LIBCURL_STATIC  = /DCURL_STATICLIB
68
69LIB_NAME_STATIC        = libcurl_a.lib
70LIB_NAME_STATIC_DEBUG  = libcurl_a_debug.lib
71LIB_NAME_DLL           = libcurl.dll
72LIB_NAME_IMP           = libcurl.lib
73LIB_NAME_DLL_DEBUG     = libcurl_debug.dll
74LIB_NAME_IMP_DEBUG     = libcurl_debug.lib
75
76# CURL Command section
77PROGRAM_NAME = curl.exe
78CURL_CFLAGS   =  /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c
79CURL_LFLAGS   = /nologo /out:$(DIRDIST)\bin\$(PROGRAM_NAME) /subsystem:console /machine:$(MACHINE)
80CURL_RESFLAGS = /i../include
81
82#############################################################
83## Nothing more to do below this line!
84LIBCURL_SRC_DIR = ..\lib
85CURL_SRC_DIR = ..\src
86
87!IFNDEF WITH_DEVEL
88WITH_DEVEL          = ../../deps
89!ENDIF
90DEVEL_INCLUDE  = $(WITH_DEVEL)/include
91DEVEL_LIB      = $(WITH_DEVEL)/lib
92DEVEL_BIN      = $(WITH_DEVEL)/bin
93
94CFLAGS         = $(CFLAGS) /I"$(DEVEL_INCLUDE)"
95LFLAGS         = $(LFLAGS) "/LIBPATH:$(DEVEL_LIB)"
96
97!IF "$(WITH_SSL)"=="dll"
98SSL_LIBS     = libeay32.lib ssleay32.lib
99USE_SSL      = true
100SSL=dll
101!ELSEIF "$(WITH_SSL)"=="static"
102SSL_LIBS     = libeay32.lib ssleay32.lib
103USE_SSL      = true
104SSL=dll
105!ENDIF
106
107!IFDEF USE_SSL
108SSL_CFLAGS   = /DUSE_SSLEAY /I"$(DEVEL_INCLUDE)/openssl"
109!ENDIF
110
111!IF "$(WITH_ZLIB)"=="dll"
112ZLIB_LIBS   = zlib.lib
113ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ
114USE_ZLIB     = true
115zlib=dll
116!ELSEIF "$(WITH_ZLIB)"=="static"
117ZLIB_LIBS   = zlib_a.lib
118ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ
119USE_ZLIB    = true
120ZLIB=static
121!ENDIF
122
123!IFDEF USE_ZLIB
124ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ
125!ENDIF
126
127!IF "$(WITH_SSH2)"=="dll"
128SSH2_LIBS   = libssh2.lib
129USE_SSH2    = true
130SSH2=dll
131!ELSEIF "$(WITH_SSH2)"=="static"
132SSH2_LIBS   = libssh2_a_debug.lib
133USE_SSH2    = true
134SSH2=static
135!ENDIF
136
137!IFDEF USE_SSH2
138SSH2_CFLAGS   = /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /DUSE_LIBSSH2
139SSH2_CFLAGS   = $(SSH2_CFLAGS) /I$(WITH_DEVEL)/include/libssh2
140!ENDIF
141
142!IFNDEF USE_SSPI
143USE_SSPI=yes
144!ENDIF
145
146!IF "$(USE_SSPI)"=="yes"
147CFLAGS_SSPI = /DUSE_WINDOWS_SSPI
148USE_SSPI=true
149!ENDIF
150
151!IFNDEF USE_IPV6
152USE_IPV6=yes
153!ENDIF
154
155!IFNDEF USE_IDN
156USE_IDN   =true
157!ELSEIF "$(USE_IDN)"=="yes"
158USE_IDN   =true
159!ENDIF
160
161!IF "$(USE_IDN)"=="true"
162CFLAGS    = $(CFLAGS) /DUSE_WIN32_IDN
163LFLAGS    = $(LFLAGS) Normaliz.lib
164!ENDIF
165
166!IF "$(USE_IPV6)"=="yes"
167CFLAGS = $(CFLAGS) /DUSE_IPV6
168USE_IPV6=true
169!ENDIF
170
171!IF "$(GEN_PDB)"=="yes"
172GEN_PDB=true
173!ENDIF
174
175!IFNDEF MACHINE
176MACHINE = X86
177!ENDIF
178
179!IFDEF EMBEND_MANIFEST
180MANIFESTTOOL = mt -manifest $(DIRDIST)\$(PROGRAM_NAME).manifest -outputresource:$(DIRDIST)\$(PROGRAM_NAME);1
181!ENDIF
182
183# Runtime library configuration
184!IF "$(RTLIBCFG)" == "static"
185RTLIB  = /MT
186RTLIB_DEBUG = /MTd
187!ELSE
188RTLIB   = /MD
189RTLIB_DEBUG  = /MDd
190!ENDIF
191
192!IF "$(MODE)"=="static"
193TARGET = $(LIB_NAME_STATIC)
194CURL_LIBCURL_LIBNAME=$(LIB_NAME_STATIC)
195AS_DLL = false
196CFGSET=true
197!ELSEIF "$(MODE)"=="dll"
198TARGET = $(LIB_NAME_DLL)
199CURL_LIBCURL_LIBNAME=$(LIB_NAME_IMP)
200AS_DLL = true
201CFGSET=true
202!ENDIF
203
204WIN_LIBS    = ws2_32.lib wldap32.lib
205!IF "$(CFGSET)" == "FALSE"
206!ERROR please choose a valid mode
207!ENDIF
208
209CONFIG_NAME_LIB = libcurl
210
211# CURL_XX macros are for the curl.exe command
212
213!IF "$(DEBUG)"=="yes"
214RC_FLAGS = /dDEBUGBUILD=1 /Fo $@ $(LIBCURL_SRC_DIR)\libcurl.rc
215CC              = $(CC_DEBUG) $(RTLIB_DEBUG)
216
217CURL_CC         = $(CC)
218CURL_RC_FLAGS = /i../include /dDEBUGBUILD=1 /Fo $@ $(CURL_SRC_DIR)\curl.rc
219CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-debug
220!ELSE
221RC_FLAGS = /dDEBUGBUILD=0 /Fo $@ $(LIBCURL_SRC_DIR)\libcurl.rc
222CC              = $(CC_NODEBUG) $(RTLIB)
223
224CURL_CC         = $(CC)
225CURL_RC_FLAGS = /i../include /dDEBUGBUILD=0 /Fo $@ $(CURL_SRC_DIR)\curl.rc
226CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-release
227!ENDIF
228
229CURL_CC = $(CURL_CC) $(CURL_CFLAGS)
230
231!IF "$(AS_DLL)" == "true"
232
233LNK      = $(LNKDLL) $(WIN_LIBS) /out:$(LIB_DIROBJ)\$(TARGET)
234!IF "$(DEBUG)"=="yes"
235TARGET    = $(LIB_NAME_DLL_DEBUG)
236LNK       = $(LNK) /DEBUG /IMPLIB:$(LIB_DIROBJ)\$(LIB_NAME_IMP_DEBUG)
237CURL_LIBS = /IMPLIB:$(LIB_DIROBJ)\$(LIB_NAME_IMP_DEBUG)
238!ELSE
239TARGET    = $(LIB_NAME_DLL)
240LNK       = $(LNK)  /IMPLIB:$(LIB_DIROBJ)\$(LIB_NAME_IMP)
241CURL_LIBS = /IMPLIB:$(LIB_DIROBJ)\$(LIB_NAME_IMP)
242!ENDIF
243RESOURCE = $(LIB_DIROBJ)\libcurl.res
244CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-dll
245
246# AS_DLL
247!ELSE
248
249!IF "$(DEBUG)"=="yes"
250TARGET   = $(LIB_NAME_STATIC_DEBUG)
251!ELSE
252TARGET   = $(LIB_NAME_STATIC)
253!ENDIF
254LNK      = $(LNKLIB) $(WIN_LIBS) /out:$(LIB_DIROBJ)\$(TARGET)
255CC       = $(CC) $(CFLAGS_LIBCURL_STATIC)
256CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-static
257
258# AS_DLL
259!ENDIF
260
261!IF "$(USE_SSL)"=="true"
262CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
263LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(SSL_LIBS)
264CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-ssl-$(SSL)
265!ENDIF
266
267!IF "$(USE_ZLIB)"=="true"
268CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
269LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS) $(ZLIB_LIBS)
270CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-zlib-$(ZLIB)
271!ENDIF
272
273!IF "$(USE_SSH2)"=="true"
274CFLAGS = $(CFLAGS) $(SSH2_CFLAGS)
275LFLAGS = $(LFLAGS) $(SSH2_LFLAGS) $(SSH2_LIBS)
276CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-ssh2-$(SSH2)
277!ENDIF
278
279!IF "$(USE_IPV6)"=="true"
280CFLAGS = $(CFLAGS) $(CFLAGS_IPV6)
281CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-ipv6
282!ENDIF
283
284!IF "$(USE_SSPI)"=="true"
285CFLAGS = $(CFLAGS) $(CFLAGS_SSPI)
286CONFIG_NAME_LIB = $(CONFIG_NAME_LIB)-sspi
287!ENDIF
288
289!IF "$(GEN_PDB)"=="true"
290CFLAGS = $(CFLAGS) $(CFLAGS_PDB)
291LFLAGS = $(LFLAGS) $(LFLAGS_PDB)
292!ENDIF
293
294LIB_DIROBJ = ..\builds\$(CONFIG_NAME_LIB)-obj-lib
295CURL_DIROBJ = ..\builds\$(CONFIG_NAME_LIB)-obj-curl
296DIRDIST = ..\builds\$(CONFIG_NAME_LIB)\
297
298#
299# curl.exe
300#
301CURL_LINK = link.exe /incremental:no /libpath:"$(DIRDIST)\lib"
302
303#!IF "$(CFG)" == "release-ssh2-ssl-dll-zlib"
304#TARGET   = $(LIB_NAME_STATIC)
305#LNK      = $(LNKLIB) $(WINLIBS) $(SSLLIBS) $(ZLIBLIBS)  $(SSH2LIBS) $(SSL_LFLAGS) $(ZLIB_LFLAGS) $(LFLAGSSSH) /out:$(LIB_DIROBJ)\$(TARGET)
306#CC       = $(CCNODBG) $(RTLIB) $(SSL_CFLAGS) $(ZLIB_CFLAGS) $(CFLAGSLIB)  $(SSH2_CFLAGS)
307#CFGSET   = TRUE
308#!ENDIF
309
310#######################
311# Only the clean target can be used if a config was not provided.
312#
313!IF "$(CFGSET)" == "FALSE"
314clean:
315	@-erase /s *.dll 2> NUL
316	@-erase /s *.exp 2> NUL
317	@-erase /s *.idb 2> NUL
318	@-erase /s *.lib 2> NUL
319	@-erase /s *.obj 2> NUL
320	@-erase /s *.pch 2> NUL
321	@-erase /s *.pdb 2> NUL
322	@-erase /s *.res 2> NUL
323!ELSE
324# A mode was provided, so the library can be built.
325#
326!include CURL_OBJS.inc
327!include LIBCURL_OBJS.inc
328
329LIB_OBJS= $(LIBCURL_OBJS)
330EXE_OBJS= $(CURL_OBJS)
331
332all : $(TARGET) $(PROGRAM_NAME)
333
334package: $(TARGET)
335	@cd $(DIRDIST)
336	@-$(ZIP) -9 -q -r ..\$(CONFIG_NAME_LIB).zip .>nul 2<&1
337	@cd $(MAKEDIR)
338
339$(TARGET): $(LIB_OBJS) $(LIB_DIROBJ) $(DISTDIR)
340	@echo Using SSL: $(USE_SSL)
341	@echo Using SSH2: $(USE_SSH2)
342	@echo Using ZLIB: $(USE_ZLIB)
343	@echo Using SSPI: $(USE_SSPI)
344	@echo Using SSPI: $(LFLAGS)
345	@echo Gen PDB:    $(GEN_PDB)
346	@echo Debug:      $(DEBUG)
347	$(LNK) $(LFLAGS) $(LIB_OBJS)
348	@echo Copying libs...
349	@if exist $(LIB_DIROBJ)\$(LIB_NAME_DLL) copy $(LIB_DIROBJ)\$(LIB_NAME_DLL)       $(DIRDIST)\bin\ /y >nul 2<&1
350	@if exist $(LIB_DIROBJ)\$(LIB_NAME_STATIC) copy $(LIB_DIROBJ)\$(LIB_NAME_STATIC)    $(DIRDIST)\lib\ /y >nul 2<&1
351	@if exist $(LIB_DIROBJ)\$(LIB_NAME_DLL_DEBUG) copy $(LIB_DIROBJ)\$(LIB_NAME_DLL_DEBUG) $(DIRDIST)\bin\ /y >nul 2<&1
352	@if exist $(LIB_DIROBJ)\$(LIB_NAME_STATIC_DEBUG) copy $(LIB_DIROBJ)\$(LIB_NAME_STATIC_DEBUG) $(DIRDIST)\lib\ /y >nul 2<&1
353	@if exist $(LIB_DIROBJ)\$(LIB_NAME_IMP) copy $(LIB_DIROBJ)\$(LIB_NAME_IMP)       $(DIRDIST)\lib\ /y >nul 2<&1
354	@if exist $(LIB_DIROBJ)\$(LIB_NAME_IMP_DEBUG) copy $(LIB_DIROBJ)\$(LIB_NAME_IMP_DEBUG) $(DIRDIST)\lib >nul 2<&1
355	@-copy $(LIB_DIROBJ)\*.exp                 $(DIRDIST)\lib /y >nul 2<&1
356	@-copy $(LIB_DIROBJ)\*.pdb                 $(DIRDIST)\lib /y >nul 2<&1
357	@-copy ..\include\curl\*.h   $(DIRDIST)\include\curl\ /y  >nul 2<&1
358
359$(LIB_OBJS): $(LIB_DIROBJ) $(DIRDIST)
360
361$(DIRDIST):
362	@if not exist "$(DIRDIST)\bin" mkdir $(DIRDIST)\bin
363	@if not exist "$(DIRDIST)\include" mkdir $(DIRDIST)\include
364	@if not exist "$(DIRDIST)\include\curl" mkdir $(DIRDIST)\include\curl
365	@if not exist "$(DIRDIST)\lib" mkdir $(DIRDIST)\lib
366
367$(LIB_DIROBJ):
368	@if not exist "$(LIB_DIROBJ)" mkdir $(LIB_DIROBJ)
369
370$(CURL_DIROBJ):
371	@if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ)
372# we need a lib dir for the portability functions from libcurl
373# we use the .c directly here
374	@if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ)\lib
375
376.SUFFIXES: .c .obj .res
377
378{$(LIBCURL_SRC_DIR)\}.c{$(LIB_DIROBJ)\}.obj:
379	$(CC) $(CFLAGS) /Fo"$@"  $<
380
381$(LIB_DIROBJ)\libcurl.res: $(LIBCURL_SRC_DIR)\libcurl.rc
382	rc $(RC_FLAGS)
383
384#
385# curl.exe
386#
387
388
389!IF "$(MODE)"=="static"
390!IF "$(DEBUG)"=="yes"
391CURL_LIBCURL_LIBNAME=$(LIB_NAME_STATIC_DEBUG)
392!ELSE
393CURL_LIBCURL_LIBNAME=$(LIB_NAME_STATIC)
394!ENDIF
395!ELSEIF "$(MODE)"=="dll"
396!IF "$(DEBUG)"=="yes"
397CURL_LIBCURL_LIBNAME=$(LIB_NAME_IMP_DEBUG)
398!ELSE
399CURL_LIBCURL_LIBNAME=$(LIB_NAME_IMP)
400!ENDIF
401!ENDIF
402
403CURL_FROM_LIBCURL=$(CURL_DIROBJ)\hugehelp.obj \
404 $(CURL_DIROBJ)\nonblock.obj \
405 $(CURL_DIROBJ)\rawstr.obj \
406 $(CURL_DIROBJ)\strtoofft.obj
407 
408$(PROGRAM_NAME): $(CURL_DIROBJ) $(CURL_FROM_LIBCURL) $(EXE_OBJS)
409	$(CURL_LINK) $(CURL_LFLAGS) $(CURL_LIBCURL_LIBNAME) $(WIN_LIBS) $(CURL_FROM_LIBCURL) $(EXE_OBJS)
410	$(MANIFESTTOOL)
411
412{$(CURL_SRC_DIR)\}.c{$(CURL_DIROBJ)\}.obj:
413	$(CC) $(CURL_CFLAGS) /Fo"$@"  $<
414
415$(CURL_DIROBJ)\hugehelp.obj: $(CURL_SRC_DIR)\hugehelp.c
416	$(CURL_CC) $(CURL_CFLAGS) /Zm200 /Fo"$@" $(CURL_SRC_DIR)\hugehelp.c
417$(CURL_DIROBJ)\nonblock.obj: ../lib/nonblock.c
418	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/nonblock.c
419$(CURL_DIROBJ)\rawstr.obj: ../lib/rawstr.c
420	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/rawstr.c
421$(CURL_DIROBJ)\strtoofft.obj: ../lib/strtoofft.c
422	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/strtoofft.c
423$(CURL_DIROBJ)\curl.res: $(CURL_SRC_DIR)\curl.rc
424	rc $(CURL_RC_FLAGS)
425
426!ENDIF  # End of case where a config was provided.
427