diff options
author | Viktor Szakats <commit@vsz.me> | 2022-10-03 19:46:56 +0000 |
---|---|---|
committer | Viktor Szakats <commit@vsz.me> | 2022-10-03 19:46:56 +0000 |
commit | 10fbd8b4e3f83b967fd9ad9a41ab484c0e7e7ca3 (patch) | |
tree | b789fa8476794d5f342767abde3c2f79602225e6 /docs/examples | |
parent | c5d8895645203a0aafbdbb775f91d3a7af85a37d (diff) | |
download | curl-10fbd8b4e3f83b967fd9ad9a41ab484c0e7e7ca3.tar.gz |
Makefile.m32: major rework [ci skip]
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
Diffstat (limited to 'docs/examples')
-rw-r--r-- | docs/examples/Makefile.m32 | 385 |
1 files changed, 109 insertions, 276 deletions
diff --git a/docs/examples/Makefile.m32 b/docs/examples/Makefile.m32 index ab07bab13..1fcb2502b 100644 --- a/docs/examples/Makefile.m32 +++ b/docs/examples/Makefile.m32 @@ -22,335 +22,168 @@ # #*************************************************************************** -########################################################################### -# # 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)) |