blob: 40852e5730f7714a85ba9990c4dc26b5763346a8 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001#***************************************************************************
2# _ _ ____ _
3# Project ___| | | | _ \| |
4# / __| | | | |_) | |
5# | (__| |_| | _ <| |___
6# \___|\___/|_| \_\_____|
7#
8# Copyright (C) 1999 - 2015, 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.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 curl.exe with MingW (GCC-3.2 or later)
26## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4)
27##
28## Usage: mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
29## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
30##
31## Hint: you can also set environment vars to control the build, f.e.:
32## set ZLIB_PATH=c:/zlib-1.2.8
33## set ZLIB=1
34#
35###########################################################################
36
37# Edit the path below to point to the base of your Zlib sources.
38ifndef ZLIB_PATH
39ZLIB_PATH = ../../zlib-1.2.8
40endif
41# Edit the path below to point to the base of your OpenSSL package.
42ifndef OPENSSL_PATH
43OPENSSL_PATH = ../../openssl-1.0.2a
44endif
45# Edit the path below to point to the base of your LibSSH2 package.
46ifndef LIBSSH2_PATH
47LIBSSH2_PATH = ../../libssh2-1.5.0
48endif
49# Edit the path below to point to the base of your librtmp package.
50ifndef LIBRTMP_PATH
51LIBRTMP_PATH = ../../librtmp-2.4
52endif
53# Edit the path below to point to the base of your libmetalink package.
54ifndef LIBMETALINK_PATH
55LIBMETALINK_PATH = ../../libmetalink-0.1.3
56endif
57# Edit the path below to point to the base of your libexpat package.
58ifndef LIBEXPAT_PATH
59LIBEXPAT_PATH = ../../expat-2.1.0
60endif
61# Edit the path below to point to the base of your libxml2 package.
62ifndef LIBXML2_PATH
63LIBXML2_PATH = ../../libxml2-2.9.2
64endif
65# Edit the path below to point to the base of your libidn package.
66ifndef LIBIDN_PATH
67LIBIDN_PATH = ../../libidn-1.32
68endif
69# Edit the path below to point to the base of your MS IDN package.
70# Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1
71# https://www.microsoft.com/en-us/download/details.aspx?id=734
72ifndef WINIDN_PATH
73WINIDN_PATH = ../../Microsoft IDN Mitigation APIs
74endif
75# Edit the path below to point to the base of your Novell LDAP NDK.
76ifndef LDAP_SDK
77LDAP_SDK = c:/novell/ndk/cldapsdk/win32
78endif
79# Edit the path below to point to the base of your nghttp2 package.
80ifndef NGHTTP2_PATH
81NGHTTP2_PATH = ../../nghttp2-1.0.0
82endif
83
84PROOT = ..
85
86# Edit the path below to point to the base of your c-ares package.
87ifndef LIBCARES_PATH
88LIBCARES_PATH = $(PROOT)/ares
89endif
90
91CC = $(CROSSPREFIX)gcc
92CFLAGS = $(CURL_CFLAG_EXTRAS) -g -O2 -Wall
93CFLAGS += -fno-strict-aliasing
94# comment LDFLAGS below to keep debug info
95LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_EXE) -s
96AR = $(CROSSPREFIX)ar
97RC = $(CROSSPREFIX)windres
98RCFLAGS = --include-dir=$(PROOT)/include -O COFF
99STRIP = $(CROSSPREFIX)strip -g
100
101# We may need these someday
102# PERL = perl
103# NROFF = nroff
104
105# Set environment var ARCH to your architecture to override autodetection.
106ifndef ARCH
107ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)
108ARCH = w64
109else
110ARCH = w32
111endif
112endif
113
114ifeq ($(ARCH),w64)
115CFLAGS += -m64 -D_AMD64_
116LDFLAGS += -m64
117RCFLAGS += -F pe-x86-64
118else
119CFLAGS += -m32
120LDFLAGS += -m32
121RCFLAGS += -F pe-i386
122endif
123
124# Platform-dependent helper tool macros
125ifeq ($(findstring /sh,$(SHELL)),/sh)
126DEL = rm -f $1
127RMDIR = rm -fr $1
128MKDIR = mkdir -p $1
129COPY = -cp -afv $1 $2
130#COPYR = -cp -afr $1/* $2
131COPYR = -rsync -aC $1/* $2
132TOUCH = touch $1
133CAT = cat
134ECHONL = echo ""
135DL = '
136else
137ifeq "$(OS)" "Windows_NT"
138DEL = -del 2>NUL /q /f $(subst /,\,$1)
139RMDIR = -rd 2>NUL /q /s $(subst /,\,$1)
140else
141DEL = -del 2>NUL $(subst /,\,$1)
142RMDIR = -deltree 2>NUL /y $(subst /,\,$1)
143endif
144MKDIR = -md 2>NUL $(subst /,\,$1)
145COPY = -copy 2>NUL /y $(subst /,\,$1) $(subst /,\,$2)
146COPYR = -xcopy 2>NUL /q /y /e $(subst /,\,$1) $(subst /,\,$2)
147TOUCH = copy 2>&1>NUL /b $(subst /,\,$1) +,,
148CAT = type
149ECHONL = $(ComSpec) /c echo.
150endif
151
152########################################################
153## Nothing more to do below this line!
154
155ifeq ($(findstring -dyn,$(CFG)),-dyn)
156DYN = 1
157endif
158ifeq ($(findstring -ares,$(CFG)),-ares)
159ARES = 1
160endif
161ifeq ($(findstring -sync,$(CFG)),-sync)
162SYNC = 1
163endif
164ifeq ($(findstring -rtmp,$(CFG)),-rtmp)
165RTMP = 1
166SSL = 1
167ZLIB = 1
168endif
169ifeq ($(findstring -ssh2,$(CFG)),-ssh2)
170SSH2 = 1
171ifneq ($(findstring -winssl,$(CFG)),-winssl)
172SSL = 1
173endif
174ZLIB = 1
175endif
176ifeq ($(findstring -ssl,$(CFG)),-ssl)
177SSL = 1
178endif
179ifeq ($(findstring -zlib,$(CFG)),-zlib)
180ZLIB = 1
181endif
182ifeq ($(findstring -idn,$(CFG)),-idn)
183IDN = 1
184endif
185ifeq ($(findstring -winidn,$(CFG)),-winidn)
186WINIDN = 1
187endif
188ifeq ($(findstring -sspi,$(CFG)),-sspi)
189SSPI = 1
190endif
191ifeq ($(findstring -ldaps,$(CFG)),-ldaps)
192LDAPS = 1
193endif
194ifeq ($(findstring -ipv6,$(CFG)),-ipv6)
195IPV6 = 1
196endif
197ifeq ($(findstring -metalink,$(CFG)),-metalink)
198METALINK = 1
199endif
200ifeq ($(findstring -winssl,$(CFG)),-winssl)
201WINSSL = 1
202SSPI = 1
203endif
204ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2)
205NGHTTP2 = 1
206endif
207
208INCLUDES = -I. -I../include -I../lib
209
210ifdef DYN
211 curl_DEPENDENCIES = $(PROOT)/lib/libcurldll.a $(PROOT)/lib/libcurl.dll
212 curl_LDADD = -L$(PROOT)/lib -lcurldll
213else
214 curl_DEPENDENCIES = $(PROOT)/lib/libcurl.a
215 curl_LDADD = -L$(PROOT)/lib -lcurl
216 CFLAGS += -DCURL_STATICLIB
217 LDFLAGS += -static
218endif
219ifdef SYNC
220 CFLAGS += -DUSE_SYNC_DNS
221else
222 ifdef ARES
223 ifndef DYN
224 curl_DEPENDENCIES += $(LIBCARES_PATH)/libcares.a
225 endif
226 CFLAGS += -DUSE_ARES -DCARES_STATICLIB
227 curl_LDADD += -L"$(LIBCARES_PATH)" -lcares
228 endif
229endif
230ifdef RTMP
231 CFLAGS += -DUSE_LIBRTMP
232 curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
233endif
234ifdef NGHTTP2
235 CFLAGS += -DUSE_NGHTTP2
236 curl_LDADD += -L"$(NGHTTP2_PATH)/lib" -lnghttp2
237endif
238ifdef SSH2
239 CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
240 curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2
241 ifdef WINSSL
242 ifndef DYN
243 curl_LDADD += -lbcrypt -lcrypt32
244 endif
245 endif
246endif
247ifdef SSL
248 ifndef OPENSSL_INCLUDE
249 ifeq "$(wildcard $(OPENSSL_PATH)/outinc)" "$(OPENSSL_PATH)/outinc"
250 OPENSSL_INCLUDE = $(OPENSSL_PATH)/outinc
251 endif
252 ifeq "$(wildcard $(OPENSSL_PATH)/include)" "$(OPENSSL_PATH)/include"
253 OPENSSL_INCLUDE = $(OPENSSL_PATH)/include
254 endif
255 endif
256 ifneq "$(wildcard $(OPENSSL_INCLUDE)/openssl/opensslv.h)" "$(OPENSSL_INCLUDE)/openssl/opensslv.h"
257 $(error Invalid path to OpenSSL package: $(OPENSSL_PATH))
258 endif
259 ifndef OPENSSL_LIBPATH
260 OPENSSL_LIBS = -lssl -lcrypto
261 ifeq "$(wildcard $(OPENSSL_PATH)/out)" "$(OPENSSL_PATH)/out"
262 OPENSSL_LIBPATH = $(OPENSSL_PATH)/out
263 ifdef DYN
264 OPENSSL_LIBS = -lssl32 -leay32
265 endif
266 endif
267 ifeq "$(wildcard $(OPENSSL_PATH)/lib)" "$(OPENSSL_PATH)/lib"
268 OPENSSL_LIBPATH = $(OPENSSL_PATH)/lib
269 endif
270 endif
271 ifndef DYN
272 OPENSSL_LIBS += -lgdi32 -lcrypt32
273 endif
274 INCLUDES += -I"$(OPENSSL_INCLUDE)"
275 CFLAGS += -DUSE_OPENSSL
276 curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
277else
278ifdef WINSSL
279 curl_LDADD += -lcrypt32
280endif
281endif
282ifdef ZLIB
283 INCLUDES += -I"$(ZLIB_PATH)"
284 CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
285 curl_LDADD += -L"$(ZLIB_PATH)" -lz
286endif
287ifdef IDN
288 CFLAGS += -DUSE_LIBIDN
289 curl_LDADD += -L"$(LIBIDN_PATH)/lib" -lidn
290else
291ifdef WINIDN
292 CFLAGS += -DUSE_WIN32_IDN
293 curl_LDADD += -L"$(WINIDN_PATH)" -lnormaliz
294endif
295endif
296ifdef METALINK
297 INCLUDES += -I"$(LIBMETALINK_PATH)/include"
298 CFLAGS += -DUSE_METALINK
299 curl_LDADD += -L"$(LIBMETALINK_PATH)/lib" -lmetalink
300 ifndef DYN
301 ifeq ($(findstring libexpat_metalink_parser.o,$(shell $(AR) t "$(LIBMETALINK_PATH)/lib/libmetalink.a")),libexpat_metalink_parser.o)
302 curl_LDADD += -L"$(LIBEXPAT_PATH)/lib" -lexpat
303 else
304 curl_LDADD += -L"$(LIBXML2_PATH)/lib" -lxml2
305 endif
306 endif
307endif
308ifdef SSPI
309 CFLAGS += -DUSE_WINDOWS_SSPI
310 ifdef WINSSL
311 CFLAGS += -DUSE_SCHANNEL
312 endif
313endif
314ifdef IPV6
315 CFLAGS += -DENABLE_IPV6 -D_WIN32_WINNT=0x0501
316endif
317ifdef LDAPS
318 CFLAGS += -DHAVE_LDAP_SSL
319endif
320ifdef USE_LDAP_NOVELL
321 CFLAGS += -DCURL_HAS_NOVELL_LDAPSDK
322 curl_LDADD += -L"$(LDAP_SDK)/lib/mscvc" -lldapsdk -lldapssl -lldapx
323endif
324ifdef USE_LDAP_OPENLDAP
325 CFLAGS += -DCURL_HAS_OPENLDAP_LDAPSDK
326 curl_LDADD += -L"$(LDAP_SDK)/lib" -lldap -llber
327endif
328ifndef USE_LDAP_NOVELL
329ifndef USE_LDAP_OPENLDAP
330curl_LDADD += -lwldap32
331endif
332endif
333curl_LDADD += -lws2_32
334
335# Makefile.inc provides the CSOURCES and HHEADERS defines
336include Makefile.inc
337
338curl_PROGRAMS = curl.exe
339curl_OBJECTS := $(patsubst %.c,%.o,$(strip $(CURL_CFILES)))
340curlx_OBJECTS := $(patsubst %.c,%.o,$(notdir $(strip $(CURLX_CFILES))))
341ifdef DYN
342curl_OBJECTS += $(curlx_OBJECTS)
343vpath %.c $(PROOT)/lib
344endif
345
346RESOURCE = curl.res
347
348
349all: $(curl_PROGRAMS)
350
351curl.exe: $(RESOURCE) $(curl_OBJECTS) $(curl_DEPENDENCIES)
352 $(call DEL, $@)
353 $(CC) $(LDFLAGS) -o $@ $< $(curl_OBJECTS) $(curl_LDADD)
354
355# We don't have nroff normally under win32
356# tool_hugehelp.c: $(PROOT)/docs/MANUAL $(PROOT)/docs/curl.1 mkhelp.pl
357# @$(call DEL, tool_hugehelp.c)
358# $(NROFF) -man $(PROOT)/docs/curl.1 | $(PERL) mkhelp.pl $(PROOT)/docs/MANUAL > tool_hugehelp.c
359
360tool_hugehelp.c:
361 @echo Creating $@
362 @$(call COPY, $@.cvs, $@)
363
364%.o: %.c
365 $(CC) $(INCLUDES) $(CFLAGS) -c $<
366
367%.res: %.rc
368 $(RC) $(RCFLAGS) -i $< -o $@
369
370clean:
371ifeq "$(wildcard tool_hugehelp.c.cvs)" "tool_hugehelp.c.cvs"
372 @$(call DEL, tool_hugehelp.c)
373endif
374 @$(call DEL, $(curl_OBJECTS) $(curlx_OBJECTS) $(RESOURCE))
375
376distclean vclean: clean
377 @$(call DEL, $(curl_PROGRAMS))