From: Willy Tarreau Date: Mon, 31 Jan 2022 10:54:16 +0000 (+0100) Subject: BUILD: makefile: avoid testing all -Wno-* options when not needed X-Git-Tag: v2.6-dev1~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7a1e6fe128d6276516bf4ec3a4ce05c16f9dc16d;p=thirdparty%2Fhaproxy.git BUILD: makefile: avoid testing all -Wno-* options when not needed We already have 9 different warning shutup options and this list grows with each new version. Testing for their support takes some time at the makefile's initialisation which is visible on all options (make clean etc). Some compilers like clang are extremely slow to validate them all and spend roughly half a second on modern machines to validate all options. And some compilers are happier than others when passed a -Wno-* option they do not know: - gcc < 4 complains loudly - gcc 4 and above do not say anything, unless there is already another warning, in which case they will report about the unknown option as well, but without affecting the return code - clang by default rejects unknown options but supports a special option -Wno-unknown-warning-option to silently ignore them This patch improves the situation a bit by detecting if the compiler already supports random options, only supports them when called with -Wno-unknown-warning-option, or not at all. Based on this, a variable is set to indicate if we can avoid testing for all unknown options and assume they are supported, and another one is set to hold the optionally required option to shut the warning. This results in almost halving the makefile's startup time, which is particularly appreciable with latest compilers which become really fat (the other half is caused by the same tests on various cc-opt). --- diff --git a/Makefile b/Makefile index 57c7510a12..cae5b6f468 100644 --- a/Makefile +++ b/Makefile @@ -138,11 +138,27 @@ cc-opt = $(shell set -e; if $(CC) -Werror $(1) -E -xc - -o /dev/null &0 2>/dev/null; then echo "$(1)"; else echo "$(2)"; fi;) + +# Below we verify that the compiler supports any -Wno-something option to +# disable any warning, or if a special option is needed to achieve that. This +# will allow to get rid of testing when the compiler doesn't care. The result +# is made of two variables: +# - cc-anywno that's non-empty if the compiler supports disabling anything +# - cc-wnouwo that may contain an option needed to enable this behavior +# Gcc 4.x and above do not need any option but will still complain about unknown +# options if another warning or error happens, and as such they're not testable. +# Clang needs a special option -Wno-unknown-warning-option. Compilers not +# supporting this option will check all warnings individually. +cc-anywno := $(call cc-opt,-Wno-haproxy-warning) +cc-wnouwo := $(if $(cc-anywno),,$(call cc-opt,-Wno-unknown-warning-option)) +cc-anywno := $(if $(cc-anywno)$(cc-wnouwo),1) + # Disable a warning when supported by the compiler. Don't put spaces around the # warning! And don't use cc-opt which doesn't always report an error until -# another one is also returned. +# another one is also returned. If "cc-anywno" is set, the compiler supports +# -Wno- followed by anything so we don't even need to start the compiler. # Usage: CFLAGS += $(call cc-nowarn,warning). Eg: $(call cc-opt,format-truncation) -cc-nowarn = $(shell set -e; if $(CC) -Werror -W$(1) -E -xc - -o /dev/null &0 2>/dev/null; then echo "-Wno-$(1)"; fi;) +cc-nowarn = $(if $(cc-anywno),-Wno-$(1),$(shell set -e; if $(CC) -Werror -W$(1) -E -xc - -o /dev/null &0 2>/dev/null; then echo "-Wno-$(1)"; fi;)) #### Installation options. DESTDIR = @@ -195,6 +211,7 @@ REG_TEST_SCRIPT=./scripts/run-regtests.sh # to be sure we get the intended behavior. SPEC_CFLAGS := -Wall -Wextra -Wundef -Wdeclaration-after-statement SPEC_CFLAGS += $(call cc-opt-alt,-fwrapv,$(call cc-opt,-fno-strict-overflow)) +SPEC_CFLAGS += $(cc-wnouwo) SPEC_CFLAGS += $(call cc-nowarn,address-of-packed-member) SPEC_CFLAGS += $(call cc-nowarn,unused-label) SPEC_CFLAGS += $(call cc-nowarn,sign-compare)