diff options
author | Viktor Szakats <commit@vsz.me> | 2022-10-04 17:09:51 +0000 |
---|---|---|
committer | Viktor Szakats <commit@vsz.me> | 2022-10-04 17:11:02 +0000 |
commit | 784400806c43619b4a3ccc45982fbba8f33c9aea (patch) | |
tree | 27f18469826350bc04c18176c3ab39db4e69ea04 /src | |
parent | a2d0154e93eeb3d7477106c124cdb6765c0b86e1 (diff) | |
download | curl-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.m32 | 155 |
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 |