mirror of
https://github.com/git-for-windows/git.git
synced 2026-03-25 10:36:03 -05: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. 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>
103 lines
3.4 KiB
Plaintext
103 lines
3.4 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))),)
|
|
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 += -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
|
|
DEVELOPER_CFLAGS += -Wno-sign-compare
|
|
DEVELOPER_CFLAGS += -Wno-unused-parameter
|
|
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 initializaing 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
|