mirror of
https://github.com/git-for-windows/git.git
synced 2026-02-03 18:59:59 -06:00
Checking the work tree status is quite slow on Windows, due to slow `lstat()` emulation (git calls `lstat()` once for each file in the index). Windows operating system APIs seem to be much better at scanning the status of entire directories than checking single files. Add an `lstat()` implementation that uses a cache for lstat data. Cache misses read the entire parent directory and add it to the cache. Subsequent `lstat()` calls for the same directory are served directly from the cache. Also implement `opendir()`/`readdir()`/`closedir()` so that they create and use directory listings in the cache. The cache doesn't track file system changes and doesn't plug into any modifying file APIs, so it has to be explicitly enabled for git functions that don't modify the working copy. Note: in an earlier version of this patch, the cache was always active and tracked file system changes via ReadDirectoryChangesW. However, this was much more complex and had negative impact on the performance of modifying git commands such as 'git checkout'. Signed-off-by: Karsten Blees <blees@dcon.de> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
776 lines
24 KiB
Plaintext
776 lines
24 KiB
Plaintext
# Platform specific Makefile tweaks based on uname detection
|
|
|
|
# Define NO_SAFESEH if you need MSVC/Visual Studio to ignore the lack of
|
|
# Microsoft's Safe Exception Handling in libraries (such as zlib).
|
|
# Typically required for VS2013+/32-bit compilation on Vista+ versions.
|
|
|
|
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
|
|
uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
|
|
uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
|
|
uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
|
|
uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not')
|
|
|
|
ifneq ($(findstring MINGW,$(uname_S)),)
|
|
uname_S := MINGW
|
|
endif
|
|
|
|
ifdef MSVC
|
|
# avoid the MingW and Cygwin configuration sections
|
|
uname_S := Windows
|
|
uname_O := Windows
|
|
|
|
# Generate and include makefile variables that point to the
|
|
# currently installed set of MSVC command line tools.
|
|
compat/vcbuild/MSVC-DEFS-GEN: compat/vcbuild/find_vs_env.bat
|
|
@"$<" | tr '\\' / >"$@"
|
|
include compat/vcbuild/MSVC-DEFS-GEN
|
|
|
|
# See if vcpkg and the vcpkg-build versions of the third-party
|
|
# libraries that we use are installed. We include the result
|
|
# to get $(vcpkg_*) variables defined for the Makefile.
|
|
ifeq (,$(SKIP_VCPKG))
|
|
compat/vcbuild/VCPKG-DEFS: compat/vcbuild/vcpkg_install.bat
|
|
@"$<"
|
|
include compat/vcbuild/VCPKG-DEFS
|
|
endif
|
|
endif
|
|
|
|
# We choose to avoid "if .. else if .. else .. endif endif"
|
|
# because maintaining the nesting to match is a pain. If
|
|
# we had "elif" things would have been much nicer...
|
|
|
|
ifeq ($(uname_S),OSF1)
|
|
# Need this for u_short definitions et al
|
|
BASIC_CFLAGS += -D_OSF_SOURCE
|
|
SOCKLEN_T = int
|
|
NO_STRTOULL = YesPlease
|
|
NO_NSEC = YesPlease
|
|
endif
|
|
ifeq ($(uname_S),Linux)
|
|
HAVE_ALLOCA_H = YesPlease
|
|
# override in config.mak if you have glibc >= 2.38
|
|
NO_STRLCPY = YesPlease
|
|
CSPRNG_METHOD = getrandom
|
|
HAVE_PATHS_H = YesPlease
|
|
LIBC_CONTAINS_LIBINTL = YesPlease
|
|
HAVE_DEV_TTY = YesPlease
|
|
HAVE_CLOCK_GETTIME = YesPlease
|
|
HAVE_CLOCK_MONOTONIC = YesPlease
|
|
HAVE_SYNC_FILE_RANGE = YesPlease
|
|
HAVE_GETDELIM = YesPlease
|
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
|
HAVE_SYSINFO = YesPlease
|
|
PROCFS_EXECUTABLE_PATH = /proc/self/exe
|
|
HAVE_PLATFORM_PROCINFO = YesPlease
|
|
COMPAT_OBJS += compat/linux/procinfo.o
|
|
# centos7/rhel7 provides gcc 4.8.5 and zlib 1.2.7.
|
|
ifneq ($(findstring .el7.,$(uname_R)),)
|
|
BASIC_CFLAGS += -std=c99
|
|
endif
|
|
LINK_FUZZ_PROGRAMS = YesPlease
|
|
endif
|
|
ifeq ($(uname_S),GNU/kFreeBSD)
|
|
HAVE_ALLOCA_H = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
HAVE_PATHS_H = YesPlease
|
|
DIR_HAS_BSD_GROUP_SEMANTICS = YesPlease
|
|
LIBC_CONTAINS_LIBINTL = YesPlease
|
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
|
endif
|
|
ifeq ($(uname_S),UnixWare)
|
|
CC = cc
|
|
NEEDS_SOCKET = YesPlease
|
|
NEEDS_NSL = YesPlease
|
|
NEEDS_SSL_WITH_CRYPTO = YesPlease
|
|
NEEDS_LIBICONV = YesPlease
|
|
SHELL_PATH = /usr/local/bin/bash
|
|
NO_IPV6 = YesPlease
|
|
NO_HSTRERROR = YesPlease
|
|
BASIC_CFLAGS += -Kthread
|
|
BASIC_CFLAGS += -I/usr/local/include
|
|
BASIC_LDFLAGS += -L/usr/local/lib
|
|
INSTALL = ginstall
|
|
TAR = gtar
|
|
NO_STRCASESTR = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
endif
|
|
ifeq ($(uname_S),SCO_SV)
|
|
ifeq ($(uname_R),3.2)
|
|
CFLAGS = -O2
|
|
endif
|
|
ifeq ($(uname_R),5)
|
|
CC = cc
|
|
BASIC_CFLAGS += -Kthread
|
|
endif
|
|
NEEDS_SOCKET = YesPlease
|
|
NEEDS_NSL = YesPlease
|
|
NEEDS_SSL_WITH_CRYPTO = YesPlease
|
|
NEEDS_LIBICONV = YesPlease
|
|
SHELL_PATH = /usr/bin/bash
|
|
NO_IPV6 = YesPlease
|
|
NO_HSTRERROR = YesPlease
|
|
BASIC_CFLAGS += -I/usr/local/include
|
|
BASIC_LDFLAGS += -L/usr/local/lib
|
|
NO_STRCASESTR = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
INSTALL = ginstall
|
|
TAR = gtar
|
|
endif
|
|
ifeq ($(uname_S),Darwin)
|
|
NEEDS_CRYPTO_WITH_SSL = YesPlease
|
|
NEEDS_SSL_WITH_CRYPTO = YesPlease
|
|
NEEDS_LIBICONV = YesPlease
|
|
# Note: $(uname_R) gives us the underlying Darwin version.
|
|
# - MacOS 10.0.* and MacOS 10.1.0 = Darwin 1.*
|
|
# - MacOS 10.x.* = Darwin (x+4).* for (1 <= x)
|
|
# i.e. "begins with [15678] and a dot" means "10.4.* or older".
|
|
DARWIN_MAJOR_VERSION = $(shell expr "$(uname_R)" : '\([0-9]*\)\.')
|
|
ifeq ($(shell expr "$(uname_R)" : '[15678]\.'),2)
|
|
OLD_ICONV = UnfortunatelyYes
|
|
NO_APPLE_COMMON_CRYPTO = YesPlease
|
|
endif
|
|
ifeq ($(shell expr "$(uname_R)" : '[15]\.'),2)
|
|
NO_STRLCPY = YesPlease
|
|
endif
|
|
ifeq ($(shell test "`expr "$(uname_R)" : '\([0-9][0-9]*\)\.'`" -ge 11 && echo 1),1)
|
|
HAVE_GETDELIM = YesPlease
|
|
endif
|
|
ifeq ($(shell test "`expr "$(uname_R)" : '\([0-9][0-9]*\)\.'`" -ge 20 && echo 1),1)
|
|
OPEN_RETURNS_EINTR = UnfortunatelyYes
|
|
endif
|
|
NO_MEMMEM = YesPlease
|
|
USE_ST_TIMESPEC = YesPlease
|
|
HAVE_DEV_TTY = YesPlease
|
|
COMPAT_OBJS += compat/precompose_utf8.o
|
|
BASIC_CFLAGS += -DPRECOMPOSE_UNICODE
|
|
BASIC_CFLAGS += -DPROTECT_HFS_DEFAULT=1
|
|
HAVE_BSD_SYSCTL = YesPlease
|
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
|
HAVE_NS_GET_EXECUTABLE_PATH = YesPlease
|
|
CSPRNG_METHOD = arc4random
|
|
USE_ENHANCED_BASIC_REGULAR_EXPRESSIONS = YesPlease
|
|
|
|
ifeq ($(uname_M),arm64)
|
|
HOMEBREW_PREFIX = /opt/homebrew
|
|
else
|
|
HOMEBREW_PREFIX = /usr/local
|
|
endif
|
|
ifeq ($(shell test "$(DARWIN_MAJOR_VERSION)" -ge 24 && echo 1),1)
|
|
USE_HOMEBREW_LIBICONV = UnfortunatelyYes
|
|
NEEDS_GOOD_LIBICONV = UnfortunatelyYes
|
|
endif
|
|
|
|
# The builtin FSMonitor on MacOS builds upon Simple-IPC. Both require
|
|
# Unix domain sockets and PThreads.
|
|
ifndef NO_PTHREADS
|
|
ifndef NO_UNIX_SOCKETS
|
|
FSMONITOR_DAEMON_BACKEND = darwin
|
|
FSMONITOR_OS_SETTINGS = darwin
|
|
endif
|
|
endif
|
|
|
|
BASIC_LDFLAGS += -framework CoreServices
|
|
endif
|
|
ifeq ($(uname_S),SunOS)
|
|
NEEDS_SOCKET = YesPlease
|
|
NEEDS_NSL = YesPlease
|
|
SHELL_PATH = /bin/bash
|
|
SANE_TOOL_PATH = /usr/xpg6/bin:/usr/xpg4/bin
|
|
HAVE_ALLOCA_H = YesPlease
|
|
NO_REGEX = YesPlease
|
|
NO_MSGFMT_EXTENDED_OPTIONS = YesPlease
|
|
HAVE_DEV_TTY = YesPlease
|
|
ifeq ($(uname_R),5.6)
|
|
SOCKLEN_T = int
|
|
NO_HSTRERROR = YesPlease
|
|
NO_IPV6 = YesPlease
|
|
NO_SOCKADDR_STORAGE = YesPlease
|
|
NO_UNSETENV = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
NO_STRTOUMAX = YesPlease
|
|
GIT_TEST_CMP = cmp
|
|
endif
|
|
ifeq ($(uname_R),5.7)
|
|
NEEDS_RESOLV = YesPlease
|
|
NO_IPV6 = YesPlease
|
|
NO_SOCKADDR_STORAGE = YesPlease
|
|
NO_UNSETENV = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
NO_STRTOUMAX = YesPlease
|
|
GIT_TEST_CMP = cmp
|
|
endif
|
|
ifeq ($(uname_R),5.8)
|
|
NO_UNSETENV = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_STRTOUMAX = YesPlease
|
|
GIT_TEST_CMP = cmp
|
|
endif
|
|
ifeq ($(uname_R),5.9)
|
|
NO_UNSETENV = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_STRTOUMAX = YesPlease
|
|
GIT_TEST_CMP = cmp
|
|
endif
|
|
ifeq ($(uname_R),5.10)
|
|
NO_UNSETENV = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
GIT_TEST_CMP = cmp
|
|
endif
|
|
ifeq ($(uname_R),5.11)
|
|
NO_UNSETENV = YesPlease
|
|
NO_SETENV = YesPlease
|
|
GIT_TEST_CMP = cmp
|
|
endif
|
|
INSTALL = /usr/ucb/install
|
|
TAR = gtar
|
|
BASIC_CFLAGS += -D__EXTENSIONS__ -D__sun__
|
|
endif
|
|
ifeq ($(uname_O),Cygwin)
|
|
ifeq ($(shell expr "$(uname_R)" : '1\.[1-6]\.'),4)
|
|
NO_D_TYPE_IN_DIRENT = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_SYMLINK_HEAD = YesPlease
|
|
NO_IPV6 = YesPlease
|
|
OLD_ICONV = UnfortunatelyYes
|
|
# There are conflicting reports about this.
|
|
# On some boxes NO_MMAP is needed, and not so elsewhere.
|
|
# Try commenting this out if you suspect MMAP is more efficient
|
|
NO_MMAP = YesPlease
|
|
else
|
|
ifeq ($(shell expr "$(uname_R)" : '1\.7\.'),4)
|
|
NO_REGEX = UnfortunatelyYes
|
|
endif
|
|
endif
|
|
HAVE_DEV_TTY = YesPlease
|
|
HAVE_GETDELIM = YesPlease
|
|
HAVE_CLOCK_GETTIME = YesPlease
|
|
HAVE_CLOCK_MONOTONIC = YesPlease
|
|
HAVE_SYSINFO = YesPlease
|
|
CSPRNG_METHOD = arc4random
|
|
HAVE_ALLOCA_H = YesPlease
|
|
NEEDS_LIBICONV = YesPlease
|
|
NO_FAST_WORKING_DIRECTORY = UnfortunatelyYes
|
|
NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
|
|
X = .exe
|
|
UNRELIABLE_FSTAT = UnfortunatelyYes
|
|
OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
|
|
MMAP_PREVENTS_DELETE = UnfortunatelyYes
|
|
COMPAT_OBJS += compat/win32/path-utils.o
|
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
|
endif
|
|
ifeq ($(uname_S),FreeBSD)
|
|
NEEDS_LIBICONV = YesPlease
|
|
# Versions up to 10.1 require OLD_ICONV; 10.2 and beyond don't.
|
|
# A typical version string looks like "10.2-RELEASE".
|
|
ifeq ($(shell expr "$(uname_R)" : '[1-9]\.'),2)
|
|
OLD_ICONV = YesPlease
|
|
endif
|
|
ifeq ($(firstword $(subst -, ,$(uname_R))),10.0)
|
|
OLD_ICONV = YesPlease
|
|
endif
|
|
ifeq ($(firstword $(subst -, ,$(uname_R))),10.1)
|
|
OLD_ICONV = YesPlease
|
|
endif
|
|
ifeq ($(shell v=$(uname_R) && test $${v%%.*} -lt 12 && echo 1),1)
|
|
NO_MEMMEM = UnfortunatelyYes
|
|
endif
|
|
BASIC_CFLAGS += -I/usr/local/include
|
|
BASIC_LDFLAGS += -L/usr/local/lib
|
|
DIR_HAS_BSD_GROUP_SEMANTICS = YesPlease
|
|
USE_ST_TIMESPEC = YesPlease
|
|
PYTHON_PATH = /usr/local/bin/python
|
|
PERL_PATH = /usr/local/bin/perl
|
|
HAVE_PATHS_H = YesPlease
|
|
HAVE_BSD_SYSCTL = YesPlease
|
|
HAVE_BSD_KERN_PROC_SYSCTL = YesPlease
|
|
CSPRNG_METHOD = arc4random
|
|
PAGER_ENV = LESS=FRX LV=-c MORE=FRX
|
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
|
FILENO_IS_A_MACRO = UnfortunatelyYes
|
|
endif
|
|
ifeq ($(uname_S),OpenBSD)
|
|
DIR_HAS_BSD_GROUP_SEMANTICS = YesPlease
|
|
USE_ST_TIMESPEC = YesPlease
|
|
NEEDS_LIBICONV = YesPlease
|
|
BASIC_CFLAGS += -I/usr/local/include
|
|
BASIC_LDFLAGS += -L/usr/local/lib
|
|
HAVE_PATHS_H = YesPlease
|
|
HAVE_BSD_SYSCTL = YesPlease
|
|
CSPRNG_METHOD = arc4random
|
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
|
FILENO_IS_A_MACRO = UnfortunatelyYes
|
|
endif
|
|
ifeq ($(uname_S),MirBSD)
|
|
NO_STRCASESTR = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
USE_ST_TIMESPEC = YesPlease
|
|
NEEDS_LIBICONV = YesPlease
|
|
HAVE_PATHS_H = YesPlease
|
|
HAVE_BSD_SYSCTL = YesPlease
|
|
CSPRNG_METHOD = arc4random
|
|
endif
|
|
ifeq ($(uname_S),NetBSD)
|
|
ifeq ($(shell expr "$(uname_R)" : '[01]\.'),2)
|
|
NEEDS_LIBICONV = YesPlease
|
|
endif
|
|
BASIC_CFLAGS += -I/usr/pkg/include
|
|
BASIC_LDFLAGS += -L/usr/pkg/lib $(CC_LD_DYNPATH)/usr/pkg/lib
|
|
USE_ST_TIMESPEC = YesPlease
|
|
HAVE_PATHS_H = YesPlease
|
|
HAVE_BSD_SYSCTL = YesPlease
|
|
HAVE_BSD_KERN_PROC_SYSCTL = YesPlease
|
|
CSPRNG_METHOD = arc4random
|
|
PROCFS_EXECUTABLE_PATH = /proc/curproc/exe
|
|
endif
|
|
ifeq ($(uname_S),AIX)
|
|
DEFAULT_PAGER = more
|
|
NO_STRCASESTR = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
NO_NSEC = YesPlease
|
|
NO_REGEX = NeedsStartEnd
|
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
|
INTERNAL_QSORT = UnfortunatelyYes
|
|
NEEDS_LIBICONV = YesPlease
|
|
BASIC_CFLAGS += -D_LARGE_FILES
|
|
FILENO_IS_A_MACRO = UnfortunatelyYes
|
|
NEED_ACCESS_ROOT_HANDLER = UnfortunatelyYes
|
|
ifeq ($(shell expr "$(uname_V)" : '[1234]'),1)
|
|
NO_PTHREADS = YesPlease
|
|
else
|
|
PTHREAD_LIBS = -lpthread
|
|
endif
|
|
ifeq ($(shell expr "$(uname_V).$(uname_R)" : '5\.1'),3)
|
|
INLINE = ''
|
|
endif
|
|
GIT_TEST_CMP = cmp
|
|
endif
|
|
ifeq ($(uname_S),GNU)
|
|
# GNU/Hurd
|
|
HAVE_ALLOCA_H = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
HAVE_PATHS_H = YesPlease
|
|
LIBC_CONTAINS_LIBINTL = YesPlease
|
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
|
endif
|
|
ifeq ($(uname_S),IRIX)
|
|
NO_SETENV = YesPlease
|
|
NO_UNSETENV = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
# When compiled with the MIPSpro 7.4.4m compiler, and without pthreads
|
|
# (i.e. NO_PTHREADS is set), and _with_ MMAP (i.e. NO_MMAP is not set),
|
|
# git dies with a segmentation fault when trying to access the first
|
|
# entry of a reflog. The conservative choice is made to always set
|
|
# NO_MMAP. If you suspect that your compiler is not affected by this
|
|
# issue, comment out the NO_MMAP statement.
|
|
NO_MMAP = YesPlease
|
|
NO_REGEX = YesPlease
|
|
SNPRINTF_RETURNS_BOGUS = YesPlease
|
|
SHELL_PATH = /usr/gnu/bin/bash
|
|
NEEDS_LIBGEN = YesPlease
|
|
endif
|
|
ifeq ($(uname_S),IRIX64)
|
|
NO_SETENV = YesPlease
|
|
NO_UNSETENV = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
# When compiled with the MIPSpro 7.4.4m compiler, and without pthreads
|
|
# (i.e. NO_PTHREADS is set), and _with_ MMAP (i.e. NO_MMAP is not set),
|
|
# git dies with a segmentation fault when trying to access the first
|
|
# entry of a reflog. The conservative choice is made to always set
|
|
# NO_MMAP. If you suspect that your compiler is not affected by this
|
|
# issue, comment out the NO_MMAP statement.
|
|
NO_MMAP = YesPlease
|
|
NO_REGEX = YesPlease
|
|
SNPRINTF_RETURNS_BOGUS = YesPlease
|
|
SHELL_PATH = /usr/gnu/bin/bash
|
|
NEEDS_LIBGEN = YesPlease
|
|
endif
|
|
ifeq ($(uname_S),HP-UX)
|
|
INLINE = __inline
|
|
NO_IPV6 = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_UNSETENV = YesPlease
|
|
NO_HSTRERROR = YesPlease
|
|
NO_SYS_SELECT_H = YesPlease
|
|
SNPRINTF_RETURNS_BOGUS = YesPlease
|
|
NO_NSEC = YesPlease
|
|
ifeq ($(uname_R),B.11.00)
|
|
NO_INET_NTOP = YesPlease
|
|
NO_INET_PTON = YesPlease
|
|
endif
|
|
ifeq ($(uname_R),B.10.20)
|
|
# Override HP-UX 11.x setting:
|
|
INLINE =
|
|
SOCKLEN_T = size_t
|
|
NO_PREAD = YesPlease
|
|
NO_INET_NTOP = YesPlease
|
|
NO_INET_PTON = YesPlease
|
|
endif
|
|
GIT_TEST_CMP = cmp
|
|
endif
|
|
ifeq ($(uname_S),Windows)
|
|
GIT_VERSION := $(GIT_VERSION).MSVC
|
|
pathsep = ;
|
|
# Assume that this is built in Git for Windows' SDK
|
|
ifneq (,$(MSYSTEM))
|
|
prefix = $(MINGW_PREFIX)
|
|
endif
|
|
# Prepend MSVC 64-bit tool-chain to PATH.
|
|
#
|
|
# A regular Git Bash *does not* have cl.exe in its $PATH. As there is a
|
|
# link.exe next to, and required by, cl.exe, we have to prepend this
|
|
# onto the existing $PATH.
|
|
#
|
|
SANE_TOOL_PATH ?= $(msvc_bin_dir_msys):$(sdk_ver_bin_dir_msys)
|
|
HAVE_ALLOCA_H = YesPlease
|
|
NO_PREAD = YesPlease
|
|
NEEDS_CRYPTO_WITH_SSL = YesPlease
|
|
NO_LIBGEN_H = YesPlease
|
|
NO_POLL = YesPlease
|
|
NO_SYMLINK_HEAD = YesPlease
|
|
NO_IPV6 = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NEEDS_LIBICONV = YesPlease
|
|
NO_STRTOUMAX = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_INTTYPES_H = YesPlease
|
|
CSPRNG_METHOD = rtlgenrandom
|
|
# VS2015 with UCRT claims that snprintf and friends are C99 compliant,
|
|
# so we don't need this:
|
|
#
|
|
# SNPRINTF_RETURNS_BOGUS = YesPlease
|
|
|
|
# The builtin FSMonitor requires Named Pipes and Threads on Windows.
|
|
# These are always available, so we do not have to conditionally
|
|
# support it.
|
|
FSMONITOR_DAEMON_BACKEND = win32
|
|
FSMONITOR_OS_SETTINGS = win32
|
|
|
|
NO_SVN_TESTS = YesPlease
|
|
RUNTIME_PREFIX = YesPlease
|
|
HAVE_WPGMPTR = YesWeDo
|
|
NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
|
|
USE_WIN32_IPC = YesPlease
|
|
USE_WIN32_MMAP = YesPlease
|
|
MMAP_PREVENTS_DELETE = UnfortunatelyYes
|
|
# USE_NED_ALLOCATOR = YesPlease
|
|
UNRELIABLE_FSTAT = UnfortunatelyYes
|
|
OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
|
|
NO_REGEX = YesPlease
|
|
NO_GETTEXT = YesPlease
|
|
NO_PYTHON = YesPlease
|
|
ETAGS_TARGET = ETAGS
|
|
NO_POSIX_GOODIES = UnfortunatelyYes
|
|
NATIVE_CRLF = YesPlease
|
|
DEFAULT_HELP_FORMAT = html
|
|
SKIP_DASHED_BUILT_INS = YabbaDabbaDoo
|
|
ifneq (,$(MINGW_PREFIX))
|
|
# Move system config into top-level /etc/
|
|
ETC_GITCONFIG = ../etc/gitconfig
|
|
ETC_GITATTRIBUTES = ../etc/gitattributes
|
|
endif
|
|
|
|
CC = compat/vcbuild/scripts/clink.pl
|
|
AR = compat/vcbuild/scripts/lib.pl
|
|
CFLAGS =
|
|
BASIC_CFLAGS = -nologo -I. -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -MP -std:c11
|
|
COMPAT_OBJS = compat/msvc.o compat/winansi.o \
|
|
compat/win32/flush.o \
|
|
compat/win32/path-utils.o \
|
|
compat/win32/pthread.o compat/win32/syslog.o \
|
|
compat/win32/trace2_win32_process_info.o \
|
|
compat/win32/dirent.o compat/win32/fscache.o
|
|
COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DDETECT_MSYS_TTY \
|
|
-DENSURE_MSYSTEM_IS_SET="\"$(MSYSTEM)\"" -DMINGW_PREFIX="\"$(patsubst /%,%,$(MINGW_PREFIX))\"" \
|
|
-DNOGDI -DHAVE_STRING_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
|
|
BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO
|
|
# invalidcontinue.obj allows Git's source code to close the same file
|
|
# handle twice, or to access the osfhandle of an already-closed stdout
|
|
# See https://msdn.microsoft.com/en-us/library/ms235330.aspx
|
|
EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib invalidcontinue.obj kernel32.lib ntdll.lib
|
|
GITLIBS += git.res
|
|
PTHREAD_LIBS =
|
|
RC = compat/vcbuild/scripts/rc.pl
|
|
lib =
|
|
BASIC_CFLAGS += $(vcpkg_inc) $(sdk_includes) $(msvc_includes)
|
|
ifndef DEBUG
|
|
BASIC_CFLAGS += $(vcpkg_rel_lib)
|
|
else
|
|
BASIC_CFLAGS += $(vcpkg_dbg_lib)
|
|
endif
|
|
BASIC_CFLAGS += $(sdk_libs) $(msvc_libs)
|
|
|
|
ifneq ($(USE_MSVC_CRTDBG),)
|
|
# Optionally enable memory leak reporting.
|
|
BASIC_CFLAGS += -DUSE_MSVC_CRTDBG
|
|
endif
|
|
# Always give "-Zi" to the compiler and "-debug" to linker (even in
|
|
# release mode) to force a PDB to be generated (like RelWithDebInfo).
|
|
BASIC_CFLAGS += -Zi
|
|
BASIC_LDFLAGS += -debug -Zf
|
|
|
|
ifdef NO_SAFESEH
|
|
LDFLAGS += -SAFESEH:NO
|
|
endif
|
|
|
|
ifndef DEBUG
|
|
BASIC_CFLAGS += -GL -Gy -O2 -Oy- -MD -DNDEBUG
|
|
BASIC_LDFLAGS += -release -LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO /DEBUGTYPE:CV,FIXUP
|
|
AR += -LTCG
|
|
else
|
|
BASIC_CFLAGS += -MDd -DDEBUG -D_DEBUG
|
|
endif
|
|
X = .exe
|
|
|
|
EXTRA_PROGRAMS += headless-git$X
|
|
|
|
compat/msvc.o: compat/msvc.c compat/mingw.c GIT-CFLAGS
|
|
endif
|
|
ifeq ($(uname_S),Interix)
|
|
NO_INITGROUPS = YesPlease
|
|
NO_IPV6 = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_STRTOUMAX = YesPlease
|
|
NO_NSEC = YesPlease
|
|
ifeq ($(uname_R),3.5)
|
|
NO_INET_NTOP = YesPlease
|
|
NO_INET_PTON = YesPlease
|
|
NO_SOCKADDR_STORAGE = YesPlease
|
|
endif
|
|
ifeq ($(uname_R),5.2)
|
|
NO_INET_NTOP = YesPlease
|
|
NO_INET_PTON = YesPlease
|
|
NO_SOCKADDR_STORAGE = YesPlease
|
|
endif
|
|
endif
|
|
ifeq ($(uname_S),Minix)
|
|
NO_IPV6 = YesPlease
|
|
NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
|
|
NO_NSEC = YesPlease
|
|
NEEDS_LIBGEN =
|
|
NEEDS_CRYPTO_WITH_SSL = YesPlease
|
|
NEEDS_RESOLV =
|
|
NO_HSTRERROR = YesPlease
|
|
NO_MMAP = YesPlease
|
|
NO_CURL =
|
|
NO_EXPAT =
|
|
endif
|
|
ifeq ($(uname_S),NONSTOP_KERNEL)
|
|
# Needs some C99 features, "inline" is just one of them.
|
|
# INLINE='' would just replace one set of warnings with another and
|
|
# still not compile in c89 mode, due to non-const array initializations.
|
|
CC = cc -c99
|
|
# Build down-rev compatible objects that don't use our new getopt_long.
|
|
ifeq ($(uname_R).$(uname_V),J06.21)
|
|
CC += -WRVU=J06.20
|
|
endif
|
|
ifeq ($(uname_R).$(uname_V),L17.02)
|
|
CC += -WRVU=L16.05
|
|
endif
|
|
# Disable all optimization, seems to result in bad code, with -O or -O2
|
|
# or even -O1 (default), /usr/local/libexec/git-core/git-pack-objects
|
|
# abends on "git push". Needs more investigation.
|
|
CFLAGS = -g -O0 -Winline
|
|
# We'd want it to be here.
|
|
prefix = /usr/local
|
|
# perl and python must be in /usr/bin on NonStop - supplied by HPE
|
|
# with operating system in that managed directory.
|
|
PERL_PATH = /usr/bin/perl
|
|
PYTHON_PATH = /usr/bin/python
|
|
# The current /usr/coreutils/rm at lowest support level does not work
|
|
# with the git test structure. Long paths as in
|
|
# 'trash directory...' cause rm to terminate prematurely without fully
|
|
# removing the directory at OS releases J06.21 and L17.02.
|
|
# Default to the older rm until those two releases are deprecated.
|
|
RM = /bin/rm -f
|
|
NEEDS_CRYPTO_WITH_SSL = YesPlease
|
|
HAVE_DEV_TTY = YesPlease
|
|
HAVE_LIBCHARSET_H = YesPlease
|
|
HAVE_STRINGS_H = YesPlease
|
|
NEEDS_LIBICONV = YesPlease
|
|
NEEDS_LIBINTL_BEFORE_LIBICONV = YesPlease
|
|
NO_SYS_SELECT_H = UnfortunatelyYes
|
|
NO_D_TYPE_IN_DIRENT = YesPlease
|
|
NO_GETTEXT = YesPlease
|
|
NO_HSTRERROR = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_UNSETENV = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
# Currently libiconv-1.9.1.
|
|
OLD_ICONV = UnfortunatelyYes
|
|
NO_REGEX = NeedsStartEnd
|
|
NO_PTHREADS = UnfortunatelyYes
|
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
|
|
|
# Not detected (nor checked for) by './configure'.
|
|
# We don't have SA_RESTART on NonStop, unfortunalety.
|
|
COMPAT_CFLAGS += -DSA_RESTART=0
|
|
# Apparently needed in compat/fnmatch/fnmatch.c.
|
|
COMPAT_CFLAGS += -DHAVE_STRING_H=1
|
|
NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
|
|
NO_NSEC = YesPlease
|
|
NO_PREAD = YesPlease
|
|
NO_MMAP = YesPlease
|
|
NO_POLL = YesPlease
|
|
NO_INTPTR_T = UnfortunatelyYes
|
|
CSPRNG_METHOD = openssl
|
|
SANE_TOOL_PATH = /usr/coreutils/bin:/usr/local/bin
|
|
SHELL_PATH = /usr/coreutils/bin/bash
|
|
endif
|
|
ifeq ($(uname_S),OS/390)
|
|
NO_SYS_POLL_H = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_REGEX = YesPlease
|
|
NO_MMAP = YesPlease
|
|
NO_NSEC = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_GECOS_IN_PWENT = YesPlease
|
|
HAVE_STRINGS_H = YesPlease
|
|
NEEDS_MODE_TRANSLATION = YesPlease
|
|
HAVE_ZOS_GET_EXECUTABLE_PATH = YesPlease
|
|
endif
|
|
ifeq ($(uname_S),MINGW)
|
|
ifeq ($(shell expr "$(uname_R)" : '1\.'),2)
|
|
$(error "Building with MSys is no longer supported")
|
|
endif
|
|
pathsep = ;
|
|
HAVE_ALLOCA_H = YesPlease
|
|
NO_PREAD = YesPlease
|
|
NEEDS_CRYPTO_WITH_SSL = YesPlease
|
|
NO_LIBGEN_H = YesPlease
|
|
NO_POLL = YesPlease
|
|
NO_SYMLINK_HEAD = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NEEDS_LIBICONV = YesPlease
|
|
NO_STRTOUMAX = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_SVN_TESTS = YesPlease
|
|
|
|
# The builtin FSMonitor requires Named Pipes and Threads on Windows.
|
|
# These are always available, so we do not have to conditionally
|
|
# support it.
|
|
FSMONITOR_DAEMON_BACKEND = win32
|
|
FSMONITOR_OS_SETTINGS = win32
|
|
|
|
SKIP_DASHED_BUILT_INS = YabbaDabbaDoo
|
|
RUNTIME_PREFIX = YesPlease
|
|
HAVE_WPGMPTR = YesWeDo
|
|
NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
|
|
USE_WIN32_IPC = YesPlease
|
|
USE_WIN32_MMAP = YesPlease
|
|
MMAP_PREVENTS_DELETE = UnfortunatelyYes
|
|
UNRELIABLE_FSTAT = UnfortunatelyYes
|
|
OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
|
|
NO_REGEX = YesPlease
|
|
ETAGS_TARGET = ETAGS
|
|
NO_POSIX_GOODIES = UnfortunatelyYes
|
|
DEFAULT_HELP_FORMAT = html
|
|
HAVE_PLATFORM_PROCINFO = YesPlease
|
|
CSPRNG_METHOD = rtlgenrandom
|
|
BASIC_LDFLAGS += -municode -Wl,--tsaware
|
|
LAZYLOAD_LIBCURL = YesDoThatPlease
|
|
COMPAT_CFLAGS += -DNOGDI -Icompat -Icompat/win32
|
|
COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
|
|
COMPAT_OBJS += compat/mingw.o compat/winansi.o \
|
|
compat/win32/trace2_win32_process_info.o \
|
|
compat/win32/flush.o \
|
|
compat/win32/path-utils.o \
|
|
compat/win32/pthread.o compat/win32/syslog.o \
|
|
compat/win32/dirent.o compat/win32/fscache.o
|
|
BASIC_CFLAGS += -DWIN32
|
|
EXTLIBS += -lws2_32
|
|
GITLIBS += git.res
|
|
PTHREAD_LIBS =
|
|
RC = windres -O coff
|
|
NATIVE_CRLF = YesPlease
|
|
X = .exe
|
|
# MSys2
|
|
prefix = /usr/
|
|
# Enable DEP
|
|
BASIC_LDFLAGS += -Wl,--nxcompat
|
|
# Enable ASLR (unless debugging)
|
|
ifneq (,$(findstring -O,$(filter-out -O0 -Og,$(CFLAGS))))
|
|
BASIC_LDFLAGS += -Wl,--dynamicbase
|
|
endif
|
|
ifneq (,$(MSYSTEM))
|
|
ifeq ($(MINGW_PREFIX),$(filter-out /%,$(MINGW_PREFIX)))
|
|
# Override if empty or does not start with a slash
|
|
MINGW_PREFIX := /$(shell echo '$(MSYSTEM)' | tr A-Z a-z)
|
|
endif
|
|
prefix = $(MINGW_PREFIX)
|
|
HOST_CPU = $(patsubst %-w64-mingw32,%,$(MINGW_CHOST))
|
|
BASIC_LDFLAGS += -Wl,--pic-executable
|
|
COMPAT_CFLAGS += -DDETECT_MSYS_TTY \
|
|
-DENSURE_MSYSTEM_IS_SET="\"$(MSYSTEM)\"" \
|
|
-DMINGW_PREFIX="\"$(patsubst /%,%,$(MINGW_PREFIX))\""
|
|
ifeq (MINGW32,$(MSYSTEM))
|
|
BASIC_LDFLAGS += -Wl,--large-address-aware
|
|
endif
|
|
# Move system config into top-level /etc/
|
|
ETC_GITCONFIG = ../etc/gitconfig
|
|
ETC_GITATTRIBUTES = ../etc/gitattributes
|
|
endif
|
|
COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 -fstack-protector-strong
|
|
EXTLIBS += -lntdll
|
|
EXTRA_PROGRAMS += headless-git$X
|
|
INSTALL = /bin/install
|
|
INTERNAL_QSORT = YesPlease
|
|
HAVE_LIBCHARSET_H = YesPlease
|
|
USE_GETTEXT_SCHEME = fallthrough
|
|
USE_LIBPCRE = YesPlease
|
|
USE_MIMALLOC = YesPlease
|
|
NO_PYTHON =
|
|
endif
|
|
ifeq ($(uname_S),QNX)
|
|
COMPAT_CFLAGS += -DSA_RESTART=0
|
|
EXPAT_NEEDS_XMLPARSE_H = YesPlease
|
|
HAVE_STRINGS_H = YesPlease
|
|
NEEDS_SOCKET = YesPlease
|
|
NO_GETPAGESIZE = YesPlease
|
|
NO_ICONV = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_MKDTEMP = YesPlease
|
|
NO_NSEC = YesPlease
|
|
NO_PTHREADS = YesPlease
|
|
NO_STRCASESTR = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
endif
|