diff --git a/Makefile.extrawarn b/Makefile.extrawarn new file mode 100644 index 00000000..1f4bda94 --- /dev/null +++ b/Makefile.extrawarn @@ -0,0 +1,90 @@ +# From linux.git/scripts/Kbuild.include +# +# try-run +# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise) +# Exit code chooses option. "$$TMP" is can be used as temporary file and +# is automatically cleaned up. +try-run = $(shell set -e; \ + TMP="$(TMPOUT).$$$$.tmp"; \ + TMPO="$(TMPOUT).$$$$.o"; \ + if ($(1)) >/dev/null 2>&1; \ + then echo "$(2)"; \ + else echo "$(3)"; \ + fi; \ + rm -f "$$TMP" "$$TMPO") + + # cc-option + # Usage: cflags-y += $(call cc-option,-march=winchip-c6,-march=i586) + + cc-option = $(call try-run,\ + $(CC) $(CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",$(1),$(2)) + +# From linux.git/scripts/Makefile.extrawarn +# ========================================================================== +# +# make W=... settings +# +# W=1 - warnings that may be relevant and does not occur too often +# W=2 - warnings that occur quite often but may still be relevant +# W=3 - the more obscure warnings, can most likely be ignored +# +# $(call cc-option, -W...) handles gcc -W.. options which +# are not supported by all versions of the compiler +# ========================================================================== + +ifeq ("$(origin W)", "command line") + export BUILD_ENABLE_EXTRA_GCC_CHECKS := $(W) +endif + +ifdef BUILD_ENABLE_EXTRA_GCC_CHECKS +warning- := $(empty) + +warning-1 := -Wextra -Wunused -Wno-unused-parameter +warning-1 += -Wmissing-declarations +warning-1 += -Wmissing-format-attribute +warning-1 += $(call cc-option, -Wmissing-prototypes) +warning-1 += -Wold-style-definition +warning-1 += $(call cc-option, -Wmissing-include-dirs) +warning-1 += $(call cc-option, -Wunused-but-set-variable) +warning-1 += $(call cc-disable-warning, missing-field-initializers) + +warning-2 := -Waggregate-return +warning-2 += -Wcast-align +warning-2 += -Wdisabled-optimization +warning-2 += -Wnested-externs +warning-2 += -Wshadow +warning-2 += $(call cc-option, -Wlogical-op) +warning-2 += $(call cc-option, -Wmissing-field-initializers) + +warning-3 := -Wbad-function-cast +warning-3 += -Wcast-qual +warning-3 += -Wconversion +warning-3 += -Wpacked +warning-3 += -Wpadded +warning-3 += -Wpointer-arith +warning-3 += -Wredundant-decls +warning-3 += -Wswitch-default +warning-3 += $(call cc-option, -Wpacked-bitfield-compat) +warning-3 += $(call cc-option, -Wvla) + +warning := $(warning-$(findstring 1, $(BUILD_ENABLE_EXTRA_GCC_CHECKS))) +warning += $(warning-$(findstring 2, $(BUILD_ENABLE_EXTRA_GCC_CHECKS))) +warning += $(warning-$(findstring 3, $(BUILD_ENABLE_EXTRA_GCC_CHECKS))) + +ifeq ("$(strip $(warning))","") + $(error W=$(BUILD_ENABLE_EXTRA_GCC_CHECKS) is unknown) +endif + +EXTRAWARN_CFLAGS += $(warning) +else + +ifeq ($(COMPILER),clang) +EXTRAWARN_CFLAGS += $(call cc-disable-warning, initializer-overrides) +EXTRAWARN_CFLAGS += $(call cc-disable-warning, unused-value) +EXTRAWARN_CFLAGS += $(call cc-disable-warning, format) +EXTRAWARN_CFLAGS += $(call cc-disable-warning, unknown-warning-option) +EXTRAWARN_CFLAGS += $(call cc-disable-warning, sign-compare) +EXTRAWARN_CFLAGS += $(call cc-disable-warning, format-zero-length) +EXTRAWARN_CFLAGS += $(call cc-disable-warning, uninitialized) +endif +endif diff --git a/Makefile.in b/Makefile.in index 514a76f2..18ebc046 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,6 +1,8 @@ # Export all variables to sub-makes by default export +include Makefile.extrawarn + CC = @CC@ LN_S = @LN_S@ AR = @AR@ @@ -19,7 +21,7 @@ CFLAGS = @CFLAGS@ \ -DBTRFS_FLAT_INCLUDES \ -D_XOPEN_SOURCE=700 \ -fno-strict-aliasing \ - -fPIC $(EXTRA_CFLAGS) + -fPIC $(KBUILD_CFLAGS) $(EXTRA_CFLAGS) LDFLAGS = @LDFLAGS@ \ -rdynamic $(EXTRA_LDFLAGS)