]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
Makefile.m32: major rework [ci skip]
authorViktor Szakats <commit@vsz.me>
Mon, 3 Oct 2022 19:46:56 +0000 (19:46 +0000)
committerViktor Szakats <commit@vsz.me>
Mon, 3 Oct 2022 19:46:56 +0000 (19:46 +0000)
This patch overhauls `Makefile.m32` scripts, fixing a list of quirks,
making its behaviour and customization envvars align better with other
build systems, aiming for less code, that is easier to read, use and
maintain.

Details:
- Rename customization envvars:
  `CURL_CC` -> `CC`
  `CURL_RC` -> `RC`
  `CURL_AR` -> `AR`
  `CURL_LDFLAG_EXTRAS_DLL` -> `CURL_LDFLAGS_LIB`
  `CURL_LDFLAG_EXTRAS_EXE` -> `CURL_LDFLAGS_BIN`
- Drop `CURL_STRIP` and `CURL_RANLIB`. These tools are no longer used.
- Accept `CFLAGS`, `CPPFLAGS`, `RCFLAGS`, `LDFLAGS` and `LIBS` envvars.
- Drop `CURL_CFLAG_EXTRAS`, `CURL_LDFLAG_EXTRAS`, `CURL_RCFLAG_EXTRAS` in
  favor of the above.
- Do not automatically enable `zlib` with `libssh2`. `zlib` is optional
  with `libssh2`.
- Omit unnecessary `CPPFLAGS` options when building `curl.exe` and
  examples.
- Drop support for deprecated `-winssl` `CFG` option. Use `-schannel`
  instead.
- Avoid late evaluation where not necessary (`=` -> `:=`).
- Drop support for `CURL_DLL_A_SUFFIX` to override the implib suffix.
  Instead, use the standard naming scheme by default: `libcurl.dll.a`.
  The toolchain recognizes the name, and selects it automatically when
  asking for a `-shared` vs. `-static` build.
- Stop applying `strip` to `libcurl.a`. Follow-up from
  16a58e9f93c7e89e1f87720199388bcfcfa148a4. There was no debug info to
  strip since then.
- Stop setting `-O3`, `-W`, `-Wall` options. You can add these to
  `CFLAGS` as desired.
- Always enable `-DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG` with OpenSSL,
  to avoid that vulnerability on Windows.
- Add `-lbrotlicommon` to `LIBS` when using `brotli`.
- Do not enable `-nghttp3` without `-ngtcp2`.
- `-ssh2` and `-rtmp` options no longer try to auto-select a TLS-backend.
  You need to set the backend explicitly. This scales better and avoids
  issues with certain combinations (e.g. `libssh2` + `wolfssl` with no
  `schannel`).
- Default to OpenSSL TLS-backend with `ngtcp2`. Possible to override via
  `NGTCP2_LIBS`.
- Old, alternate method of enabling components (e.g. `SSH2=1`) no longer
  supported.
- Delete `SPNEGO` references. They were no-ops.
- Drop support for Win9x environments.
- Allow setting `OPENSSL_LIBS` independently from `OPENSSL_LIBPATH`.
- Support autotools/CMake `libssh2` builds by default.
- Respect `CURL_DLL_SUFFIX` in `-dyn` mode when building `curl.exe` and
  examples.
- Assume standard directory layout with `LIBCARES_PATH`. (Instead of the
  long gone embedded one.)
- Stop static linking with c-ares by default. Add
  `CPPFLAGS=-DCARES_STATICLIB` to enable it.
- Reorganize internal layout to avoid redundancy and emit clean diffs
  between src/lib and example make files.
- Delete unused variables.
- Code cleanups/rework.
- Comment and indentation fixes.

Closes #9632

docs/INSTALL.md
docs/examples/Makefile.m32
lib/Makefile.m32
src/Makefile.m32

index 0eb8faf7455e1113339763cee0a687a08322e15e..8d38f89a0b90d214d03fee9ff106f147c1213c0f 100644 (file)
@@ -182,15 +182,17 @@ currently it is possible to build with native Win32 OpenLDAP, or with the
 *Novell CLDAP* SDK. If you want to use these you need to set these vars:
 
 ```cmd
-set CURL_CFLAG_EXTRAS=-Ic:/openldap/include -DCURL_HAS_OPENLDAP_LDAPSDK
-set CURL_LDFLAG_EXTRAS=-Lc:/openldap/lib -lldap -llber
+set CPPFLAGS=-Ic:/openldap/include -DCURL_HAS_OPENLDAP_LDAPSDK
+set LDFLAGS=-Lc:/openldap/lib
+set LIBS=-lldap -llber
 ```
 
 or for using the Novell SDK:
 
 ```cmd
-set CURL_CFLAG_EXTRAS=-Ic:/openldapsdk/inc -DCURL_HAS_NOVELL_LDAPSDK
-set CURL_LDFLAG_EXTRAS=-Lc:/openldapsdk/lib/mscvc -lldapsdk -lldapssl -lldapx
+set CPPFLAGS=-Ic:/openldapsdk/inc -DCURL_HAS_NOVELL_LDAPSDK
+set LDFLAGS=-Lc:/openldapsdk/lib/mscvc
+set LIBS=-lldapsdk -lldapssl -lldapx
 ```
 
 If you want to enable LDAPS support then set LDAPS=1.
index ab07bab13ff17dac3b526b799b3590188253d2ed..1fcb2502b36bc2c880ffd90c0556666ed39a3f66 100644 (file)
 #
 #***************************************************************************
 
-###########################################################################
-#
 # Makefile for building curl examples with MinGW and optional features.
 #
 # Usage:   mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
 # Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
 #
-# Hint: you can also set environment vars to control the build, e.g.:
-# set ZLIB_PATH=C:/zlib
-# set ZLIB=1
-#
-###########################################################################
+# Set component roots via envvar <feature>_PATH. CPPFLAGS, LDFLAGS, LIBS,
+# CFLAGS, RCFLAGS (and more) are also available for customization.
 
-PROOT = ../..
+PROOT := ../..
 
-ifndef ZLIB_PATH
-ZLIB_PATH = $(PROOT)/../zlib
-endif
-ifndef ZSTD_PATH
-ZSTD_PATH = $(PROOT)/../zstd
-endif
-ifndef BROTLI_PATH
-BROTLI_PATH = $(PROOT)/../brotli
-endif
-ifndef OPENSSL_PATH
-OPENSSL_PATH = $(PROOT)/../openssl
-endif
-ifndef LIBSSH2_PATH
-LIBSSH2_PATH = $(PROOT)/../libssh2
-endif
-ifndef LIBRTMP_PATH
-LIBRTMP_PATH = $(PROOT)/../librtmp
-endif
-ifndef LIBGSASL_PATH
-LIBGSASL_PATH = $(PROOT)/../gsasl
-endif
-ifndef LIBIDN2_PATH
-LIBIDN2_PATH = $(PROOT)/../libidn2
-endif
-ifndef NGHTTP2_PATH
-NGHTTP2_PATH = $(PROOT)/../nghttp2
-endif
-ifndef NGHTTP3_PATH
-NGHTTP3_PATH = $(PROOT)/../nghttp3
-endif
-ifndef NGTCP2_PATH
-NGTCP2_PATH = $(PROOT)/../ngtcp2
-endif
-ifndef LIBCARES_PATH
-LIBCARES_PATH = $(PROOT)/../c-ares
-endif
-
-ifeq ($(CURL_CC),)
-CURL_CC := $(CROSSPREFIX)gcc
-endif
-ifeq ($(CURL_AR),)
-CURL_AR := $(CROSSPREFIX)ar
-endif
-ifeq ($(CURL_RC),)
-CURL_RC := $(CROSSPREFIX)windres
-endif
-
-CC = $(CURL_CC)
-CFLAGS = -O3 $(CURL_CFLAG_EXTRAS) -W -Wall
-LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_EXE)
-RC = $(CURL_RC)
-RCFLAGS = -I$(PROOT)/include -O coff -DCURL_EMBED_MANIFEST $(CURL_RCFLAG_EXTRAS)
-
-# Set environment var ARCH to your architecture to override autodetection.
-ifndef ARCH
-ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)
-ARCH = w64
-else
-ARCH = w32
-endif
-endif
+CPPFLAGS += -I. -I$(PROOT)/include
+RCFLAGS  += -I$(PROOT)/include -DCURL_EMBED_MANIFEST
+LDFLAGS  += -L$(PROOT)/lib
+LIBS     += -lcurl
 
 ifneq ($(ARCH),custom)
-ifeq ($(ARCH),w64)
-CFLAGS  += -m64
-LDFLAGS += -m64
-RCFLAGS += --target=pe-x86-64
-else
-CFLAGS  += -m32
-LDFLAGS += -m32
-RCFLAGS += --target=pe-i386
-endif
-endif
-
-# Platform-dependent helper tool macros
-ifeq ($(findstring /sh,$(SHELL)),/sh)
-DEL     = rm -f $1
-RMDIR   = rm -fr $1
-MKDIR   = mkdir -p $1
-COPY    = -cp -afv $1 $2
-COPYR   = -rsync -aC $1/* $2
-TOUCH   = touch $1
-CAT     = cat
-ECHONL  = echo ""
-DL = '
-else
-ifeq "$(OS)" "Windows_NT"
-DEL     = -del 2>NUL /q /f $(subst /,\,$1)
-RMDIR   = -rd 2>NUL /q /s $(subst /,\,$1)
-else
-DEL     = -del 2>NUL $(subst /,\,$1)
-RMDIR   = -deltree 2>NUL /y $(subst /,\,$1)
-endif
-MKDIR   = -md 2>NUL $(subst /,\,$1)
-COPY    = -copy 2>NUL /y $(subst /,\,$1) $(subst /,\,$2)
-COPYR   = -xcopy 2>NUL /q /y /e $(subst /,\,$1) $(subst /,\,$2)
-TOUCH   = copy 2>&1>NUL /b $(subst /,\,$1) +,,
-CAT     = type
-ECHONL  = $(ComSpec) /c echo.
+  # Set environment var ARCH to your architecture to override autodetection.
+  ifndef ARCH
+    ifneq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),)
+      ARCH := w64
+    else
+      ARCH := w32
+    endif
+  endif
+  ifeq ($(ARCH),w64)
+    CFLAGS  += -m64
+    LDFLAGS += -m64
+    RCFLAGS += --target=pe-x86-64
+  else
+    CFLAGS  += -m32
+    LDFLAGS += -m32
+    RCFLAGS += --target=pe-i386
+  endif
 endif
 
-########################################################
-## Nothing more to do below this line!
+### Optional features
 
 ifneq ($(findstring -dyn,$(CFG)),)
-DYN = 1
+  curl_DEPENDENCIES := $(PROOT)/lib/libcurl$(CURL_DLL_SUFFIX).dll
+  curl_DEPENDENCIES += $(PROOT)/lib/libcurl.dll.a
+else
+  curl_DEPENDENCIES := $(PROOT)/lib/libcurl.a
+  CPPFLAGS += -DCURL_STATICLIB
+  LDFLAGS += -static
 endif
-ifneq ($(findstring -ares,$(CFG)),)
-ARES = 1
+
+ifneq ($(findstring -unicode,$(CFG)),)
+  CPPFLAGS += -DUNICODE -D_UNICODE
+  LDFLAGS += -municode
 endif
 ifneq ($(findstring -sync,$(CFG)),)
-SYNC = 1
+else
+  ifneq ($(findstring -ares,$(CFG)),)
+    LIBCARES_PATH ?= $(PROOT)/../c-ares
+    LDFLAGS += -L"$(LIBCARES_PATH)/lib"
+    LIBS += -lcares
+  endif
 endif
 ifneq ($(findstring -rtmp,$(CFG)),)
-RTMP = 1
-ZLIB = 1
+  LIBRTMP_PATH ?= $(PROOT)/../librtmp
+  LDFLAGS += -L"$(LIBRTMP_PATH)/librtmp"
+  LIBS += -lrtmp -lwinmm
+  ZLIB := 1
 endif
 ifneq ($(findstring -ssh2,$(CFG)),)
-SSH2 = 1
-ZLIB = 1
+  LIBSSH2_PATH ?= $(PROOT)/../libssh2
+  LDFLAGS += -L"$(LIBSSH2_PATH)/lib"
+  LDFLAGS += -L"$(LIBSSH2_PATH)/win32"
+  LIBS += -lssh2
+endif
+ifneq ($(findstring -nghttp2,$(CFG)),)
+  NGHTTP2_PATH ?= $(PROOT)/../nghttp2
+  LDFLAGS += -L"$(NGHTTP2_PATH)/lib"
+  LIBS += -lnghttp2
+endif
+ifneq ($(findstring -nghttp3,$(CFG)),)
+  ifneq ($(findstring -ngtcp2,$(CFG)),)
+    NGHTTP3_PATH ?= $(PROOT)/../nghttp3
+    LDFLAGS += -L"$(NGHTTP3_PATH)/lib"
+    LIBS += -lnghttp3
+    NGTCP2_PATH ?= $(PROOT)/../ngtcp2
+    LDFLAGS += -L"$(NGTCP2_PATH)/lib"
+    NGTCP2_LIBS ?= -lngtcp2 -lngtcp2_crypto_openssl
+    LIBS += $(NGTCP2_LIBS)
+  endif
 endif
 ifneq ($(findstring -ssl,$(CFG)),)
-SSL = 1
+  OPENSSL_PATH ?= $(PROOT)/../openssl
+  OPENSSL_LIBPATH ?= $(OPENSSL_PATH)/lib
+  LDFLAGS += -L"$(OPENSSL_LIBPATH)"
+  OPENSSL_LIBS ?= -lssl -lcrypto
+  LIBS += $(OPENSSL_LIBS)
 endif
-ifneq ($(findstring -zlib,$(CFG)),)
-ZLIB = 1
+ifneq ($(findstring -zlib,$(CFG))$(ZLIB),)
+  ZLIB_PATH ?= $(PROOT)/../zlib
+  LDFLAGS += -L"$(ZLIB_PATH)"
+  LIBS += -lz
 endif
 ifneq ($(findstring -zstd,$(CFG)),)
-ZSTD = 1
+  ZSTD_PATH ?= $(PROOT)/../zstd
+  LDFLAGS += -L"$(ZSTD_PATH)/lib"
+  ZSTD_LIBS ?= -lzstd
+  LIBS += $(ZSTD_LIBS)
 endif
 ifneq ($(findstring -brotli,$(CFG)),)
-BROTLI = 1
+  BROTLI_PATH ?= $(PROOT)/../brotli
+  LDFLAGS += -L"$(BROTLI_PATH)/lib"
+  BROTLI_LIBS ?= -lbrotlidec -lbrotlicommon
+  LIBS += $(BROTLI_LIBS)
 endif
 ifneq ($(findstring -gsasl,$(CFG)),)
-GSASL = 1
+  LIBGSASL_PATH ?= $(PROOT)/../gsasl
+  LDFLAGS += -L"$(LIBGSASL_PATH)/lib"
+  LIBS += -lgsasl
 endif
 ifneq ($(findstring -idn2,$(CFG)),)
-IDN2 = 1
-endif
+  LIBIDN2_PATH ?= $(PROOT)/../libidn2
+  LDFLAGS += -L"$(LIBIDN2_PATH)/lib"
+  LIBS += -lidn2
+else
 ifneq ($(findstring -winidn,$(CFG)),)
-WINIDN = 1
-endif
-ifneq ($(findstring -sspi,$(CFG)),)
-SSPI = 1
+  LIBS += -lnormaliz
 endif
-ifneq ($(findstring -ldaps,$(CFG)),)
-LDAPS = 1
 endif
-ifneq ($(findstring -ipv6,$(CFG)),)
-IPV6 = 1
-endif
-ifneq ($(findstring -schannel,$(CFG))$(findstring -winssl,$(CFG)),)
-SCHANNEL = 1
-SSPI = 1
-endif
-ifneq ($(findstring -nghttp2,$(CFG)),)
-NGHTTP2 = 1
-endif
-ifneq ($(findstring -nghttp3,$(CFG)),)
-NGHTTP3 = 1
-endif
-ifneq ($(findstring -ngtcp2,$(CFG)),)
-NGTCP2 = 1
-endif
-ifneq ($(findstring -unicode,$(CFG)),)
-UNICODE = 1
-endif
-
-# SSH2 and RTMP require an SSL library; assume OpenSSL if none specified
-ifneq ($(SSH2)$(RTMP),)
-  ifeq ($(SSL)$(SCHANNEL),)
-    SSL = 1
-  endif
+ifeq ($(findstring -lldap,$(LIBS)),)
+  LIBS += -lwldap32
 endif
+LIBS += -lws2_32 -lcrypt32 -lbcrypt
 
-INCLUDES = -I. -I$(PROOT)/include
-ifdef UNICODE
-  CFLAGS += -DUNICODE -D_UNICODE
-  LDFLAGS += -municode
-endif
-
-ifdef DYN
-  curl_DEPENDENCIES = $(PROOT)/lib/libcurldll.a $(PROOT)/lib/libcurl.dll
-  curl_LDADD = -L$(PROOT)/lib -lcurldll
-else
-  curl_DEPENDENCIES = $(PROOT)/lib/libcurl.a
-  curl_LDADD = -L$(PROOT)/lib -lcurl
-  CFLAGS += -DCURL_STATICLIB
-  LDFLAGS += -static
-endif
-ifdef SYNC
-  CFLAGS += -DUSE_SYNC_DNS
-else
-  ifdef ARES
-    CFLAGS += -DUSE_ARES -DCARES_STATICLIB
-    curl_LDADD += -L"$(LIBCARES_PATH)" -lcares
-  endif
-endif
-ifdef RTMP
-  CFLAGS += -DUSE_LIBRTMP
-  curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
-endif
-ifdef NGHTTP2
-  CFLAGS += -DUSE_NGHTTP2
-  curl_LDADD += -L"$(NGHTTP2_PATH)/lib" -lnghttp2
-endif
-ifdef SSH2
-  CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
-  curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2
-endif
-ifdef NGHTTP3
-  CFLAGS += -DUSE_NGHTTP3
-  curl_LDADD += -L"$(NGHTTP3_PATH)/lib" -lnghttp3
-  ifdef NGTCP2
-    CFLAGS += -DUSE_NGTCP2
-    curl_LDADD += -L"$(NGTCP2_PATH)/lib"
-    ifdef NGTCP2_LIBS
-      curl_LDADD += $(NGTCP2_LIBS)
-    else
-      curl_LDADD += -lngtcp2
-      ifdef SSL
-        curl_LDADD += -lngtcp2_crypto_openssl
-      endif
-    endif
-  endif
-endif
-ifdef SSL
-  ifndef OPENSSL_INCLUDE
-    OPENSSL_INCLUDE = $(OPENSSL_PATH)/include
-  endif
-  ifndef OPENSSL_LIBPATH
-    OPENSSL_LIBS = -lssl -lcrypto
-    OPENSSL_LIBPATH = $(OPENSSL_PATH)/lib
-  endif
-  INCLUDES += -I"$(OPENSSL_INCLUDE)"
-  CFLAGS += -DUSE_OPENSSL
-  curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
-endif
-ifdef SCHANNEL
-  CFLAGS += -DUSE_SCHANNEL
-endif
-ifdef ZLIB
-  INCLUDES += -I"$(ZLIB_PATH)"
-  CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
-  curl_LDADD += -L"$(ZLIB_PATH)" -lz
-endif
-ifdef ZSTD
-  INCLUDES += -I"$(ZSTD_PATH)/include"
-  CFLAGS += -DHAVE_ZSTD
-  curl_LDADD += -L"$(ZSTD_PATH)/lib"
-  ifdef ZSTD_LIBS
-    curl_LDADD += $(ZSTD_LIBS)
-  else
-    curl_LDADD += -lzstd
-  endif
-endif
-ifdef BROTLI
-  INCLUDES += -I"$(BROTLI_PATH)/include"
-  CFLAGS += -DHAVE_BROTLI
-  curl_LDADD += -L"$(BROTLI_PATH)/lib"
-  ifdef BROTLI_LIBS
-    curl_LDADD += $(BROTLI_LIBS)
-  else
-    curl_LDADD += -lbrotlidec
-  endif
-endif
-ifdef GSASL
-  CFLAGS += -DUSE_GSASL
-  curl_LDADD += -L"$(LIBGSASL_PATH)/lib" -lgsasl
-endif
-ifdef IDN2
-  CFLAGS += -DUSE_LIBIDN2
-  curl_LDADD += -L"$(LIBIDN2_PATH)/lib" -lidn2
-else
-ifdef WINIDN
-  CFLAGS += -DUSE_WIN32_IDN
-  curl_LDADD += -lnormaliz
-endif
-endif
-ifdef SSPI
-  CFLAGS += -DUSE_WINDOWS_SSPI
-endif
-ifdef IPV6
-  CFLAGS += -DENABLE_IPV6
-endif
-ifdef LDAPS
-  CFLAGS += -DHAVE_LDAP_SSL
-endif
-ifeq ($(findstring -lldap,$(LDFLAGS)),)
-  curl_LDADD += -lwldap32
-endif
-curl_LDADD += -lws2_32 -lcrypt32 -lbcrypt
+### Sources and targets
 
-# Makefile.inc provides the check_PROGRAMS define
+# Provides check_PROGRAMS
 include Makefile.inc
 
 TARGETS := $(patsubst %,%.exe,$(strip $(check_PROGRAMS)))
 TARGETS += synctime.exe
 
-RESOURCE = $(PROOT)/src/curl.res
+RESOURCE := $(PROOT)/src/curl.res
 
 .PRECIOUS: %.o
 
+### Rules
+
+CC ?= $(CROSSPREFIX)gcc
+RC ?= $(CROSSPREFIX)windres
+
+ifneq ($(findstring /sh,$(SHELL)),)
+DEL = rm -f $1
+else
+DEL = -del 2>NUL /q /f $(subst /,\,$1)
+endif
 
 all: $(TARGETS)
 
 %.exe: %.o $(RESOURCE) $(curl_DEPENDENCIES)
-       $(CC) $(LDFLAGS) -o $@ $< $(RESOURCE) $(curl_LDADD)
+       $(CC) $(LDFLAGS) -o $@ $< $(RESOURCE) $(LIBS)
 
 %.o: %.c
-       $(CC) $(INCLUDES) $(CFLAGS) -c $<
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
 
 %.res: %.rc
-       $(RC) $(RCFLAGS) -i $< -o $@
+       $(RC) -O coff $(RCFLAGS) -i $< -o $@
 
 clean:
        @$(call DEL, $(TARGETS:.exe=.o) $(RESOURCE))
index 9a4fecdba6774b1b3c6424b09b01e81ff4417736..34ea2826d3a7661e2e857af13c0039fbd680fd15 100644 (file)
 #
 #***************************************************************************
 
-###########################################################################
-#
-# Makefile for building libcurl.a with MinGW and optional features.
+# Makefile for building libcurl with MinGW and optional features.
 #
 # Usage:   mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
 # Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
 #
-# Hint: you can also set environment vars to control the build, e.g.:
-# set ZLIB_PATH=C:/zlib
-# set ZLIB=1
-#
-###########################################################################
+# Set component roots via envvar <feature>_PATH. CPPFLAGS, LDFLAGS, LIBS,
+# CFLAGS, RCFLAGS (and more) are also available for customization.
 
-PROOT = ..
+PROOT := ..
 
-ifndef ZLIB_PATH
-ZLIB_PATH = $(PROOT)/../zlib
-endif
-ifndef ZSTD_PATH
-ZSTD_PATH = $(PROOT)/../zstd
-endif
-ifndef BROTLI_PATH
-BROTLI_PATH = $(PROOT)/../brotli
-endif
-ifndef OPENSSL_PATH
-OPENSSL_PATH = $(PROOT)/../openssl
-endif
-ifndef LIBSSH2_PATH
-LIBSSH2_PATH = $(PROOT)/../libssh2
-endif
-ifndef LIBRTMP_PATH
-LIBRTMP_PATH = $(PROOT)/../librtmp
-endif
-ifndef LIBGSASL_PATH
-LIBGSASL_PATH = $(PROOT)/../gsasl
-endif
-ifndef LIBIDN2_PATH
-LIBIDN2_PATH = $(PROOT)/../libidn2
-endif
-ifndef NGHTTP2_PATH
-NGHTTP2_PATH = $(PROOT)/../nghttp2
-endif
-ifndef NGHTTP3_PATH
-NGHTTP3_PATH = $(PROOT)/../nghttp3
-endif
-ifndef NGTCP2_PATH
-NGTCP2_PATH = $(PROOT)/../ngtcp2
-endif
-ifndef LIBCARES_PATH
-LIBCARES_PATH = $(PROOT)/../c-ares
-endif
-
-ifeq ($(CURL_CC),)
-CURL_CC := $(CROSSPREFIX)gcc
-endif
-ifeq ($(CURL_AR),)
-CURL_AR := $(CROSSPREFIX)ar
-endif
-ifeq ($(CURL_RANLIB),)
-CURL_RANLIB := $(CROSSPREFIX)ranlib
-endif
-ifeq ($(CURL_RC),)
-CURL_RC := $(CROSSPREFIX)windres
-endif
-ifeq ($(CURL_STRIP),)
-CURL_STRIP := $(CROSSPREFIX)strip
-endif
-
-CC = $(CURL_CC)
-CFLAGS = -O3 $(CURL_CFLAG_EXTRAS) -W -Wall
-LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_DLL)
-AR = $(CURL_AR)
-RANLIB = $(CURL_RANLIB)
-RC = $(CURL_RC)
-RCFLAGS = -I$(PROOT)/include -O coff $(CURL_RCFLAG_EXTRAS)
-STRIP   = $(CURL_STRIP) -g
-
-# Set environment var ARCH to your architecture to override autodetection.
-ifndef ARCH
-ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)
-ARCH = w64
-else
-ARCH = w32
-endif
-endif
+CPPFLAGS += -I. -I$(PROOT)/include -DBUILDING_LIBCURL
+RCFLAGS  += -I$(PROOT)/include
 
 ifneq ($(ARCH),custom)
-ifeq ($(ARCH),w64)
-CFLAGS  += -m64
-LDFLAGS += -m64
-RCFLAGS += --target=pe-x86-64
-else
-CFLAGS  += -m32
-LDFLAGS += -m32
-RCFLAGS += --target=pe-i386
-endif
-endif
-
-# Platform-dependent helper tool macros
-ifeq ($(findstring /sh,$(SHELL)),/sh)
-DEL     = rm -f $1
-RMDIR   = rm -fr $1
-MKDIR   = mkdir -p $1
-COPY    = -cp -afv $1 $2
-COPYR   = -rsync -aC $1/* $2
-TOUCH   = touch $1
-CAT     = cat
-ECHONL  = echo ""
-DL = '
-else
-ifeq "$(OS)" "Windows_NT"
-DEL     = -del 2>NUL /q /f $(subst /,\,$1)
-RMDIR   = -rd 2>NUL /q /s $(subst /,\,$1)
-else
-DEL     = -del 2>NUL $(subst /,\,$1)
-RMDIR   = -deltree 2>NUL /y $(subst /,\,$1)
-endif
-MKDIR   = -md 2>NUL $(subst /,\,$1)
-COPY    = -copy 2>NUL /y $(subst /,\,$1) $(subst /,\,$2)
-COPYR   = -xcopy 2>NUL /q /y /e $(subst /,\,$1) $(subst /,\,$2)
-TOUCH   = copy 2>&1>NUL /b $(subst /,\,$1) +,,
-CAT     = type
-ECHONL  = $(ComSpec) /c echo.
+  # Set environment var ARCH to your architecture to override autodetection.
+  ifndef ARCH
+    ifneq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),)
+      ARCH := w64
+    else
+      ARCH := w32
+    endif
+  endif
+  ifeq ($(ARCH),w64)
+    CFLAGS  += -m64
+    LDFLAGS += -m64
+    RCFLAGS += --target=pe-x86-64
+  else
+    CFLAGS  += -m32
+    LDFLAGS += -m32
+    RCFLAGS += --target=pe-i386
+  endif
 endif
 
-########################################################
-## Nothing more to do below this line!
+### Optional features
 
-ifneq ($(findstring -dyn,$(CFG)),)
-DYN = 1
-endif
-ifneq ($(findstring -ares,$(CFG)),)
-ARES = 1
+ifneq ($(findstring -unicode,$(CFG)),)
+  CPPFLAGS += -DUNICODE -D_UNICODE
 endif
 ifneq ($(findstring -sync,$(CFG)),)
-SYNC = 1
+  CPPFLAGS += -DUSE_SYNC_DNS
+else
+  ifneq ($(findstring -ares,$(CFG)),)
+    LIBCARES_PATH ?= $(PROOT)/../c-ares
+    CPPFLAGS += -DUSE_ARES
+    CPPFLAGS += -I"$(LIBCARES_PATH)/include"
+    LDFLAGS += -L"$(LIBCARES_PATH)/lib"
+    LIBS += -lcares
+  endif
 endif
 ifneq ($(findstring -rtmp,$(CFG)),)
-RTMP = 1
-ZLIB = 1
+  LIBRTMP_PATH ?= $(PROOT)/../librtmp
+  CPPFLAGS += -DUSE_LIBRTMP
+  CPPFLAGS += -I"$(LIBRTMP_PATH)"
+  LDFLAGS += -L"$(LIBRTMP_PATH)/librtmp"
+  LIBS += -lrtmp -lwinmm
+  ZLIB := 1
 endif
 ifneq ($(findstring -ssh2,$(CFG)),)
-SSH2 = 1
-ZLIB = 1
-endif
-ifneq ($(findstring -ssl,$(CFG)),)
-SSL = 1
-endif
-ifneq ($(findstring -srp,$(CFG)),)
-SRP = 1
-endif
-ifneq ($(findstring -zlib,$(CFG)),)
-ZLIB = 1
-endif
-ifneq ($(findstring -zstd,$(CFG)),)
-ZSTD = 1
-endif
-ifneq ($(findstring -brotli,$(CFG)),)
-BROTLI = 1
-endif
-ifneq ($(findstring -gsasl,$(CFG)),)
-GSASL = 1
-endif
-ifneq ($(findstring -idn2,$(CFG)),)
-IDN2 = 1
-endif
-ifneq ($(findstring -winidn,$(CFG)),)
-WINIDN = 1
-endif
-ifneq ($(findstring -sspi,$(CFG)),)
-SSPI = 1
-endif
-ifneq ($(findstring -ldaps,$(CFG)),)
-LDAPS = 1
-endif
-ifneq ($(findstring -ipv6,$(CFG)),)
-IPV6 = 1
-endif
-ifneq ($(findstring -schannel,$(CFG))$(findstring -winssl,$(CFG)),)
-SCHANNEL = 1
-SSPI = 1
+  LIBSSH2_PATH ?= $(PROOT)/../libssh2
+  CPPFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
+  CPPFLAGS += -I"$(LIBSSH2_PATH)/include"
+  LDFLAGS += -L"$(LIBSSH2_PATH)/lib"
+  LDFLAGS += -L"$(LIBSSH2_PATH)/win32"
+  LIBS += -lssh2
 endif
 ifneq ($(findstring -nghttp2,$(CFG)),)
-NGHTTP2 = 1
+  NGHTTP2_PATH ?= $(PROOT)/../nghttp2
+  CPPFLAGS += -DUSE_NGHTTP2
+  CPPFLAGS += -I"$(NGHTTP2_PATH)/include"
+  LDFLAGS += -L"$(NGHTTP2_PATH)/lib"
+  LIBS += -lnghttp2
 endif
 ifneq ($(findstring -nghttp3,$(CFG)),)
-NGHTTP3 = 1
-endif
-ifneq ($(findstring -ngtcp2,$(CFG)),)
-NGTCP2 = 1
-endif
-ifneq ($(findstring -unicode,$(CFG)),)
-UNICODE = 1
-endif
-
-# SSH2 and RTMP require an SSL library; assume OpenSSL if none specified
-ifneq ($(SSH2)$(RTMP),)
-  ifeq ($(SSL)$(SCHANNEL),)
-    SSL = 1
-  endif
-endif
-
-INCLUDES = -I. -I$(PROOT)/include
-CFLAGS += -DBUILDING_LIBCURL
-ifdef SSL
-  ifdef SCHANNEL
-    CFLAGS += -DCURL_WITH_MULTI_SSL
-  endif
-endif
-ifdef UNICODE
-  CFLAGS += -DUNICODE -D_UNICODE
-endif
-
-ifdef SYNC
-  CFLAGS += -DUSE_SYNC_DNS
-else
-  ifdef ARES
-    INCLUDES += -I"$(LIBCARES_PATH)"
-    CFLAGS += -DUSE_ARES -DCARES_STATICLIB
-    curl_LDADD += -L"$(LIBCARES_PATH)" -lcares
-  endif
-endif
-ifdef RTMP
-  INCLUDES += -I"$(LIBRTMP_PATH)"
-  CFLAGS += -DUSE_LIBRTMP
-  curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
-endif
-ifdef NGHTTP2
-  INCLUDES += -I"$(NGHTTP2_PATH)/include"
-  CFLAGS += -DUSE_NGHTTP2
-  curl_LDADD += -L"$(NGHTTP2_PATH)/lib" -lnghttp2
-endif
-ifdef SSH2
-  INCLUDES += -I"$(LIBSSH2_PATH)/include" -I"$(LIBSSH2_PATH)/win32"
-  CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
-  curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2
-endif
-ifdef NGHTTP3
-  INCLUDES += -I"$(NGHTTP3_PATH)/include"
-  CFLAGS += -DUSE_NGHTTP3
-  curl_LDADD += -L"$(NGHTTP3_PATH)/lib" -lnghttp3
-  ifdef NGTCP2
-    INCLUDES += -I"$(NGTCP2_PATH)/include"
-    CFLAGS += -DUSE_NGTCP2
-    curl_LDADD += -L"$(NGTCP2_PATH)/lib"
-    ifdef NGTCP2_LIBS
-      curl_LDADD += $(NGTCP2_LIBS)
-    else
-      curl_LDADD += -lngtcp2
-      ifdef SSL
-        curl_LDADD += -lngtcp2_crypto_openssl
-      endif
-    endif
+  ifneq ($(findstring -ngtcp2,$(CFG)),)
+    NGHTTP3_PATH ?= $(PROOT)/../nghttp3
+    CPPFLAGS += -DUSE_NGHTTP3
+    CPPFLAGS += -I"$(NGHTTP3_PATH)/include"
+    LDFLAGS += -L"$(NGHTTP3_PATH)/lib"
+    LIBS += -lnghttp3
+    NGTCP2_PATH ?= $(PROOT)/../ngtcp2
+    CPPFLAGS += -DUSE_NGTCP2
+    CPPFLAGS += -I"$(NGTCP2_PATH)/include"
+    LDFLAGS += -L"$(NGTCP2_PATH)/lib"
+    NGTCP2_LIBS ?= -lngtcp2 -lngtcp2_crypto_openssl
+    LIBS += $(NGTCP2_LIBS)
   endif
 endif
-ifdef SSL
-  ifndef OPENSSL_INCLUDE
-    OPENSSL_INCLUDE = $(OPENSSL_PATH)/include
-  endif
-  ifndef OPENSSL_LIBPATH
-    OPENSSL_LIBS = -lssl -lcrypto
-    OPENSSL_LIBPATH = $(OPENSSL_PATH)/lib
-  endif
-  INCLUDES += -I"$(OPENSSL_INCLUDE)"
-  CFLAGS += -DUSE_OPENSSL
-  curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
-  ifdef SRP
+ifneq ($(findstring -ssl,$(CFG)),)
+  OPENSSL_PATH ?= $(PROOT)/../openssl
+  CPPFLAGS += -DUSE_OPENSSL
+  CPPFLAGS += -DCURL_DISABLE_OPENSSL_AUTO_LOAD_CONFIG
+  OPENSSL_INCLUDE ?= $(OPENSSL_PATH)/include
+  CPPFLAGS += -I"$(OPENSSL_INCLUDE)"
+  OPENSSL_LIBPATH ?= $(OPENSSL_PATH)/lib
+  LDFLAGS += -L"$(OPENSSL_LIBPATH)"
+  OPENSSL_LIBS ?= -lssl -lcrypto
+  LIBS += $(OPENSSL_LIBS)
+  ifneq ($(findstring -srp,$(CFG)),)
     ifeq "$(wildcard $(OPENSSL_INCLUDE)/openssl/srp.h)" "$(OPENSSL_INCLUDE)/openssl/srp.h"
       # OpenSSL 1.0.1 and later, except BoringSSL
-      CFLAGS += -DHAVE_OPENSSL_SRP -DUSE_TLS_SRP
+      CPPFLAGS += -DHAVE_OPENSSL_SRP -DUSE_TLS_SRP
     endif
   endif
+  SSL := 1
 endif
-ifdef SCHANNEL
-  CFLAGS += -DUSE_SCHANNEL
+ifneq ($(findstring -schannel,$(CFG)),)
+  CPPFLAGS += -DUSE_SCHANNEL
+  ifdef SSL
+    CPPFLAGS += -DCURL_WITH_MULTI_SSL
+  endif
 endif
-ifdef ZLIB
-  INCLUDES += -I"$(ZLIB_PATH)"
-  CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
-  curl_LDADD += -L"$(ZLIB_PATH)" -lz
+ifneq ($(findstring -zlib,$(CFG))$(ZLIB),)
+  ZLIB_PATH ?= $(PROOT)/../zlib
+  CPPFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
+  CPPFLAGS += -I"$(ZLIB_PATH)"
+  LDFLAGS += -L"$(ZLIB_PATH)"
+  LIBS += -lz
 endif
-ifdef ZSTD
-  INCLUDES += -I"$(ZSTD_PATH)/include"
-  CFLAGS += -DHAVE_ZSTD
-  curl_LDADD += -L"$(ZSTD_PATH)/lib"
-  ifdef ZSTD_LIBS
-    curl_LDADD += $(ZSTD_LIBS)
-  else
-    curl_LDADD += -lzstd
-  endif
+ifneq ($(findstring -zstd,$(CFG)),)
+  ZSTD_PATH ?= $(PROOT)/../zstd
+  CPPFLAGS += -DHAVE_ZSTD
+  CPPFLAGS += -I"$(ZSTD_PATH)/include"
+  LDFLAGS += -L"$(ZSTD_PATH)/lib"
+  ZSTD_LIBS ?= -lzstd
+  LIBS += $(ZSTD_LIBS)
 endif
-ifdef BROTLI
-  INCLUDES += -I"$(BROTLI_PATH)/include"
-  CFLAGS += -DHAVE_BROTLI
-  curl_LDADD += -L"$(BROTLI_PATH)/lib"
-  ifdef BROTLI_LIBS
-    curl_LDADD += $(BROTLI_LIBS)
-  else
-    curl_LDADD += -lbrotlidec
-  endif
+ifneq ($(findstring -brotli,$(CFG)),)
+  BROTLI_PATH ?= $(PROOT)/../brotli
+  CPPFLAGS += -DHAVE_BROTLI
+  CPPFLAGS += -I"$(BROTLI_PATH)/include"
+  LDFLAGS += -L"$(BROTLI_PATH)/lib"
+  BROTLI_LIBS ?= -lbrotlidec -lbrotlicommon
+  LIBS += $(BROTLI_LIBS)
 endif
-ifdef GSASL
-  INCLUDES += -I"$(LIBGSASL_PATH)/include"
-  CFLAGS += -DUSE_GSASL
-  curl_LDADD += -L"$(LIBGSASL_PATH)/lib" -lgsasl
+ifneq ($(findstring -gsasl,$(CFG)),)
+  LIBGSASL_PATH ?= $(PROOT)/../gsasl
+  CPPFLAGS += -DUSE_GSASL
+  CPPFLAGS += -I"$(LIBGSASL_PATH)/include"
+  LDFLAGS += -L"$(LIBGSASL_PATH)/lib"
+  LIBS += -lgsasl
 endif
-ifdef IDN2
-  INCLUDES += -I"$(LIBIDN2_PATH)/include"
-  CFLAGS += -DUSE_LIBIDN2
-  curl_LDADD += -L"$(LIBIDN2_PATH)/lib" -lidn2
+ifneq ($(findstring -idn2,$(CFG)),)
+  LIBIDN2_PATH ?= $(PROOT)/../libidn2
+  CPPFLAGS += -DUSE_LIBIDN2
+  CPPFLAGS += -I"$(LIBIDN2_PATH)/include"
+  LDFLAGS += -L"$(LIBIDN2_PATH)/lib"
+  LIBS += -lidn2
 else
-ifdef WINIDN
-  CFLAGS += -DUSE_WIN32_IDN
-  CFLAGS += -DWANT_IDN_PROTOTYPES
-  curl_LDADD += -lnormaliz
-endif
+ifneq ($(findstring -winidn,$(CFG)),)
+  CPPFLAGS += -DUSE_WIN32_IDN
+  CPPFLAGS += -DWANT_IDN_PROTOTYPES
+  LIBS += -lnormaliz
 endif
-ifdef SSPI
-  CFLAGS += -DUSE_WINDOWS_SSPI
 endif
-ifdef SPNEGO
-  CFLAGS += -DHAVE_SPNEGO
+ifneq ($(findstring -sspi,$(CFG)),)
+  CPPFLAGS += -DUSE_WINDOWS_SSPI
 endif
-ifdef IPV6
-  CFLAGS += -DENABLE_IPV6
+ifneq ($(findstring -ipv6,$(CFG)),)
+  CPPFLAGS += -DENABLE_IPV6
 endif
-ifdef LDAPS
-  CFLAGS += -DHAVE_LDAP_SSL
+ifneq ($(findstring -ldaps,$(CFG)),)
+  CPPFLAGS += -DHAVE_LDAP_SSL
 endif
-ifeq ($(findstring -lldap,$(LDFLAGS)),)
-  curl_LDADD += -lwldap32
+ifeq ($(findstring -lldap,$(LIBS)),)
+  LIBS += -lwldap32
 endif
-curl_LDADD += -lws2_32 -lcrypt32 -lbcrypt
+LIBS += -lws2_32 -lcrypt32 -lbcrypt
 
-# Makefile.inc provides the CSOURCES and HHEADERS defines
-include Makefile.inc
+### Sources and targets
 
-ifeq ($(CURL_DLL_A_SUFFIX),)
-CURL_DLL_A_SUFFIX := dll
-endif
+# Provides CSOURCES and HHEADERS
+include Makefile.inc
 
-libcurl_dll_LIBRARY = libcurl$(CURL_DLL_SUFFIX).dll
-libcurl_dll_a_LIBRARY = libcurl$(CURL_DLL_A_SUFFIX).a
-libcurl_a_LIBRARY = libcurl.a
+libcurl_dll_LIBRARY := libcurl$(CURL_DLL_SUFFIX).dll
+libcurl_dll_a_LIBRARY := libcurl.dll.a
+libcurl_a_LIBRARY := libcurl.a
 
 libcurl_a_OBJECTS := $(patsubst %.c,%.o,$(strip $(CSOURCES)))
 libcurl_a_DEPENDENCIES := $(strip $(CSOURCES) $(HHEADERS))
 
-RESOURCE = libcurl.res
+RESOURCE := libcurl.res
 
+### Rules
+
+CC ?= $(CROSSPREFIX)gcc
+RC ?= $(CROSSPREFIX)windres
+AR ?= $(CROSSPREFIX)ar
+
+ifneq ($(findstring /sh,$(SHELL)),)
+DEL = rm -f $1
+else
+DEL = -del 2>NUL /q /f $(subst /,\,$1)
+endif
 
 all: $(libcurl_a_LIBRARY) $(libcurl_dll_LIBRARY)
 
 $(libcurl_a_LIBRARY): $(libcurl_a_OBJECTS) $(libcurl_a_DEPENDENCIES)
        @$(call DEL, $@)
-       $(AR) cru $@ $(libcurl_a_OBJECTS)
-       $(RANLIB) $@
-       $(STRIP) $@
-
-# remove the last line above to keep debug info
+       $(AR) rcs $@ $(libcurl_a_OBJECTS)
 
 $(libcurl_dll_LIBRARY): $(libcurl_a_OBJECTS) $(RESOURCE)
-       @$(call DEL, $@)
-       $(CC) $(LDFLAGS) -shared -o $@ $(libcurl_a_OBJECTS) $(RESOURCE) $(curl_LDADD) \
+       $(CC) $(LDFLAGS) -shared $(CURL_LDFLAGS_LIB) -o $@ $(libcurl_a_OBJECTS) $(RESOURCE) $(LIBS) \
          -Wl,--output-def,$(@:.dll=.def),--out-implib,$(libcurl_dll_a_LIBRARY)
 
 %.o: %.c
-       $(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
 
 %.res: %.rc
-       $(RC) $(RCFLAGS) -i $< -o $@
+       $(RC) -O coff $(RCFLAGS) -i $< -o $@
 
 clean:
        @$(call DEL, $(libcurl_a_OBJECTS) $(RESOURCE))
index 38d62d945474616482f3ab17e792ac8fbd1708cf..01dc30cb0ae8251064dd6786eb757e117eef8714 100644 (file)
 #
 #***************************************************************************
 
-###########################################################################
-#
-# Makefile for building curl.exe with MinGW and optional features.
+# Makefile for building curl with MinGW and optional features.
 #
 # Usage:   mingw32-make -f Makefile.m32 CFG=-feature1[-feature2][-feature3][...]
 # Example: mingw32-make -f Makefile.m32 CFG=-zlib-ssl-sspi-winidn
 #
-# Hint: you can also set environment vars to control the build, e.g.:
-# set ZLIB_PATH=C:/zlib
-# set ZLIB=1
-#
-###########################################################################
-
-PROOT = ..
-
-ifndef ZLIB_PATH
-ZLIB_PATH = $(PROOT)/../zlib
-endif
-ifndef ZSTD_PATH
-ZSTD_PATH = $(PROOT)/../zstd
-endif
-ifndef BROTLI_PATH
-BROTLI_PATH = $(PROOT)/../brotli
-endif
-ifndef OPENSSL_PATH
-OPENSSL_PATH = $(PROOT)/../openssl
-endif
-ifndef LIBSSH2_PATH
-LIBSSH2_PATH = $(PROOT)/../libssh2
-endif
-ifndef LIBRTMP_PATH
-LIBRTMP_PATH = $(PROOT)/../librtmp
-endif
-ifndef LIBGSASL_PATH
-LIBGSASL_PATH = $(PROOT)/../gsasl
-endif
-ifndef LIBIDN2_PATH
-LIBIDN2_PATH = $(PROOT)/../libidn2
-endif
-ifndef NGHTTP2_PATH
-NGHTTP2_PATH = $(PROOT)/../nghttp2
-endif
-ifndef NGHTTP3_PATH
-NGHTTP3_PATH = $(PROOT)/../nghttp3
-endif
-ifndef NGTCP2_PATH
-NGTCP2_PATH = $(PROOT)/../ngtcp2
-endif
-ifndef LIBCARES_PATH
-LIBCARES_PATH = $(PROOT)/../c-ares
-endif
+# Set component roots via envvar <feature>_PATH. CPPFLAGS, LDFLAGS, LIBS,
+# CFLAGS, RCFLAGS (and more) are also available for customization.
 
-ifeq ($(CURL_CC),)
-CURL_CC := $(CROSSPREFIX)gcc
-endif
-ifeq ($(CURL_AR),)
-CURL_AR := $(CROSSPREFIX)ar
-endif
-ifeq ($(CURL_RC),)
-CURL_RC := $(CROSSPREFIX)windres
-endif
+PROOT := ..
 
-CC = $(CURL_CC)
-CFLAGS = -O3 $(CURL_CFLAG_EXTRAS) -W -Wall
-LDFLAGS = $(CURL_LDFLAG_EXTRAS) $(CURL_LDFLAG_EXTRAS_EXE)
-RC = $(CURL_RC)
-RCFLAGS = -I$(PROOT)/include -O coff -DCURL_EMBED_MANIFEST $(CURL_RCFLAG_EXTRAS)
-
-# Set environment var ARCH to your architecture to override autodetection.
-ifndef ARCH
-ifeq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),x86_64)
-ARCH = w64
-else
-ARCH = w32
-endif
-endif
+CPPFLAGS += -I. -I$(PROOT)/include -I$(PROOT)/lib
+RCFLAGS  += -I$(PROOT)/include -DCURL_EMBED_MANIFEST
+LDFLAGS  += -L$(PROOT)/lib
+LIBS     += -lcurl
 
 ifneq ($(ARCH),custom)
-ifeq ($(ARCH),w64)
-CFLAGS  += -m64
-LDFLAGS += -m64
-RCFLAGS += --target=pe-x86-64
-else
-CFLAGS  += -m32
-LDFLAGS += -m32
-RCFLAGS += --target=pe-i386
-endif
-endif
-
-# Platform-dependent helper tool macros
-ifeq ($(findstring /sh,$(SHELL)),/sh)
-DEL     = rm -f $1
-RMDIR   = rm -fr $1
-MKDIR   = mkdir -p $1
-COPY    = -cp -afv $1 $2
-COPYR   = -rsync -aC $1/* $2
-TOUCH   = touch $1
-CAT     = cat
-ECHONL  = echo ""
-DL = '
-else
-ifeq "$(OS)" "Windows_NT"
-DEL     = -del 2>NUL /q /f $(subst /,\,$1)
-RMDIR   = -rd 2>NUL /q /s $(subst /,\,$1)
-else
-DEL     = -del 2>NUL $(subst /,\,$1)
-RMDIR   = -deltree 2>NUL /y $(subst /,\,$1)
-endif
-MKDIR   = -md 2>NUL $(subst /,\,$1)
-COPY    = -copy 2>NUL /y $(subst /,\,$1) $(subst /,\,$2)
-COPYR   = -xcopy 2>NUL /q /y /e $(subst /,\,$1) $(subst /,\,$2)
-TOUCH   = copy 2>&1>NUL /b $(subst /,\,$1) +,,
-CAT     = type
-ECHONL  = $(ComSpec) /c echo.
+  # Set environment var ARCH to your architecture to override autodetection.
+  ifndef ARCH
+    ifneq ($(findstring x86_64,$(shell $(CC) -dumpmachine)),)
+      ARCH := w64
+    else
+      ARCH := w32
+    endif
+  endif
+  ifeq ($(ARCH),w64)
+    CFLAGS  += -m64
+    LDFLAGS += -m64
+    RCFLAGS += --target=pe-x86-64
+  else
+    CFLAGS  += -m32
+    LDFLAGS += -m32
+    RCFLAGS += --target=pe-i386
+  endif
 endif
 
-########################################################
-## Nothing more to do below this line!
+### Optional features
 
 ifneq ($(findstring -dyn,$(CFG)),)
-DYN = 1
+  curl_DEPENDENCIES := $(PROOT)/lib/libcurl$(CURL_DLL_SUFFIX).dll
+  curl_DEPENDENCIES += $(PROOT)/lib/libcurl.dll.a
+else
+  curl_DEPENDENCIES := $(PROOT)/lib/libcurl.a
+  CPPFLAGS += -DCURL_STATICLIB
+  LDFLAGS += -static
 endif
-ifneq ($(findstring -ares,$(CFG)),)
-ARES = 1
+
+ifneq ($(findstring -unicode,$(CFG)),)
+  CPPFLAGS += -DUNICODE -D_UNICODE
+  LDFLAGS += -municode
 endif
 ifneq ($(findstring -sync,$(CFG)),)
-SYNC = 1
+else
+  ifneq ($(findstring -ares,$(CFG)),)
+    LIBCARES_PATH ?= $(PROOT)/../c-ares
+    LDFLAGS += -L"$(LIBCARES_PATH)/lib"
+    LIBS += -lcares
+  endif
 endif
 ifneq ($(findstring -rtmp,$(CFG)),)
-RTMP = 1
-ZLIB = 1
+  LIBRTMP_PATH ?= $(PROOT)/../librtmp
+  LDFLAGS += -L"$(LIBRTMP_PATH)/librtmp"
+  LIBS += -lrtmp -lwinmm
+  ZLIB := 1
 endif
 ifneq ($(findstring -ssh2,$(CFG)),)
-SSH2 = 1
-ZLIB = 1
+  LIBSSH2_PATH ?= $(PROOT)/../libssh2
+  LDFLAGS += -L"$(LIBSSH2_PATH)/lib"
+  LDFLAGS += -L"$(LIBSSH2_PATH)/win32"
+  LIBS += -lssh2
 endif
-ifneq ($(findstring -ssl,$(CFG)),)
-SSL = 1
+ifneq ($(findstring -nghttp2,$(CFG)),)
+  NGHTTP2_PATH ?= $(PROOT)/../nghttp2
+  LDFLAGS += -L"$(NGHTTP2_PATH)/lib"
+  LIBS += -lnghttp2
 endif
-ifneq ($(findstring -zlib,$(CFG)),)
-ZLIB = 1
+ifneq ($(findstring -nghttp3,$(CFG)),)
+  ifneq ($(findstring -ngtcp2,$(CFG)),)
+    NGHTTP3_PATH ?= $(PROOT)/../nghttp3
+    LDFLAGS += -L"$(NGHTTP3_PATH)/lib"
+    LIBS += -lnghttp3
+    NGTCP2_PATH ?= $(PROOT)/../ngtcp2
+    LDFLAGS += -L"$(NGTCP2_PATH)/lib"
+    NGTCP2_LIBS ?= -lngtcp2 -lngtcp2_crypto_openssl
+    LIBS += $(NGTCP2_LIBS)
+  endif
+endif
+ifneq ($(findstring -ssl,$(CFG)),)
+  OPENSSL_PATH ?= $(PROOT)/../openssl
+  OPENSSL_LIBPATH ?= $(OPENSSL_PATH)/lib
+  LDFLAGS += -L"$(OPENSSL_LIBPATH)"
+  OPENSSL_LIBS ?= -lssl -lcrypto
+  LIBS += $(OPENSSL_LIBS)
+endif
+ifneq ($(findstring -zlib,$(CFG))$(ZLIB),)
+  ZLIB_PATH ?= $(PROOT)/../zlib
+  CPPFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
+  CPPFLAGS += -I"$(ZLIB_PATH)"
+  LDFLAGS += -L"$(ZLIB_PATH)"
+  LIBS += -lz
 endif
 ifneq ($(findstring -zstd,$(CFG)),)
-ZSTD = 1
+  ZSTD_PATH ?= $(PROOT)/../zstd
+  LDFLAGS += -L"$(ZSTD_PATH)/lib"
+  ZSTD_LIBS ?= -lzstd
+  LIBS += $(ZSTD_LIBS)
 endif
 ifneq ($(findstring -brotli,$(CFG)),)
-BROTLI = 1
+  BROTLI_PATH ?= $(PROOT)/../brotli
+  LDFLAGS += -L"$(BROTLI_PATH)/lib"
+  BROTLI_LIBS ?= -lbrotlidec -lbrotlicommon
+  LIBS += $(BROTLI_LIBS)
 endif
 ifneq ($(findstring -gsasl,$(CFG)),)
-GSASL = 1
+  LIBGSASL_PATH ?= $(PROOT)/../gsasl
+  LDFLAGS += -L"$(LIBGSASL_PATH)/lib"
+  LIBS += -lgsasl
 endif
 ifneq ($(findstring -idn2,$(CFG)),)
-IDN2 = 1
-endif
+  LIBIDN2_PATH ?= $(PROOT)/../libidn2
+  LDFLAGS += -L"$(LIBIDN2_PATH)/lib"
+  LIBS += -lidn2
+else
 ifneq ($(findstring -winidn,$(CFG)),)
-WINIDN = 1
-endif
-ifneq ($(findstring -sspi,$(CFG)),)
-SSPI = 1
-endif
-ifneq ($(findstring -ldaps,$(CFG)),)
-LDAPS = 1
+  LIBS += -lnormaliz
 endif
-ifneq ($(findstring -ipv6,$(CFG)),)
-IPV6 = 1
 endif
-ifneq ($(findstring -schannel,$(CFG))$(findstring -winssl,$(CFG)),)
-SCHANNEL = 1
-SSPI = 1
-endif
-ifneq ($(findstring -nghttp2,$(CFG)),)
-NGHTTP2 = 1
-endif
-ifneq ($(findstring -nghttp3,$(CFG)),)
-NGHTTP3 = 1
-endif
-ifneq ($(findstring -ngtcp2,$(CFG)),)
-NGTCP2 = 1
-endif
-ifneq ($(findstring -unicode,$(CFG)),)
-UNICODE = 1
+ifeq ($(findstring -lldap,$(LIBS)),)
+  LIBS += -lwldap32
 endif
+LIBS += -lws2_32 -lcrypt32 -lbcrypt
 
-# SSH2 and RTMP require an SSL library; assume OpenSSL if none specified
-ifneq ($(SSH2)$(RTMP),)
-  ifeq ($(SSL)$(SCHANNEL),)
-    SSL = 1
-  endif
-endif
-
-INCLUDES = -I. -I$(PROOT)/include -I$(PROOT)/lib
-ifdef SSL
-  ifdef SCHANNEL
-    CFLAGS += -DCURL_WITH_MULTI_SSL
-  endif
-endif
-ifdef UNICODE
-  CFLAGS += -DUNICODE -D_UNICODE
-  LDFLAGS += -municode
-endif
+### Sources and targets
 
-ifdef DYN
-  curl_DEPENDENCIES = $(PROOT)/lib/libcurldll.a $(PROOT)/lib/libcurl.dll
-  curl_LDADD = -L$(PROOT)/lib -lcurldll
-else
-  curl_DEPENDENCIES = $(PROOT)/lib/libcurl.a
-  curl_LDADD = -L$(PROOT)/lib -lcurl
-  CFLAGS += -DCURL_STATICLIB
-  LDFLAGS += -static
-endif
-ifdef SYNC
-  CFLAGS += -DUSE_SYNC_DNS
-else
-  ifdef ARES
-    CFLAGS += -DUSE_ARES -DCARES_STATICLIB
-    curl_LDADD += -L"$(LIBCARES_PATH)" -lcares
-  endif
-endif
-ifdef RTMP
-  CFLAGS += -DUSE_LIBRTMP
-  curl_LDADD += -L"$(LIBRTMP_PATH)/librtmp" -lrtmp -lwinmm
-endif
-ifdef NGHTTP2
-  CFLAGS += -DUSE_NGHTTP2
-  curl_LDADD += -L"$(NGHTTP2_PATH)/lib" -lnghttp2
-endif
-ifdef SSH2
-  CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H
-  curl_LDADD += -L"$(LIBSSH2_PATH)/win32" -lssh2
-endif
-ifdef NGHTTP3
-  CFLAGS += -DUSE_NGHTTP3
-  curl_LDADD += -L"$(NGHTTP3_PATH)/lib" -lnghttp3
-  ifdef NGTCP2
-    CFLAGS += -DUSE_NGTCP2
-    curl_LDADD += -L"$(NGTCP2_PATH)/lib"
-    ifdef NGTCP2_LIBS
-      curl_LDADD += $(NGTCP2_LIBS)
-    else
-      curl_LDADD += -lngtcp2
-      ifdef SSL
-        curl_LDADD += -lngtcp2_crypto_openssl
-      endif
-    endif
-  endif
-endif
-ifdef SSL
-  ifndef OPENSSL_INCLUDE
-    OPENSSL_INCLUDE = $(OPENSSL_PATH)/include
-  endif
-  ifndef OPENSSL_LIBPATH
-    OPENSSL_LIBS = -lssl -lcrypto
-    OPENSSL_LIBPATH = $(OPENSSL_PATH)/lib
-  endif
-  INCLUDES += -I"$(OPENSSL_INCLUDE)"
-  CFLAGS += -DUSE_OPENSSL
-  curl_LDADD += -L"$(OPENSSL_LIBPATH)" $(OPENSSL_LIBS)
-endif
-ifdef SCHANNEL
-  CFLAGS += -DUSE_SCHANNEL
-endif
-ifdef ZLIB
-  INCLUDES += -I"$(ZLIB_PATH)"
-  CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
-  curl_LDADD += -L"$(ZLIB_PATH)" -lz
-endif
-ifdef ZSTD
-  INCLUDES += -I"$(ZSTD_PATH)/include"
-  CFLAGS += -DHAVE_ZSTD
-  curl_LDADD += -L"$(ZSTD_PATH)/lib"
-  ifdef ZSTD_LIBS
-    curl_LDADD += $(ZSTD_LIBS)
-  else
-    curl_LDADD += -lzstd
-  endif
-endif
-ifdef BROTLI
-  INCLUDES += -I"$(BROTLI_PATH)/include"
-  CFLAGS += -DHAVE_BROTLI
-  curl_LDADD += -L"$(BROTLI_PATH)/lib"
-  ifdef BROTLI_LIBS
-    curl_LDADD += $(BROTLI_LIBS)
-  else
-    curl_LDADD += -lbrotlidec
-  endif
-endif
-ifdef GSASL
-  CFLAGS += -DUSE_GSASL
-  curl_LDADD += -L"$(LIBGSASL_PATH)/lib" -lgsasl
-endif
-ifdef IDN2
-  CFLAGS += -DUSE_LIBIDN2
-  curl_LDADD += -L"$(LIBIDN2_PATH)/lib" -lidn2
-else
-ifdef WINIDN
-  CFLAGS += -DUSE_WIN32_IDN
-  curl_LDADD += -lnormaliz
-endif
-endif
-ifdef SSPI
-  CFLAGS += -DUSE_WINDOWS_SSPI
-endif
-ifdef IPV6
-  CFLAGS += -DENABLE_IPV6
-endif
-ifdef LDAPS
-  CFLAGS += -DHAVE_LDAP_SSL
-endif
-ifeq ($(findstring -lldap,$(LDFLAGS)),)
-  curl_LDADD += -lwldap32
-endif
-curl_LDADD += -lws2_32 -lcrypt32 -lbcrypt
-
-# Makefile.inc provides the CURL_CFILES and CURLX_CFILES defines
+# Provides CURL_CFILES and CURLX_CFILES
 include Makefile.inc
 
-TARGETS = curl.exe
+TARGETS := curl.exe
 curl_OBJECTS := $(patsubst %.c,%.o,$(strip $(CURL_CFILES)))
 curl_OBJECTS += $(patsubst %.c,%.o,$(notdir $(strip $(CURLX_CFILES))))
 vpath %.c $(PROOT)/lib
 
-RESOURCE = curl.res
+RESOURCE := curl.res
+
+### Rules
 
+CC ?= $(CROSSPREFIX)gcc
+RC ?= $(CROSSPREFIX)windres
+
+ifneq ($(findstring /sh,$(SHELL)),)
+DEL = rm -f $1
+else
+DEL = -del 2>NUL /q /f $(subst /,\,$1)
+endif
 
 all: $(TARGETS)
 
-curl.exe: $(curl_OBJECTS) $(RESOURCE) $(curl_DEPENDENCIES)
-       @$(call DEL, $@)
-       $(CC) $(LDFLAGS) -o $@ $(curl_OBJECTS) $(RESOURCE) $(curl_LDADD)
+$(TARGETS): $(curl_OBJECTS) $(RESOURCE) $(curl_DEPENDENCIES)
+       $(CC) $(LDFLAGS) $(CURL_LDFLAGS_BIN) -o $@ $(curl_OBJECTS) $(RESOURCE) $(LIBS)
 
 %.o: %.c
-       $(CC) $(INCLUDES) $(CFLAGS) -c $<
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
 
 %.res: %.rc
-       $(RC) $(RCFLAGS) -i $< -o $@
+       $(RC) -O coff $(RCFLAGS) -i $< -o $@
 
 clean:
        @$(call DEL, $(curl_OBJECTS) $(RESOURCE))