Home | History | Annotate | Download | only in lib
      1 ###########################################################################
      2 #
      3 ## Makefile for building libcurl.a with MingW (GCC-3.2 or later)
      4 ## and optionally OpenSSL (1.0.2a), libssh2 (1.5), zlib (1.2.8), librtmp (2.4)
      5 ##
      6 ## Usage:   mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
      7 ## Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
      8 ##
      9 ## Hint: you can also set environment vars to control the build, f.e.:
     10 ## set ZLIB_PATH=c:/zlib-1.2.8
     11 ## set ZLIB=1
     12 #
     13 ###########################################################################
     14 
     15 # Edit the path below to point to the base of your Zlib sources.
     16 ifndef ZLIB_PATH
     17 ZLIB_PATH = ../../zlib-1.2.8
     18 endif
     19 # Edit the path below to point to the base of your OpenSSL package.
     20 ifndef OPENSSL_PATH
     21 OPENSSL_PATH = ../../openssl-1.0.2a
     22 endif
     23 # Edit the path below to point to the base of your LibSSH2 package.
     24 ifndef LIBSSH2_PATH
     25 LIBSSH2_PATH = ../../libssh2-1.5.0
     26 endif
     27 # Edit the path below to point to the base of your librtmp package.
     28 ifndef LIBRTMP_PATH
     29 LIBRTMP_PATH = ../../librtmp-2.4
     30 endif
     31 # Edit the path below to point to the base of your libidn package.
     32 ifndef LIBIDN_PATH
     33 LIBIDN_PATH = ../../libidn-1.30
     34 endif
     35 # Edit the path below to point to the base of your MS IDN package.
     36 # Microsoft Internationalized Domain Names (IDN) Mitigation APIs 1.1
     37 # https://www.microsoft.com/en-us/download/details.aspx?id=734
     38 ifndef WINIDN_PATH
     39 WINIDN_PATH = ../../Microsoft IDN Mitigation APIs
     40 endif
     41 # Edit the path below to point to the base of your Novell LDAP NDK.
     42 ifndef LDAP_SDK
     43 LDAP_SDK = c:/novell/ndk/cldapsdk/win32
     44 endif
     45 # Edit the path below to point to the base of your nghttp2 package.
     46 ifndef NGHTTP2_PATH
     47 NGHTTP2_PATH = ../../nghttp2-1.0.0
     48 endif
     49 
     50 PROOT = ..
     51 
     52 # Edit the path below to point to the base of your c-ares package.
     53 ifndef LIBCARES_PATH
     54 LIBCARES_PATH = $(PROOT)/ares
     55 endif
     56 
     57 CC	= $(CROSSPREFIX)gcc
     58 CFLAGS	= $(CURL_CFLAG_EXTRAS) -g -O2 -Wall
     59 CFLAGS	+= -fno-strict-aliasing
     60 # comment LDFLAGS below to keep debug info
     61 LDFLAGS	= -s
     62 AR	= $(CROSSPREFIX)ar
     63 RANLIB	= $(CROSSPREFIX)ranlib
     64 RC	= $(CROSSPREFIX)windres
     65 RCFLAGS	= --include-dir=$(PROOT)/include -DDEBUGBUILD=0 -O COFF
     66 STRIP	= $(CROSSPREFIX)strip -g
     67 
     68 # Set environment var ARCH to your architecture to override autodetection.
     69 ifndef ARCH
     70 ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)
     71 ARCH	= w64
     72 else
     73 ARCH	= w32
     74 endif
     75 endif
     76 
     77 ifeq ($(ARCH),w64)
     78 CFLAGS  += -m64 -D_AMD64_
     79 LDFLAGS += -m64
     80 RCFLAGS += -F pe-x86-64
     81 else
     82 CFLAGS  += -m32
     83 LDFLAGS += -m32
     84 RCFLAGS += -F pe-i386
     85 endif
     86 
     87 # Platform-dependent helper tool macros
     88 ifeq ($(findstring /sh,$(SHELL)),/sh)
     89 DEL	= rm -f $1
     90 RMDIR	= rm -fr $1
     91 MKDIR	= mkdir -p $1
     92 COPY	= -cp -afv $1 $2
     93 #COPYR	= -cp -afr $1/* $2
     94 COPYR	= -rsync -aC $1/* $2
     95 TOUCH	= touch $1
     96 CAT	= cat
     97 ECHONL	= echo ""
     98 DL	= '
     99 else
    100 ifeq "$(OS)" "Windows_NT"
    101 DEL	= -del 2>NUL /q /f $(subst /,\,$1)
    102 RMDIR	= -rd 2>NUL /q /s $(subst /,\,$1)
    103 else
    104 DEL	= -del 2>NUL $(subst /,\,$1)
    105 RMDIR	= -deltree 2>NUL /y $(subst /,\,$1)
    106 endif
    107 MKDIR	= -md 2>NUL $(subst /,\,$1)
    108 COPY	= -copy 2>NUL /y $(subst /,\,$1) $(subst /,\,$2)
    109 COPYR	= -xcopy 2>NUL /q /y /e $(subst /,\,$1) $(subst /,\,$2)
    110 TOUCH	= copy 2>&1>NUL /b $(subst /,\,$1) +,,
    111 CAT	= type
    112 ECHONL	= $(ComSpec) /c echo.
    113 endif
    114 
    115 ########################################################
    116 ## Nothing more to do below this line!
    117 
    118 ifeq ($(findstring -dyn,$(CFG)),-dyn)
    119 DYN = 1
    120 endif
    121 ifeq ($(findstring -ares,$(CFG)),-ares)
    122 ARES = 1
    123 endif
    124 ifeq ($(findstring -sync,$(CFG)),-sync)
    125 SYNC = 1
    126 endif
    127 ifeq ($(findstring -rtmp,$(CFG)),-rtmp)
    128 RTMP = 1
    129 SSL = 1
    130 ZLIB = 1
    131 endif
    132 ifeq ($(findstring -ssh2,$(CFG)),-ssh2)
    133 SSH2 = 1
    134 SSL = 1
    135 ZLIB = 1
    136 endif
    137 ifeq ($(findstring -ssl,$(CFG)),-ssl)
    138 SSL = 1
    139 endif
    140 ifeq ($(findstring -srp,$(CFG)),-srp)
    141 SRP = 1
    142 endif
    143 ifeq ($(findstring -zlib,$(CFG)),-zlib)
    144 ZLIB = 1
    145 endif
    146 ifeq ($(findstring -idn,$(CFG)),-idn)
    147 IDN = 1
    148 endif
    149 ifeq ($(findstring -winidn,$(CFG)),-winidn)
    150 WINIDN = 1
    151 endif
    152 ifeq ($(findstring -sspi,$(CFG)),-sspi)
    153 SSPI = 1
    154 endif
    155 ifeq ($(findstring -ldaps,$(CFG)),-ldaps)
    156 LDAPS = 1
    157 endif
    158 ifeq ($(findstring -ipv6,$(CFG)),-ipv6)
    159 IPV6 = 1
    160 endif
    161 ifeq ($(findstring -winssl,$(CFG)),-winssl)
    162 WINSSL = 1
    163 SSPI = 1
    164 endif
    165 ifeq ($(findstring -nghttp2,$(CFG)),-nghttp2)
    166 NGHTTP2 = 1
    167 endif
    168 
    169 INCLUDES = -I. -I../include
    170 CFLAGS += -DBUILDING_LIBCURL
    171 
    172 ifdef SYNC
    173   CFLAGS += -DUSE_SYNC_DNS
    174 else
    175   ifdef ARES
    176     INCLUDES += -I"$(LIBCARES_PATH)"
    177     CFLAGS += -DUSE_ARES -DCARES_STATICLIB
    178     DLL_LIBS += -L"$(LIBCARES_PATH)" -lcares
    179     libcurl_dll_DEPENDENCIES = $(LIBCARES_PATH)/libcares.a
    180   endif
    181 endif
    182 ifdef RTMP
    183   INCLUDES += -I"$(LIBRTMP_PATH)"
    184   CFLAGS += -DUSE_LIBRTMP
    185   DLL_LIBS += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
    186 endif
    187 ifdef NGHTTP2
    188   INCLUDES += -I"$(NGHTTP2_PATH)/include"
    189   CFLAGS += -DUSE_NGHTTP2
    190   DLL_LIBS += -L"$(NGHTTP2_PATH)/lib" -lnghttp2
    191 endif
    192 ifdef SSH2
    193   INCLUDES += -I"$(LIBSSH2_PATH)/include" -I"$(LIBSSH2_PATH)/win32"
    194   CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
    195   DLL_LIBS += -L"$(LIBSSH2_PATH)/win32" -lssh2
    196 endif
    197 ifdef SSL
    198   ifndef OPENSSL_INCLUDE
    199     ifeq "$(wildcard $(OPENSSL_PATH)/outinc)" "$(OPENSSL_PATH)/outinc"
    200       OPENSSL_INCLUDE = $(OPENSSL_PATH)/outinc
    201     endif
    202     ifeq "$(wildcard $(OPENSSL_PATH)/include)" "$(OPENSSL_PATH)/include"
    203       OPENSSL_INCLUDE = $(OPENSSL_PATH)/include
    204     endif
    205   endif
    206   ifneq "$(wildcard $(OPENSSL_INCLUDE)/openssl/opensslv.h)" "$(OPENSSL_INCLUDE)/openssl/opensslv.h"
    207   $(error Invalid path to OpenSSL package: $(OPENSSL_PATH))
    208   endif
    209   ifndef OPENSSL_LIBPATH
    210     ifeq "$(wildcard $(OPENSSL_PATH)/out)" "$(OPENSSL_PATH)/out"
    211       OPENSSL_LIBPATH = $(OPENSSL_PATH)/out
    212       OPENSSL_LIBS = -leay32 -lssl32
    213     endif
    214     ifeq "$(wildcard $(OPENSSL_PATH)/lib)" "$(OPENSSL_PATH)/lib"
    215       OPENSSL_LIBPATH = $(OPENSSL_PATH)/lib
    216       OPENSSL_LIBS = -lcrypto -lssl
    217     endif
    218   endif
    219   ifndef DYN
    220     OPENSSL_LIBS += -lgdi32 -lcrypt32
    221   endif
    222   INCLUDES += -I"$(OPENSSL_INCLUDE)"
    223   CFLAGS += -DUSE_OPENSSL -DHAVE_OPENSSL_ENGINE_H -DHAVE_OPENSSL_PKCS12_H \
    224             -DHAVE_ENGINE_LOAD_BUILTIN_ENGINES -DOPENSSL_NO_KRB5 \
    225             -DCURL_WANTS_CA_BUNDLE_ENV
    226   DLL_LIBS += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
    227   ifdef SRP
    228     ifeq "$(wildcard $(OPENSSL_INCLUDE)/openssl/srp.h)" "$(OPENSSL_INCLUDE)/openssl/srp.h"
    229       CFLAGS += -DHAVE_OPENSSL_SRP -DUSE_TLS_SRP
    230     endif
    231   endif
    232 endif
    233 ifdef ZLIB
    234   INCLUDES += -I"$(ZLIB_PATH)"
    235   CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
    236   DLL_LIBS += -L"$(ZLIB_PATH)" -lz
    237 endif
    238 ifdef IDN
    239   INCLUDES += -I"$(LIBIDN_PATH)/include"
    240   CFLAGS += -DUSE_LIBIDN
    241   DLL_LIBS += -L"$(LIBIDN_PATH)/lib" -lidn
    242 else
    243 ifdef WINIDN
    244   CFLAGS += -DUSE_WIN32_IDN
    245   CFLAGS += -DWANT_IDN_PROTOTYPES
    246   DLL_LIBS += -L"$(WINIDN_PATH)" -lnormaliz
    247 endif
    248 endif
    249 ifdef SSPI
    250   CFLAGS += -DUSE_WINDOWS_SSPI
    251   ifdef WINSSL
    252     CFLAGS += -DUSE_SCHANNEL
    253   endif
    254 endif
    255 ifdef SPNEGO
    256   CFLAGS += -DHAVE_SPNEGO
    257 endif
    258 ifdef IPV6
    259   CFLAGS += -DENABLE_IPV6 -D_WIN32_WINNT=0x0501
    260 endif
    261 ifdef LDAPS
    262   CFLAGS += -DHAVE_LDAP_SSL
    263 endif
    264 ifdef USE_LDAP_NOVELL
    265   INCLUDES += -I"$(LDAP_SDK)/inc"
    266   CFLAGS += -DCURL_HAS_NOVELL_LDAPSDK
    267   DLL_LIBS += -L"$(LDAP_SDK)/lib/mscvc" -lldapsdk -lldapssl -lldapx
    268 endif
    269 ifdef USE_LDAP_OPENLDAP
    270   INCLUDES += -I"$(LDAP_SDK)/include"
    271   CFLAGS += -DCURL_HAS_OPENLDAP_LDAPSDK
    272   DLL_LIBS += -L"$(LDAP_SDK)/lib" -lldap -llber
    273 endif
    274 ifndef USE_LDAP_NOVELL
    275 ifndef USE_LDAP_OPENLDAP
    276   DLL_LIBS += -lwldap32
    277 endif
    278 endif
    279 DLL_LIBS += -lws2_32
    280 
    281 # Makefile.inc provides the CSOURCES and HHEADERS defines
    282 include Makefile.inc
    283 
    284 libcurl_dll_LIBRARY = libcurl.dll
    285 libcurl_dll_a_LIBRARY = libcurldll.a
    286 libcurl_a_LIBRARY = libcurl.a
    287 
    288 libcurl_a_OBJECTS := $(patsubst %.c,%.o,$(strip $(CSOURCES)))
    289 libcurl_a_DEPENDENCIES := $(strip $(CSOURCES) $(HHEADERS))
    290 
    291 RESOURCE = libcurl.res
    292 
    293 
    294 all: $(libcurl_a_LIBRARY) $(libcurl_dll_LIBRARY)
    295 
    296 $(libcurl_a_LIBRARY): $(libcurl_a_OBJECTS) $(libcurl_a_DEPENDENCIES)
    297 	@$(call DEL, $@)
    298 	$(AR) cru $@ $(libcurl_a_OBJECTS)
    299 	$(RANLIB) $@
    300 	$(STRIP) $@
    301 
    302 # remove the last line above to keep debug info
    303 
    304 $(libcurl_dll_LIBRARY): $(libcurl_a_OBJECTS) $(RESOURCE) $(libcurl_dll_DEPENDENCIES)
    305 	@$(call DEL, $@)
    306 	$(CC) $(LDFLAGS) -shared -o $@ \
    307 	  -Wl,--output-def,$(@:.dll=.def),--out-implib,$(libcurl_dll_a_LIBRARY) \
    308 	  $(libcurl_a_OBJECTS) $(RESOURCE) $(DLL_LIBS)
    309 
    310 %.o: %.c $(PROOT)/include/curl/curlbuild.h
    311 	$(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@
    312 
    313 %.res: %.rc
    314 	$(RC) $(RCFLAGS) -i $< -o $@
    315 
    316 clean:
    317 ifeq "$(wildcard $(PROOT)/include/curl/curlbuild.h.dist)" "$(PROOT)/include/curl/curlbuild.h.dist"
    318 	@$(call DEL, $(PROOT)/include/curl/curlbuild.h)
    319 endif
    320 	@$(call DEL, $(libcurl_a_OBJECTS) $(RESOURCE))
    321 
    322 distclean vclean: clean
    323 	@$(call DEL, $(libcurl_a_LIBRARY) $(libcurl_dll_LIBRARY) $(libcurl_dll_LIBRARY:.dll=.def) $(libcurl_dll_a_LIBRARY))
    324 
    325 $(PROOT)/include/curl/curlbuild.h:
    326 	@echo Creating $@
    327 	@$(call COPY, $@.dist, $@)
    328 
    329 $(LIBCARES_PATH)/libcares.a:
    330 	$(MAKE) -C $(LIBCARES_PATH) -f Makefile.m32
    331