mirror of
https://github.com/curl/curl.git
synced 2024-12-21 06:50:10 +08:00
60c3d04465
Implement the "unity" builds as known from CMake, but for autotools. It's limited to `lib` and `src` (CMake also supports it in `tests`). Enable with: `--enable-unity` (disabled by default) Unity builds speed up builds significantly. Cygwin and Windows builds in particular, but the effect is noticeable on most systems. It also allows discovering unity issues with autotools, benefitting also CMake when building the same combination. In CI it makes turnaround times quicker. This closes build performance with CMake. autotools still lags behind because it builds shared and static libcurl in two, separate passes. CMake does it in one. Manpage compilation isn't batched, it is in CMake. After unity and test bundle support the slowest parts of the build are the configuration phase (which is effectively a tedious, non-parallel, compilation and/or linking of 300+ tiny programs. The next bottleneck is compiling individual examples and finally test servers (only slow with autotools). The autotools implementation is slightly less efficient than CMake, because 3 sources are permanently excluded while in CMake this isn't necessary and solved more efficiently while building libtests. There is also no 'unity' support for tests, making them a less efficient also. Enable it in CI for most `configure` jobs. Except in GHA/dist (though it works fine there too), to use the default config there. Also skip for the Linux AWC-LC job where it made builds time a few seconds longer (reason undiscovered.) Autotools test suite builds compared between master -> `--enable-unity`: - GHA/Linux: 32s -> 12s https://github.com/curl/curl/actions/runs/10705668823/job/29681617374 https://github.com/curl/curl/actions/runs/10742978889/job/29796766297 - GHA/macOS: 37s -> 10s https://github.com/curl/curl/actions/runs/10705668813/job/29681632885 https://github.com/curl/curl/actions/runs/10742978699/job/29796768875 - GHA/FreeBSD: 15m25 -> 10m58 (full workflow time, ~qemu) https://github.com/curl/curl/actions/runs/10705668811/job/29681607915 https://github.com/curl/curl/actions/runs/10742978937/job/29796766115 - GHA/Cygwin: 3m32 -> 1m21 https://github.com/curl/curl/actions/runs/10705668809/job/29681609965 https://github.com/curl/curl/actions/runs/10742978645/job/29796756933 - GHA/MSYS2: 2m42 -> 50s https://github.com/curl/curl/actions/runs/10705668808/job/29681621166 https://github.com/curl/curl/actions/runs/10742978662/job/29799739289 - GHA/mingw-w64: 5m32 -> 1m23 https://github.com/curl/curl/actions/runs/10705668808/job/29681628787 https://github.com/curl/curl/actions/runs/10742978662/job/29799741568 Closes #14815
172 lines
5.5 KiB
Makefile
172 lines
5.5 KiB
Makefile
#***************************************************************************
|
|
# _ _ ____ _
|
|
# Project ___| | | | _ \| |
|
|
# / __| | | | |_) | |
|
|
# | (__| |_| | _ <| |___
|
|
# \___|\___/|_| \_\_____|
|
|
#
|
|
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
|
|
#
|
|
# This software is licensed as described in the file COPYING, which
|
|
# you should have received as part of this distribution. The terms
|
|
# are also available at https://curl.se/docs/copyright.html.
|
|
#
|
|
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
|
# copies of the Software, and permit persons to whom the Software is
|
|
# furnished to do so, under the terms of the COPYING file.
|
|
#
|
|
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
# KIND, either express or implied.
|
|
#
|
|
# SPDX-License-Identifier: curl
|
|
#
|
|
###########################################################################
|
|
AUTOMAKE_OPTIONS = foreign nostdinc
|
|
|
|
CMAKE_DIST = CMakeLists.txt curl_config.h.cmake
|
|
|
|
CHECKSRC_DIST = .checksrc vauth/.checksrc vquic/.checksrc vssh/.checksrc \
|
|
vtls/.checksrc
|
|
|
|
EXTRA_DIST = Makefile.mk config-win32.h config-win32ce.h config-plan9.h \
|
|
config-riscos.h config-mac.h curl_config.h.in config-dos.h libcurl.rc \
|
|
config-amigaos.h config-win32ce.h config-os400.h setup-os400.h \
|
|
$(CMAKE_DIST) setup-win32.h Makefile.soname optiontable.pl libcurl.def \
|
|
$(CHECKSRC_DIST)
|
|
|
|
lib_LTLIBRARIES = libcurl.la
|
|
|
|
if BUILD_UNITTESTS
|
|
noinst_LTLIBRARIES = libcurlu.la
|
|
else
|
|
noinst_LTLIBRARIES =
|
|
endif
|
|
|
|
# This might hold -Werror
|
|
CFLAGS += @CURL_CFLAG_EXTRAS@
|
|
|
|
# Specify our include paths here, and do it relative to $(top_srcdir) and
|
|
# $(top_builddir), to ensure that these paths which belong to the library
|
|
# being currently built and tested are searched before the library which
|
|
# might possibly already be installed in the system.
|
|
#
|
|
# $(top_srcdir)/include is for libcurl's external include files
|
|
# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
|
|
# $(top_srcdir)/lib for libcurl's lib/curl_setup.h and other "private" files
|
|
|
|
AM_CPPFLAGS = -I$(top_srcdir)/include \
|
|
-I$(top_builddir)/lib \
|
|
-I$(top_srcdir)/lib
|
|
|
|
# Prevent LIBS from being used for all link targets
|
|
LIBS = $(BLANK_AT_MAKETIME)
|
|
|
|
include Makefile.soname
|
|
|
|
AM_CPPFLAGS += -DBUILDING_LIBCURL
|
|
AM_LDFLAGS =
|
|
AM_CFLAGS =
|
|
|
|
# Makefile.inc provides the CSOURCES and HHEADERS defines
|
|
include Makefile.inc
|
|
|
|
if USE_UNITY
|
|
# Keep these separate to avoid duplicate definitions when linking libtests
|
|
# in static mode.
|
|
curl_EXCLUDE = curl_threads.c timediff.c warnless.c
|
|
if DEBUGBUILD
|
|
# We must compile these sources separately to avoid memdebug.h redefinitions
|
|
# applying to them.
|
|
curl_EXCLUDE += memdebug.c curl_multibyte.c
|
|
endif
|
|
libcurl_unity.c: $(top_srcdir)/scripts/mk-unity.pl $(CSOURCES)
|
|
@PERL@ $(top_srcdir)/scripts/mk-unity.pl $(srcdir) $(CSOURCES) --exclude $(curl_EXCLUDE) > libcurl_unity.c
|
|
|
|
nodist_libcurl_la_SOURCES = libcurl_unity.c
|
|
libcurl_la_SOURCES = $(curl_EXCLUDE)
|
|
nodist_libcurlu_la_SOURCES = libcurl_unity.c
|
|
libcurlu_la_SOURCES = $(curl_EXCLUDE)
|
|
CLEANFILES = libcurl_unity.c
|
|
else
|
|
libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS)
|
|
libcurlu_la_SOURCES = $(CSOURCES) $(HHEADERS)
|
|
endif
|
|
|
|
libcurl_la_CPPFLAGS_EXTRA =
|
|
libcurl_la_LDFLAGS_EXTRA =
|
|
libcurl_la_CFLAGS_EXTRA =
|
|
|
|
if CURL_LT_SHLIB_USE_VERSION_INFO
|
|
libcurl_la_LDFLAGS_EXTRA += $(VERSIONINFO)
|
|
endif
|
|
|
|
if CURL_LT_SHLIB_USE_NO_UNDEFINED
|
|
libcurl_la_LDFLAGS_EXTRA += -no-undefined
|
|
endif
|
|
|
|
if CURL_LT_SHLIB_USE_MIMPURE_TEXT
|
|
libcurl_la_LDFLAGS_EXTRA += -mimpure-text
|
|
endif
|
|
|
|
if CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS
|
|
libcurl_la_LDFLAGS_EXTRA += -Wl,--version-script=libcurl.vers
|
|
else
|
|
# if symbol-hiding is enabled, hide them!
|
|
if DOING_CURL_SYMBOL_HIDING
|
|
libcurl_la_LDFLAGS_EXTRA += -export-symbols-regex '^curl_.*'
|
|
endif
|
|
endif
|
|
|
|
if USE_CPPFLAG_CURL_STATICLIB
|
|
libcurl_la_CPPFLAGS_EXTRA += -DCURL_STATICLIB
|
|
else
|
|
if HAVE_WINDRES
|
|
libcurl_la_SOURCES += $(LIB_RCFILES)
|
|
$(LIB_RCFILES): $(top_srcdir)/include/curl/curlver.h
|
|
endif
|
|
endif
|
|
|
|
if DOING_CURL_SYMBOL_HIDING
|
|
libcurl_la_CPPFLAGS_EXTRA += -DCURL_HIDDEN_SYMBOLS
|
|
libcurl_la_CFLAGS_EXTRA += $(CFLAG_CURL_SYMBOL_HIDING)
|
|
endif
|
|
|
|
libcurl_la_CPPFLAGS = $(AM_CPPFLAGS) $(libcurl_la_CPPFLAGS_EXTRA)
|
|
libcurl_la_LDFLAGS = $(AM_LDFLAGS) $(libcurl_la_LDFLAGS_EXTRA) $(CURL_LDFLAGS_LIB) $(LIBCURL_PC_LIBS_PRIVATE)
|
|
libcurl_la_CFLAGS = $(AM_CFLAGS) $(libcurl_la_CFLAGS_EXTRA)
|
|
|
|
libcurlu_la_CPPFLAGS = $(AM_CPPFLAGS) -DCURL_STATICLIB -DUNITTESTS
|
|
libcurlu_la_LDFLAGS = $(AM_LDFLAGS) -static $(LIBCURL_PC_LIBS_PRIVATE)
|
|
libcurlu_la_CFLAGS = $(AM_CFLAGS)
|
|
|
|
CHECKSRC = $(CS_$(V))
|
|
CS_0 = @echo " RUN " $@;
|
|
CS_1 =
|
|
CS_ = $(CS_0)
|
|
|
|
checksrc:
|
|
$(CHECKSRC)(@PERL@ $(top_srcdir)/scripts/checksrc.pl -D$(srcdir) \
|
|
-W$(srcdir)/curl_config.h $(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] \
|
|
$(srcdir)/vtls/*.[ch] $(srcdir)/vquic/*.[ch] $(srcdir)/vssh/*.[ch])
|
|
|
|
if DEBUGBUILD
|
|
# for debug builds, we scan the sources on all regular make invokes
|
|
all-local: checksrc
|
|
endif
|
|
|
|
# disable the tests that are mostly causing false positives
|
|
TIDYFLAGS=-checks=-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-valist.Uninitialized,-clang-analyzer-core.NonNullParamChecker,-clang-analyzer-core.NullDereference -quiet
|
|
|
|
TIDY:=clang-tidy
|
|
|
|
tidy:
|
|
$(TIDY) $(CSOURCES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H
|
|
|
|
optiontable:
|
|
perl optiontable.pl < $(top_srcdir)/include/curl/curl.h > easyoptions.c
|
|
|
|
if HAVE_WINDRES
|
|
.rc.lo:
|
|
$(LIBTOOL) --tag=RC --mode=compile $(RC) -I$(top_srcdir)/include $(RCFLAGS) -i $< -o $@
|
|
endif
|