mirror of
https://github.com/git-for-windows/git.git
synced 2025-12-12 15:59:24 -06:00
By defining `USE_MIMALLOC`, Git can now be compiled with that nicely-fast and small allocator. Note that we have to disable a couple `DEVELOPER` options to build mimalloc's source code, as it makes heavy use of declarations after statements, among other things that disagree with Git's conventions. We even have to silence some GCC warnings in non-DEVELOPER mode. For example, the `-Wno-array-bounds` flag is needed because in `-O2` builds, trying to call `NtCurrentTeb()` (which `_mi_thread_id()` does on Windows) causes the bogus warning about a system header, likely related to https://sourceforge.net/p/mingw-w64/mailman/message/37674519/ and to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578: C:/git-sdk-64-minimal/mingw64/include/psdk_inc/intrin-impl.h:838:1: error: array subscript 0 is outside array bounds of 'long long unsigned int[0]' [-Werror=array-bounds] 838 | __buildreadseg(__readgsqword, unsigned __int64, "gs", "q") | ^~~~~~~~~~~~~~ Also: The `mimalloc` library uses C11-style atomics, therefore we must require that standard when compiling with GCC if we want to use `mimalloc` (instead of requiring "only" C99). This is what we do in the CMake definition already, therefore this commit does not need to touch `contrib/buildsystems/`. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
104 lines
3.3 KiB
Plaintext
104 lines
3.3 KiB
Plaintext
ifndef COMPILER_FEATURES
|
|
COMPILER_FEATURES := $(shell ./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))),)
|
|
ifndef USE_MIMALLOC
|
|
DEVELOPER_CFLAGS += -std=gnu99
|
|
endif
|
|
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
|
|
|
|
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
|
|
|
|
# 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
|