# 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)) # cc-disable-warning # Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) cc-disable-warning = $(call try-run, \ $(CC) -Werror $(CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) # 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-1 += $(call cc-disable-warning, format-truncation) warning-1 += $(call cc-disable-warning, sign-compare) 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-2 += $(call cc-option, -Wformat-truncation) 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-3 += $(call cc-option, -Wsign-compare) 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