1#***************************************************************************
2#                                  _   _ ____  _
3#  Project                     ___| | | |  _ \| |
4#                             / __| | | | |_) | |
5#                            | (__| |_| |  _ <| |___
6#                             \___|\___/|_| \_\_____|
7#
8# Copyright (C) 1999 - 2021, 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 https://curl.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
26#
27# Usage: see README.md
28#
29##############################################################
30
31CFGSET=FALSE
32WINBUILD_DIR=`cd`
33
34# Utilities.
35# If a path is required that contains characters such as space, quote the path.
36MT         = mt.exe
37RC         = rc.exe
38ZIP        = zip.exe
39
40# Allow changing C compiler via environment variable CC (default cl.exe)
41# This command macro is not set by default: https://msdn.microsoft.com/en-us/library/ms933742.aspx
42!If "$(CC)" == ""
43CC = cl.exe
44!Endif
45
46!IF "$(VC)"=="6"
47CC_NODEBUG  = $(CC) /O2 /DNDEBUG
48CC_DEBUG    = $(CC) /Od /Gm /Zi /D_DEBUG /GZ
49CFLAGS      = /I. /I../lib /I../include /nologo /W4 /GX /DWIN32 /YX /FD /c /DBUILDING_LIBCURL
50!ELSE
51CC_NODEBUG  = $(CC) /O2 /DNDEBUG
52CC_DEBUG    = $(CC) /Od /D_DEBUG /RTC1 /Z7 /LDd
53CFLAGS      = /I. /I ../lib /I../include /nologo /W4 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL
54!ENDIF
55
56LFLAGS     = /nologo /machine:$(MACHINE)
57LNKDLL     = link.exe /DLL
58# Use lib.exe instead of link.exe as link.exe /lib has the following bad habits:
59# - optimizing options like /opt:ref raises warnings (at least in Visual Studio 2015)
60# - all (including Windows) dependencies are aggregated (as static parts)
61# - link.exe /lib is not documented (anymore) at MSDN
62# Instead of id: just create an archive, that contains all objects
63LNKLIB     = lib.exe
64
65CFLAGS_PDB = /Zi
66LFLAGS_PDB = /incremental:no /opt:ref,icf /DEBUG
67
68CFLAGS_LIBCURL_STATIC  = /DCURL_STATICLIB
69
70WIN_LIBS    = ws2_32.lib wldap32.lib advapi32.lib crypt32.lib
71
72BASE_NAME              = libcurl
73BASE_NAME_DEBUG        = $(BASE_NAME)_debug
74BASE_NAME_STATIC       = $(BASE_NAME)_a
75BASE_NAME_STATIC_DEBUG = $(BASE_NAME_STATIC)_debug
76
77LIB_NAME_STATIC        = $(BASE_NAME_STATIC).lib
78LIB_NAME_STATIC_DEBUG  = $(BASE_NAME_STATIC_DEBUG).lib
79LIB_NAME_DLL           = $(BASE_NAME).dll
80LIB_NAME_IMP           = $(BASE_NAME).lib
81LIB_NAME_DLL_DEBUG     = $(BASE_NAME_DEBUG).dll
82LIB_NAME_IMP_DEBUG     = $(BASE_NAME_DEBUG).lib
83
84PDB_NAME_STATIC        = $(BASE_NAME_STATIC).pdb
85PDB_NAME_STATIC_DEBUG  = $(BASE_NAME_STATIC_DEBUG).pdb
86PDB_NAME_DLL           = $(BASE_NAME).pdb
87PDB_NAME_DLL_DEBUG     = $(BASE_NAME_DEBUG).pdb
88
89# CURL Command section
90PROGRAM_NAME  = curl.exe
91CURL_CFLAGS   = /I../lib /I../include /nologo /W4 /EHsc /DWIN32 /FD /c
92CURL_LFLAGS   = /out:$(DIRDIST)\bin\$(PROGRAM_NAME) /subsystem:console $(LFLAGS)
93CURL_RESFLAGS = /i../include
94
95#############################################################
96## Nothing more to do below this line!
97LIBCURL_SRC_DIR = ..\lib
98CURL_SRC_DIR = ..\src
99
100!IFNDEF WITH_DEVEL
101WITH_DEVEL   = ../../deps
102!ENDIF
103DEVEL_INCLUDE= $(WITH_DEVEL)/include
104DEVEL_LIB    = $(WITH_DEVEL)/lib
105
106!IF EXISTS("$(DEVEL_INCLUDE)")
107CFLAGS       = $(CFLAGS) /I"$(DEVEL_INCLUDE)"
108!ENDIF
109!IF EXISTS("$(DEVEL_LIB)")
110LFLAGS       = $(LFLAGS) "/LIBPATH:$(DEVEL_LIB)"
111!ENDIF
112
113!IFDEF SSL_PATH
114SSL_INC_DIR  = $(SSL_PATH)\include
115SSL_LIB_DIR  = $(SSL_PATH)\lib
116SSL_LFLAGS   = $(SSL_LFLAGS) "/LIBPATH:$(SSL_LIB_DIR)"
117!ELSE
118SSL_INC_DIR=$(DEVEL_INCLUDE)\openssl
119SSL_LIB_DIR=$(DEVEL_LIB)
120!ENDIF
121
122!IF "$(WITH_SSL)"=="dll" || "$(WITH_SSL)"=="static"
123!IF EXISTS("$(SSL_LIB_DIR)\libssl.lib")
124SSL_LIBS     = libssl.lib libcrypto.lib
125!ELSE
126SSL_LIBS     = libeay32.lib ssleay32.lib
127!ENDIF
128USE_SSL      = true
129SSL          = $(WITH_SSL)
130!IF "$(WITH_SSL)"=="static"
131WIN_LIBS     = $(WIN_LIBS) gdi32.lib user32.lib crypt32.lib
132!ENDIF
133!ENDIF
134
135!IFDEF USE_SSL
136SSL_CFLAGS   = /DUSE_OPENSSL /I"$(SSL_INC_DIR)"
137!IF EXISTS("$(SSL_INC_DIR)\is_boringssl.h")
138SSL_CFLAGS   = $(SSL_CFLAGS) /DHAVE_BORINGSSL
139!ENDIF
140!IF "$(ENABLE_OPENSSL_AUTO_LOAD_CONFIG)"=="false"
141SSL_CFLAGS   = $(SSL_CFLAGS) /DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG
142!ENDIF
143!ENDIF
144
145
146!IFDEF NGHTTP2_PATH
147NGHTTP2_INC_DIR  = $(NGHTTP2_PATH)\include
148NGHTTP2_LIB_DIR  = $(NGHTTP2_PATH)\lib
149NGHTTP2_LFLAGS   = $(NGHTTP2_LFLAGS) "/LIBPATH:$(NGHTTP2_LIB_DIR)"
150!ELSE
151NGHTTP2_INC_DIR  = $(DEVEL_INCLUDE)
152NGHTTP2_LIB_DIR  = $(DEVEL_LIB)
153!ENDIF
154
155!IF "$(WITH_NGHTTP2)"=="dll"
156NGHTTP2_CFLAGS   = /DUSE_NGHTTP2 /I"$(NGHTTP2_INC_DIR)"
157NGHTTP2_LIBS     = nghttp2.lib
158!ELSEIF "$(WITH_NGHTTP2)"=="static"
159NGHTTP2_CFLAGS   = /DUSE_NGHTTP2 /DNGHTTP2_STATICLIB /I"$(NGHTTP2_INC_DIR)"
160!IF EXISTS("$(NGHTTP2_LIB_DIR)\nghttp2_static.lib")
161NGHTTP2_LIBS     = nghttp2_static.lib
162!ELSE
163NGHTTP2_LIBS     = nghttp2.lib
164!ENDIF
165!ENDIF
166
167
168!IFDEF MBEDTLS_PATH
169MBEDTLS_INC_DIR  = $(MBEDTLS_PATH)\include
170MBEDTLS_LIB_DIR  = $(MBEDTLS_PATH)\lib
171MBEDTLS_LFLAGS   = $(MBEDTLS_LFLAGS) "/LIBPATH:$(MBEDTLS_LIB_DIR)"
172!ELSE
173MBEDTLS_INC_DIR  = $(DEVEL_INCLUDE)
174MBEDTLS_LIB_DIR  = $(DEVEL_LIB)
175!ENDIF
176
177!IF "$(WITH_MBEDTLS)"=="dll" || "$(WITH_MBEDTLS)"=="static"
178USE_MBEDTLS    = true
179MBEDTLS        = $(WITH_MBEDTLS)
180MBEDTLS_CFLAGS = /DUSE_MBEDTLS /I"$(MBEDTLS_INC_DIR)"
181MBEDTLS_LIBS   = mbedtls.lib mbedcrypto.lib mbedx509.lib
182!ENDIF
183
184
185!IFDEF CARES_PATH
186CARES_INC_DIR  = $(CARES_PATH)\include
187CARES_LIB_DIR  = $(CARES_PATH)\lib
188CARES_LFLAGS   = $(CARES_LFLAGS) "/LIBPATH:$(CARES_LIB_DIR)"
189!ELSE
190CARES_INC_DIR  = $(DEVEL_INCLUDE)/cares
191CARES_LIB_DIR  = $(DEVEL_LIB)
192!ENDIF
193
194!IF "$(WITH_CARES)"=="dll"
195!IF "$(DEBUG)"=="yes"
196CARES_LIBS     = caresd.lib
197!ELSE
198CARES_LIBS     = cares.lib
199!ENDIF
200USE_CARES      = true
201CARES          = dll
202!ELSEIF "$(WITH_CARES)"=="static"
203!IF "$(DEBUG)"=="yes"
204CARES_LIBS     = libcaresd.lib
205!ELSE
206CARES_LIBS     = libcares.lib
207!ENDIF
208USE_CARES      = true
209CARES          = static
210!ENDIF
211
212!IFDEF USE_CARES
213CARES_CFLAGS   = /DUSE_ARES /I"$(CARES_INC_DIR)"
214!IF "$(CARES)"=="static"
215CARES_CFLAGS   = $(CARES_CFLAGS) /DCARES_STATICLIB
216!ENDIF
217!ENDIF
218
219
220!IFDEF ZLIB_PATH
221ZLIB_INC_DIR = $(ZLIB_PATH)\include
222ZLIB_LIB_DIR = $(ZLIB_PATH)\lib
223ZLIB_LFLAGS  = $(ZLIB_LFLAGS) "/LIBPATH:$(ZLIB_LIB_DIR)"
224!ELSE
225ZLIB_INC_DIR = $(DEVEL_INCLUDE)
226ZLIB_LIB_DIR = $(DEVEL_LIB)
227!ENDIF
228
229# Depending on how zlib is built the libraries have different names, we
230# try to handle them all.
231!IF "$(WITH_ZLIB)"=="dll"
232!IF EXISTS("$(ZLIB_LIB_DIR)\zlibwapi.lib")
233ZLIB_LIBS = zlibwapi.lib
234ADDITIONAL_ZLIB_CFLAGS = /DZLIB_WINAPI
235!ELSEIF EXISTS("$(ZLIB_LIB_DIR)\zdll.lib")
236ZLIB_LIBS   = zdll.lib
237!ELSE
238ZLIB_LIBS   = zlib.lib
239!ENDIF
240USE_ZLIB    = true
241ZLIB        = dll
242!ELSEIF "$(WITH_ZLIB)"=="static"
243!IF EXISTS("$(ZLIB_LIB_DIR)\zlibstat.lib")
244ZLIB_LIBS   = zlibstat.lib
245ADDITIONAL_ZLIB_CFLAGS = /DZLIB_WINAPI
246!ELSEIF EXISTS("$(ZLIB_LIB_DIR)\zlib.lib")
247ZLIB_LIBS   = zlib.lib
248!ELSE
249ZLIB_LIBS   = zlib_a.lib
250!ENDIF
251USE_ZLIB    = true
252ZLIB        = static
253!ENDIF
254
255!IFDEF USE_ZLIB
256ZLIB_CFLAGS = /DHAVE_ZLIB_H /DHAVE_ZLIB /DHAVE_LIBZ $(ADDITIONAL_ZLIB_CFLAGS) /I"$(ZLIB_INC_DIR)"
257!ENDIF
258
259
260!IFDEF SSH2_PATH
261SSH2_INC_DIR= $(SSH2_PATH)\include
262SSH2_LIB_DIR= $(SSH2_PATH)\lib
263SSH2_LFLAGS = $(SSH2_LFLAGS) "/LIBPATH:$(SSH2_LIB_DIR)"
264!ELSE
265SSH2_LIB_DIR= $(DEVEL_LIB)
266SSH2_INC_DIR= $(DEVEL_INCLUDE)/libssh2
267!ENDIF
268
269!IF "$(WITH_SSH2)"=="dll"
270SSH2_LIBS   = libssh2.lib
271USE_SSH2    = true
272SSH2        = dll
273!ELSEIF "$(WITH_SSH2)"=="static"
274# libssh2 NMakefile on Windows at default creates a static library without _a suffix
275!IF EXISTS("$(SSH2_LIB_DIR)\libssh2.lib")
276SSH2_LIBS   = libssh2.lib
277!ELSE
278SSH2_LIBS   = libssh2_a.lib
279!ENDIF
280WIN_LIBS     = $(WIN_LIBS) user32.lib
281USE_SSH2    = true
282SSH2        = static
283!ENDIF
284
285!IFDEF USE_SSH2
286SSH2_CFLAGS = /DHAVE_LIBSSH2 /DHAVE_LIBSSH2_H /DLIBSSH2_WIN32 /DLIBSSH2_LIBRARY /DUSE_LIBSSH2
287SSH2_CFLAGS = $(SSH2_CFLAGS) /I$(SSH2_INC_DIR)
288!ENDIF
289
290
291!IFNDEF USE_IDN
292USE_IDN   = true
293!ELSEIF "$(USE_IDN)"=="yes"
294USE_IDN   = true
295!ENDIF
296
297!IF "$(USE_IDN)"=="true"
298IDN_CFLAGS = $(IDN_CFLAGS) /DUSE_WIN32_IDN /DWANT_IDN_PROTOTYPES
299WIN_LIBS   = $(WIN_LIBS) Normaliz.lib
300!ENDIF
301
302
303!IFNDEF USE_IPV6
304USE_IPV6  = true
305!ELSEIF "$(USE_IPV6)"=="yes"
306USE_IPV6  = true
307!ENDIF
308
309!IF "$(USE_IPV6)"=="true"
310IPV6_CFLAGS = $(IPV6_CFLAGS) /DUSE_IPV6
311!ENDIF
312
313
314!IFNDEF USE_SSPI
315USE_SSPI  = true
316!ELSEIF "$(USE_SSPI)"=="yes"
317USE_SSPI  = true
318!ENDIF
319
320!IF "$(USE_SSPI)"=="true"
321SSPI_CFLAGS = $(SSPI_CFLAGS) /DUSE_WINDOWS_SSPI
322!ENDIF
323
324
325!IFNDEF USE_SCHANNEL
326!IF "$(USE_SSL)"=="true"
327USE_SCHANNEL  = false
328!ELSE
329USE_SCHANNEL  = $(USE_SSPI)
330!ENDIF
331!ELSEIF "$(USE_SCHANNEL)"=="yes"
332USE_SCHANNEL  = true
333!ENDIF
334
335
336!IF "$(USE_SCHANNEL)"=="true"
337!IF "$(USE_SSPI)"!="true"
338!ERROR cannot build with Schannel without SSPI
339!ENDIF
340SSPI_CFLAGS = $(SSPI_CFLAGS) /DUSE_SCHANNEL
341WIN_LIBS    = $(WIN_LIBS) Crypt32.lib
342!ENDIF
343
344
345!IF "$(GEN_PDB)"=="yes"
346GEN_PDB = true
347!ENDIF
348
349
350!IFDEF EMBED_MANIFEST
351MANIFESTTOOL = $(MT) -manifest $(DIRDIST)\bin\$(PROGRAM_NAME).manifest -outputresource:$(DIRDIST)\bin\$(PROGRAM_NAME);1
352!ELSE
353CURL_RC_FLAGS = $(CURL_RC_FLAGS) /dCURL_EMBED_MANIFEST
354!ENDIF
355
356# Runtime library configuration
357!IF "$(RTLIBCFG)"=="static"
358RTLIB = /MT
359RTLIB_DEBUG = /MTd
360!ELSE
361RTLIB = /MD
362RTLIB_DEBUG  = /MDd
363!ENDIF
364
365!IF "$(MODE)"=="static"
366TARGET = $(LIB_NAME_STATIC)
367CURL_LIBCURL_LIBNAME=$(LIB_NAME_STATIC)
368AS_DLL = false
369CFGSET = true
370!ELSEIF "$(MODE)"=="dll"
371TARGET = $(LIB_NAME_DLL)
372CURL_LIBCURL_LIBNAME=$(LIB_NAME_IMP)
373AS_DLL = true
374CFGSET = true
375!ENDIF
376
377!IF "$(CFGSET)" == "FALSE"
378!ERROR please choose a valid mode
379!ENDIF
380
381
382
383# CURL_XX macros are for the curl.exe command
384
385!IF "$(DEBUG)"=="yes"
386RC_FLAGS = /dDEBUGBUILD=1 /Fo $@ $(LIBCURL_SRC_DIR)\libcurl.rc
387CURL_CC       = $(CC_DEBUG) $(RTLIB_DEBUG)
388CURL_RC_FLAGS = $(CURL_RC_FLAGS) /i../include /dDEBUGBUILD=1 /Fo $@ $(CURL_SRC_DIR)\curl.rc
389!ELSE
390RC_FLAGS = /dDEBUGBUILD=0 /Fo $@ $(LIBCURL_SRC_DIR)\libcurl.rc
391CURL_CC       = $(CC_NODEBUG) $(RTLIB)
392CURL_RC_FLAGS = $(CURL_RC_FLAGS) /i../include /dDEBUGBUILD=0 /Fo $@ $(CURL_SRC_DIR)\curl.rc
393!ENDIF
394
395!IF "$(AS_DLL)" == "true"
396
397LNK       = $(LNKDLL) $(LFLAGS) $(WIN_LIBS) /out:$(LIB_DIROBJ)\$(TARGET)
398!IF "$(DEBUG)"=="yes"
399TARGET    = $(LIB_NAME_DLL_DEBUG)
400LNK       = $(LNK) /DEBUG /IMPLIB:$(LIB_DIROBJ)\$(LIB_NAME_IMP_DEBUG)
401PDB       = $(PDB_NAME_DLL_DEBUG)
402CURL_LIBS = /IMPLIB:$(LIB_DIROBJ)\$(LIB_NAME_IMP_DEBUG)
403!ELSE
404TARGET    = $(LIB_NAME_DLL)
405LNK       = $(LNK)  /IMPLIB:$(LIB_DIROBJ)\$(LIB_NAME_IMP)
406PDB       = $(PDB_NAME_DLL)
407CURL_LIBS = /IMPLIB:$(LIB_DIROBJ)\$(LIB_NAME_IMP)
408!ENDIF
409RESOURCE  = $(LIB_DIROBJ)\libcurl.res
410
411# AS_DLL
412!ELSE
413
414!IF "$(DEBUG)"=="yes"
415TARGET   = $(LIB_NAME_STATIC_DEBUG)
416PDB      = $(PDB_NAME_STATIC_DEBUG)
417!ELSE
418TARGET   = $(LIB_NAME_STATIC)
419PDB      = $(PDB_NAME_STATIC)
420!ENDIF
421LNK      = $(LNKLIB) /out:$(LIB_DIROBJ)\$(TARGET)
422CURL_CC  = $(CURL_CC) $(CFLAGS_LIBCURL_STATIC)
423
424# AS_DLL
425!ENDIF
426
427!IF "$(USE_SSL)"=="true"
428CFLAGS = $(CFLAGS) $(SSL_CFLAGS)
429LFLAGS = $(LFLAGS) $(SSL_LFLAGS) $(SSL_LIBS)
430!ENDIF
431
432!IF "$(USE_MBEDTLS)"=="true"
433CFLAGS = $(CFLAGS) $(MBEDTLS_CFLAGS)
434LFLAGS = $(LFLAGS) $(MBEDTLS_LFLAGS) $(MBEDTLS_LIBS)
435!ENDIF
436
437!IF "$(USE_CARES)"=="true"
438CFLAGS = $(CFLAGS) $(CARES_CFLAGS)
439LFLAGS = $(LFLAGS) $(CARES_LFLAGS) $(CARES_LIBS)
440!ENDIF
441
442!IF "$(USE_ZLIB)"=="true"
443CFLAGS = $(CFLAGS) $(ZLIB_CFLAGS)
444LFLAGS = $(LFLAGS) $(ZLIB_LFLAGS) $(ZLIB_LIBS)
445!ENDIF
446
447!IF "$(USE_SSH2)"=="true"
448CFLAGS = $(CFLAGS) $(SSH2_CFLAGS)
449LFLAGS = $(LFLAGS) $(SSH2_LFLAGS) $(SSH2_LIBS)
450!ENDIF
451
452!IF "$(USE_IDN)"=="true"
453CFLAGS = $(CFLAGS) $(IDN_CFLAGS)
454!ENDIF
455
456!IF "$(USE_IPV6)"=="true"
457CFLAGS = $(CFLAGS) $(IPV6_CFLAGS)
458!ENDIF
459
460!IF "$(USE_SSPI)"=="true"
461CFLAGS = $(CFLAGS) $(SSPI_CFLAGS)
462!ENDIF
463
464!IF "$(USE_NGHTTP2)"=="true"
465CFLAGS = $(CFLAGS) $(NGHTTP2_CFLAGS)
466LFLAGS = $(LFLAGS) $(NGHTTP2_LFLAGS) $(NGHTTP2_LIBS)
467!ENDIF
468
469!IF "$(GEN_PDB)"=="true"
470CFLAGS = $(CFLAGS) $(CFLAGS_PDB) /Fd"$(LIB_DIROBJ)\$(PDB)"
471LFLAGS = $(LFLAGS) $(LFLAGS_PDB)
472!ENDIF
473
474!IF ( "$(USE_SSL)"=="true" && "$(USE_SCHANNEL)"=="true" ) \
475 || ( "$(USE_SSL)"=="true" && "$(USE_MBEDTLS)"=="true" ) \
476 || ( "$(USE_MBEDTLS)"=="true" && "$(USE_SCHANNEL)"=="true" )
477CFLAGS = $(CFLAGS) /DCURL_WITH_MULTI_SSL
478!ENDIF
479
480!IF "$(USE_UNICODE)"=="true"
481CFLAGS = $(CFLAGS) /DUNICODE /D_UNICODE
482!ENDIF
483
484LIB_DIROBJ = ..\builds\$(CONFIG_NAME_LIB)-obj-lib
485CURL_DIROBJ = ..\builds\$(CONFIG_NAME_LIB)-obj-curl
486
487!IFDEF WITH_PREFIX
488DIRDIST = $(WITH_PREFIX)
489!ELSE
490DIRDIST = ..\builds\$(CONFIG_NAME_LIB)\
491!ENDIF
492
493#
494# curl.exe
495#
496CURL_LINK = link.exe /incremental:no /libpath:"$(DIRDIST)\lib"
497
498!IF "$(CFGSET)" != "FALSE"
499# A mode was provided, so the library can be built.
500#
501!include CURL_OBJS.inc
502!include LIBCURL_OBJS.inc
503
504!IF "$(AS_DLL)" == "true"
505LIB_OBJS = $(LIBCURL_OBJS) $(RESOURCE)
506!ELSE
507LIB_OBJS = $(LIBCURL_OBJS)
508!ENDIF
509
510EXE_OBJS = $(CURL_OBJS) $(CURL_DIROBJ)\curl.res
511
512all : $(TARGET) $(PROGRAM_NAME)
513
514package: $(TARGET)
515	@cd $(DIRDIST)
516	@-$(ZIP) -9 -q -r ..\$(CONFIG_NAME_LIB).zip .>nul 2<&1
517	@cd $(MAKEDIR)
518
519$(TARGET): $(LIB_OBJS) $(LIB_DIROBJ) $(DIRDIST)
520	@echo Using SSL: $(USE_SSL)
521	@echo Using NGHTTP2: $(USE_NGHTTP2)
522	@echo Using c-ares: $(USE_CARES)
523	@echo Using SSH2: $(USE_SSH2)
524	@echo Using ZLIB: $(USE_ZLIB)
525	@echo Using IDN:  $(USE_IDN)
526	@echo Using IPv6: $(USE_IPV6)
527	@echo Using SSPI: $(USE_SSPI)
528	@echo Using Schannel: $(USE_SCHANNEL)
529	@echo CFLAGS:     $(CFLAGS)
530	@echo LFLAGS:     $(LFLAGS)
531	@echo GenPDB:     $(GEN_PDB)
532	@echo Debug:      $(DEBUG)
533	@echo Machine:    $(MACHINE)
534	$(LNK) $(LIB_OBJS)
535	@echo Copying libs...
536	@if exist $(LIB_DIROBJ)\$(LIB_NAME_DLL) copy $(LIB_DIROBJ)\$(LIB_NAME_DLL)       $(DIRDIST)\bin\ /y >nul 2<&1
537	@if exist $(LIB_DIROBJ)\$(LIB_NAME_STATIC) copy $(LIB_DIROBJ)\$(LIB_NAME_STATIC)    $(DIRDIST)\lib\ /y >nul 2<&1
538	@if exist $(LIB_DIROBJ)\$(LIB_NAME_DLL_DEBUG) copy $(LIB_DIROBJ)\$(LIB_NAME_DLL_DEBUG) $(DIRDIST)\bin\ /y >nul 2<&1
539	@if exist $(LIB_DIROBJ)\$(LIB_NAME_STATIC_DEBUG) copy $(LIB_DIROBJ)\$(LIB_NAME_STATIC_DEBUG) $(DIRDIST)\lib\ /y >nul 2<&1
540	@if exist $(LIB_DIROBJ)\$(LIB_NAME_IMP) copy $(LIB_DIROBJ)\$(LIB_NAME_IMP)       $(DIRDIST)\lib\ /y >nul 2<&1
541	@if exist $(LIB_DIROBJ)\$(LIB_NAME_IMP_DEBUG) copy $(LIB_DIROBJ)\$(LIB_NAME_IMP_DEBUG) $(DIRDIST)\lib >nul 2<&1
542	@-copy $(LIB_DIROBJ)\*.exp                 $(DIRDIST)\lib /y >nul 2<&1
543	@-copy $(LIB_DIROBJ)\*.pdb                 $(DIRDIST)\lib /y >nul 2<&1
544	@-copy ..\include\curl\*.h   $(DIRDIST)\include\curl\ /y  >nul 2<&1
545
546$(LIB_OBJS): $(LIB_DIROBJ) $(DIRDIST)
547
548$(DIRDIST):
549	@if not exist "$(DIRDIST)\bin" mkdir $(DIRDIST)\bin
550	@if not exist "$(DIRDIST)\include" mkdir $(DIRDIST)\include
551	@if not exist "$(DIRDIST)\include\curl" mkdir $(DIRDIST)\include\curl
552	@if not exist "$(DIRDIST)\lib" mkdir $(DIRDIST)\lib
553
554$(LIB_DIROBJ):
555	@if not exist "$(LIB_DIROBJ)" mkdir $(LIB_DIROBJ)
556	@if not exist "$(LIB_DIROBJ)\vauth" mkdir $(LIB_DIROBJ)\vauth
557	@if not exist "$(LIB_DIROBJ)\vtls" mkdir $(LIB_DIROBJ)\vtls
558	@if not exist "$(LIB_DIROBJ)\vssh" mkdir $(LIB_DIROBJ)\vssh
559	@if not exist "$(LIB_DIROBJ)\vquic" mkdir $(LIB_DIROBJ)\vquic
560
561$(CURL_DIROBJ):
562	@if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ)
563# we need a lib dir for the portability functions from libcurl
564# we use the .c directly here
565	@if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ)\lib
566
567.SUFFIXES: .c .obj .res
568
569{$(LIBCURL_SRC_DIR)\}.c{$(LIB_DIROBJ)\}.obj:
570	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<
571
572{$(LIBCURL_SRC_DIR)\vauth\}.c{$(LIB_DIROBJ)\vauth\}.obj:
573	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<
574
575{$(LIBCURL_SRC_DIR)\vtls\}.c{$(LIB_DIROBJ)\vtls\}.obj:
576	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<
577
578{$(LIBCURL_SRC_DIR)\vssh\}.c{$(LIB_DIROBJ)\vssh\}.obj:
579	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<
580
581{$(LIBCURL_SRC_DIR)\vquic\}.c{$(LIB_DIROBJ)\vquic\}.obj:
582	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<
583
584$(LIB_DIROBJ)\libcurl.res: $(LIBCURL_SRC_DIR)\libcurl.rc
585	$(RC) $(RC_FLAGS)
586
587#
588# curl.exe
589#
590
591
592!IF "$(MODE)"=="static"
593!IF "$(DEBUG)"=="yes"
594CURL_LIBCURL_LIBNAME=$(LIB_NAME_STATIC_DEBUG)
595!ELSE
596CURL_LIBCURL_LIBNAME=$(LIB_NAME_STATIC)
597!ENDIF
598!ELSEIF "$(MODE)"=="dll"
599!IF "$(DEBUG)"=="yes"
600CURL_LIBCURL_LIBNAME=$(LIB_NAME_IMP_DEBUG)
601!ELSE
602CURL_LIBCURL_LIBNAME=$(LIB_NAME_IMP)
603!ENDIF
604!ENDIF
605
606CURL_FROM_LIBCURL=$(CURL_DIROBJ)\tool_hugehelp.obj \
607 $(CURL_DIROBJ)\nonblock.obj \
608 $(CURL_DIROBJ)\strtoofft.obj \
609 $(CURL_DIROBJ)\warnless.obj \
610 $(CURL_DIROBJ)\curl_ctype.obj \
611 $(CURL_DIROBJ)\curl_multibyte.obj \
612 $(CURL_DIROBJ)\version_win32.obj \
613 $(CURL_DIROBJ)\dynbuf.obj
614
615$(PROGRAM_NAME): $(CURL_DIROBJ) $(CURL_FROM_LIBCURL) $(EXE_OBJS)
616	$(CURL_LINK) $(CURL_LFLAGS) $(CURL_LIBCURL_LIBNAME) $(WIN_LIBS) $(CURL_FROM_LIBCURL) $(EXE_OBJS)
617	$(MANIFESTTOOL)
618
619{$(CURL_SRC_DIR)\}.c{$(CURL_DIROBJ)\}.obj:
620	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@"  $<
621
622$(CURL_DIROBJ)\tool_hugehelp.obj: $(CURL_SRC_DIR)\tool_hugehelp.c
623	$(CURL_CC) $(CURL_CFLAGS) /Zm200 /Fo"$@" $(CURL_SRC_DIR)\tool_hugehelp.c
624$(CURL_DIROBJ)\nonblock.obj: ../lib/nonblock.c
625	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/nonblock.c
626$(CURL_DIROBJ)\strtoofft.obj: ../lib/strtoofft.c
627	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/strtoofft.c
628$(CURL_DIROBJ)\warnless.obj: ../lib/warnless.c
629	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/warnless.c
630$(CURL_DIROBJ)\curl_ctype.obj: ../lib/curl_ctype.c
631	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/curl_ctype.c
632$(CURL_DIROBJ)\curl_multibyte.obj: ../lib/curl_multibyte.c
633	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/curl_multibyte.c
634$(CURL_DIROBJ)\version_win32.obj: ../lib/version_win32.c
635	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/version_win32.c
636$(CURL_DIROBJ)\dynbuf.obj: ../lib/dynbuf.c
637	$(CURL_CC) $(CURL_CFLAGS) /Fo"$@" ../lib/dynbuf.c
638$(CURL_DIROBJ)\curl.res: $(CURL_SRC_DIR)\curl.rc
639	rc $(CURL_RC_FLAGS)
640
641!ENDIF  # End of case where a config was provided.
642
643clean:
644	@-erase /s *.dll 2> NUL
645	@-erase /s *.exp 2> NUL
646	@-erase /s *.idb 2> NUL
647	@-erase /s *.lib 2> NUL
648	@-erase /s *.obj 2> NUL
649	@-erase /s *.pch 2> NUL
650	@-erase /s *.pdb 2> NUL
651	@-erase /s *.res 2> NUL
652	@if exist $(LIB_DIROBJ) rd /s/q $(LIB_DIROBJ)
653	@if exist $(CURL_DIROBJ)rd /s/q $(CURL_DIROBJ)
654	@if exist $(DIRDIST) rd /s/q $(DIRDIST)
655