summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorViktor Szakats <commit@vsz.me>2022-10-04 17:09:51 +0000
committerViktor Szakats <commit@vsz.me>2022-10-04 17:11:02 +0000
commit784400806c43619b4a3ccc45982fbba8f33c9aea (patch)
tree27f18469826350bc04c18176c3ab39db4e69ea04 /src
parenta2d0154e93eeb3d7477106c124cdb6765c0b86e1 (diff)
downloadcurl-784400806c43619b4a3ccc45982fbba8f33c9aea.tar.gz
Makefile.m32: deduplicate build rules [ci skip]
After this patch, we reduce the three copies of most `Makefile.m32` logic to one. This now resides in `lib/Makefile.m32`. It makes future updates easier, the code shorter, with a small amount of added complexity. `Makefile.m32` reduction: | | bytes | LOC total | blank | comment | code | |-------------------|-------:|----------:|-------:|---------:|------:| | 7.85.0 | 34772 | 1337 | 79 | 192 | 1066 | | before this patch | 17601 | 625 | 62 | 106 | 457 | | after this patch | 11680 | 392 | 52 | 104 | 236 | Details: - Change rules to create objects for the `v*` subdirs in the `lib` dir. This allows to use a shared compile rule and assumes that filenames are not (and will not be) colliding across these directories. `Makefile.m32` now also stores a list of these subdirs. They are changing rarely though. - Sync as much as possible between the three `Makefile.m32` scripts' rules and their source/target sections. - After this patch `CPPFLAGS` are all applied to the `src` sources once again. This matches the behaviour of cmake/autotools. Only zlib ones are actually required there. - Use `.rc` names from `Makefile.inc` instead of keeping a duplicate. - Change examples to link `libcurl.dll` by default. This makes building trivial, even as a cross-build: `CC=x86_64-w64-mingw32-gcc make -f Makefile.m32` To run them, you need to move/copy or add-to-path `libcurl.dll`. You can select static mode via `CFG=-static`. - List more of the `Makefile.m32` config variables. - Drop `.rc` support from examples. It made it fragile without much benefit. - Include a necessary system lib for the `externalsocket.c` example. - Exclude unnecessary systems libs when building in `-dyn` mode. Closes #9642
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.m32155
1 files changed, 13 insertions, 142 deletions
diff --git a/src/Makefile.m32 b/src/Makefile.m32
index 01dc30cb0..298fc8acc 100644
--- a/src/Makefile.m32
+++ b/src/Makefile.m32
@@ -22,173 +22,44 @@
#
#***************************************************************************
-# 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
-#
-# Set component roots via envvar <feature>_PATH. CPPFLAGS, LDFLAGS, LIBS,
-# CFLAGS, RCFLAGS (and more) are also available for customization.
+# See usage in lib/Makefile.m32
PROOT := ..
-CPPFLAGS += -I. -I$(PROOT)/include -I$(PROOT)/lib
-RCFLAGS += -I$(PROOT)/include -DCURL_EMBED_MANIFEST
+RCFLAGS += -DCURL_EMBED_MANIFEST
+CPPFLAGS += -I$(PROOT)/lib
LDFLAGS += -L$(PROOT)/lib
LIBS += -lcurl
-ifneq ($(ARCH),custom)
- # 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
-
-### Optional features
-
ifneq ($(findstring -dyn,$(CFG)),)
curl_DEPENDENCIES := $(PROOT)/lib/libcurl$(CURL_DLL_SUFFIX).dll
curl_DEPENDENCIES += $(PROOT)/lib/libcurl.dll.a
+ DYN := 1
else
curl_DEPENDENCIES := $(PROOT)/lib/libcurl.a
CPPFLAGS += -DCURL_STATICLIB
LDFLAGS += -static
endif
-ifneq ($(findstring -unicode,$(CFG)),)
- CPPFLAGS += -DUNICODE -D_UNICODE
- LDFLAGS += -municode
-endif
-ifneq ($(findstring -sync,$(CFG)),)
-else
- ifneq ($(findstring -ares,$(CFG)),)
- LIBCARES_PATH ?= $(PROOT)/../c-ares
- LDFLAGS += -L"$(LIBCARES_PATH)/lib"
- LIBS += -lcares
- endif
-endif
-ifneq ($(findstring -rtmp,$(CFG)),)
- LIBRTMP_PATH ?= $(PROOT)/../librtmp
- LDFLAGS += -L"$(LIBRTMP_PATH)/librtmp"
- LIBS += -lrtmp -lwinmm
- ZLIB := 1
-endif
-ifneq ($(findstring -ssh2,$(CFG)),)
- 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)),)
- 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_PATH ?= $(PROOT)/../zstd
- LDFLAGS += -L"$(ZSTD_PATH)/lib"
- ZSTD_LIBS ?= -lzstd
- LIBS += $(ZSTD_LIBS)
-endif
-ifneq ($(findstring -brotli,$(CFG)),)
- BROTLI_PATH ?= $(PROOT)/../brotli
- LDFLAGS += -L"$(BROTLI_PATH)/lib"
- BROTLI_LIBS ?= -lbrotlidec -lbrotlicommon
- LIBS += $(BROTLI_LIBS)
-endif
-ifneq ($(findstring -gsasl,$(CFG)),)
- LIBGSASL_PATH ?= $(PROOT)/../gsasl
- LDFLAGS += -L"$(LIBGSASL_PATH)/lib"
- LIBS += -lgsasl
-endif
-ifneq ($(findstring -idn2,$(CFG)),)
- LIBIDN2_PATH ?= $(PROOT)/../libidn2
- LDFLAGS += -L"$(LIBIDN2_PATH)/lib"
- LIBS += -lidn2
-else
-ifneq ($(findstring -winidn,$(CFG)),)
- LIBS += -lnormaliz
-endif
-endif
-ifeq ($(findstring -lldap,$(LIBS)),)
- LIBS += -lwldap32
-endif
-LIBS += -lws2_32 -lcrypt32 -lbcrypt
-
### Sources and targets
-# Provides CURL_CFILES and CURLX_CFILES
+# Provides CURL_CFILES, CURLX_CFILES, CURL_RCFILES
include Makefile.inc
TARGETS := curl.exe
+
curl_OBJECTS := $(patsubst %.c,%.o,$(strip $(CURL_CFILES)))
curl_OBJECTS += $(patsubst %.c,%.o,$(notdir $(strip $(CURLX_CFILES))))
+curl_OBJECTS += $(patsubst %.rc,%.res,$(strip $(CURL_RCFILES)))
vpath %.c $(PROOT)/lib
-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)
-
-$(TARGETS): $(curl_OBJECTS) $(RESOURCE) $(curl_DEPENDENCIES)
- $(CC) $(LDFLAGS) $(CURL_LDFLAGS_BIN) -o $@ $(curl_OBJECTS) $(RESOURCE) $(LIBS)
+TOCLEAN := $(curl_OBJECTS)
-%.o: %.c
- $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
+### Local rules
-%.res: %.rc
- $(RC) -O coff $(RCFLAGS) -i $< -o $@
+$(TARGETS): $(curl_OBJECTS) $(curl_DEPENDENCIES)
+ $(CC) $(LDFLAGS) $(CURL_LDFLAGS_BIN) -o $@ $(curl_OBJECTS) $(LIBS)
-clean:
- @$(call DEL, $(curl_OBJECTS) $(RESOURCE))
+### Global script
-distclean vclean: clean
- @$(call DEL, $(TARGETS))
+include $(PROOT)/lib/Makefile.m32