| ifndef COMPILER_FEATURES | |
| COMPILER_FEATURES := $(shell ./tools/detect-compiler $(CC)) | |
| endif | |
| ifeq ($(filter no-error,$(DEVOPTS)),) | |
| DEVELOPER_CFLAGS += -Werror | |
| SPARSE_FLAGS += -Wsparse-error | |
| endif | |
| DEVELOPER_CFLAGS += -Wall | |
| ifeq ($(filter no-pedantic,$(DEVOPTS)),) | |
| DEVELOPER_CFLAGS += -pedantic | |
| ifneq ($(or $(filter gcc5,$(COMPILER_FEATURES)),$(filter clang4,$(COMPILER_FEATURES))),) | |
| DEVELOPER_CFLAGS += -Wpedantic | |
| ifneq ($(filter gcc10,$(COMPILER_FEATURES)),) | |
| ifeq ($(uname_S),MINGW) | |
| DEVELOPER_CFLAGS += -Wno-pedantic-ms-format | |
| endif | |
| endif | |
| endif | |
| endif | |
| ifneq ($(uname_S),FreeBSD) | |
| ifneq ($(or $(filter gcc6,$(COMPILER_FEATURES)),$(filter clang7,$(COMPILER_FEATURES))),) | |
| DEVELOPER_CFLAGS += -std=gnu99 | |
| endif | |
| else | |
| # FreeBSD cannot limit to C99 because its system headers unconditionally | |
| # rely on C11 features. | |
| endif | |
| DEVELOPER_CFLAGS += -Wdeclaration-after-statement | |
| DEVELOPER_CFLAGS += -Wformat-security | |
| DEVELOPER_CFLAGS += -Wold-style-definition | |
| DEVELOPER_CFLAGS += -Woverflow | |
| DEVELOPER_CFLAGS += -Wpointer-arith | |
| DEVELOPER_CFLAGS += -Wstrict-prototypes | |
| DEVELOPER_CFLAGS += -Wunused | |
| DEVELOPER_CFLAGS += -Wvla | |
| DEVELOPER_CFLAGS += -Wwrite-strings | |
| DEVELOPER_CFLAGS += -fno-common | |
| DEVELOPER_CFLAGS += -Wunreachable-code | |
| ifneq ($(filter clang9,$(COMPILER_FEATURES)),) | |
| DEVELOPER_CFLAGS += -Wcomma | |
| endif | |
| ifneq ($(filter clang4,$(COMPILER_FEATURES)),) | |
| DEVELOPER_CFLAGS += -Wtautological-constant-out-of-range-compare | |
| endif | |
| ifneq ($(or $(filter gcc6,$(COMPILER_FEATURES)),$(filter clang4,$(COMPILER_FEATURES))),) | |
| DEVELOPER_CFLAGS += -Wextra | |
| # if a function is public, there should be a prototype and the right | |
| # header file should be included. If not, it should be static. | |
| DEVELOPER_CFLAGS += -Wmissing-prototypes | |
| ifeq ($(filter extra-all,$(DEVOPTS)),) | |
| # These are disabled because we have these all over the place. | |
| DEVELOPER_CFLAGS += -Wno-empty-body | |
| DEVELOPER_CFLAGS += -Wno-missing-field-initializers | |
| endif | |
| endif | |
| # uninitialized warnings on gcc 4.9.2 in xdiff/xdiffi.c and config.c | |
| # not worth fixing since newer compilers correctly stop complaining | |
| # | |
| # Likewise, gcc older than 4.9 complains about initializing a | |
| # struct-within-a-struct using just "{ 0 }" | |
| ifneq ($(filter gcc4,$(COMPILER_FEATURES)),) | |
| ifeq ($(filter gcc5,$(COMPILER_FEATURES)),) | |
| DEVELOPER_CFLAGS += -Wno-uninitialized | |
| DEVELOPER_CFLAGS += -Wno-missing-braces | |
| endif | |
| endif | |
| # Old versions of clang complain about initializing a | |
| # struct-within-a-struct using just "{0}" rather than "{{0}}". This | |
| # error is considered a false-positive and not worth fixing, because | |
| # new clang versions do not, so just disable it. | |
| # | |
| # The "bug" was fixed in upstream clang 9. | |
| # | |
| # Complicating this is that versions of clang released by Apple have | |
| # their own version numbers (associated with the corresponding version | |
| # of XCode) unrelated to the official clang version numbers. | |
| # | |
| # The bug was fixed in Apple clang 12. | |
| # | |
| ifneq ($(filter clang1,$(COMPILER_FEATURES)),) # if we are using clang | |
| ifeq ($(uname_S),Darwin) # if we are on darwin | |
| ifeq ($(filter clang12,$(COMPILER_FEATURES)),) # if version < 12 | |
| DEVELOPER_CFLAGS += -Wno-missing-braces | |
| endif | |
| else # not darwin | |
| ifeq ($(filter clang9,$(COMPILER_FEATURES)),) # if version < 9 | |
| DEVELOPER_CFLAGS += -Wno-missing-braces | |
| endif | |
| endif | |
| endif | |
| # glibc 2.43 headers unconditionally use _Generic even when we ask the | |
| # compiler to stick to -std=gnu99 and unlike GCC, clang lacks a | |
| # workaround to squelch warnings from system headers. | |
| ifneq ($(filter clang1,$(COMPILER_FEATURES)),) # if we are using clang | |
| DEVELOPER_CFLAGS += -Wno-c11-extensions | |
| endif | |
| # https://bugzilla.redhat.com/show_bug.cgi?id=2075786 | |
| ifneq ($(filter gcc12,$(COMPILER_FEATURES)),) | |
| DEVELOPER_CFLAGS += -Wno-error=stringop-overread | |
| endif | |
| GIT_TEST_PERL_FATAL_WARNINGS = YesPlease |