
There are many situations in which having access to a cryptographically secure pseudorandom number generator (CSPRNG) is helpful. In the future, we'll encounter one of these when dealing with temporary files. To make this possible, let's add a function which reads from a system CSPRNG and returns some bytes. We know that all systems will have such an interface. A CSPRNG is required for a secure TLS or SSH implementation and a Git implementation which provided neither would be of little practical use. In addition, POSIX is set to standardize getentropy(2) in the next version, so in the (potentially distant) future we can rely on that. For systems which lack one of the other interfaces, we provide the ability to use OpenSSL's CSPRNG. OpenSSL is highly portable and functions on practically every known OS, and we know it will have access to some source of cryptographically secure randomness. We also provide support for the arc4random in libbsd for folks who would prefer to use that. Because this is a security sensitive interface, we take some precautions. We either succeed by filling the buffer completely as we requested, or we fail. We don't return partial data because the caller will almost never find that to be a useful behavior. Specify a makefile knob which users can use to specify one or more suitable CSPRNGs, and turn the multiple string options into a set of defines, since we cannot match on strings in the preprocessor. We allow multiple options to make the job of handling this in autoconf easier. The order of options is important here. On systems with arc4random, which is most of the BSDs, we use that, since, except on MirBSD and macOS, it uses ChaCha20, which is extremely fast, and sits entirely in userspace, avoiding a system call. We then prefer getrandom over getentropy, because the former has been available longer on Linux, and then OpenSSL. Finally, if none of those are available, we use /dev/urandom, because most Unix-like operating systems provide that API. We prefer options that don't involve device files when possible because those work in some restricted environments where device files may not be available. Set the configuration variables appropriately for Linux and the BSDs, including macOS, as well as Windows and NonStop. We specifically only consider versions which receive publicly available security support here. For the same reason, we don't specify getrandom(2) on Linux, because CentOS 7 doesn't support it in glibc (although its kernel does) and we don't want to resort to making syscalls. Finally, add a test helper to allow this to be tested by hand and in tests. We don't add any tests, since invoking the CSPRNG is not likely to produce interesting, reproducible results. Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
804 lines
25 KiB
Plaintext
804 lines
25 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_P := $(shell sh -c 'uname -p 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
|
|
NO_STRLCPY = YesPlease
|
|
HAVE_PATHS_H = YesPlease
|
|
LIBC_CONTAINS_LIBINTL = YesPlease
|
|
HAVE_DEV_TTY = YesPlease
|
|
HAVE_CLOCK_GETTIME = YesPlease
|
|
HAVE_CLOCK_MONOTONIC = YesPlease
|
|
# -lrt is needed for clock_gettime on glibc <= 2.16
|
|
NEEDS_LIBRT = YesPlease
|
|
HAVE_GETDELIM = YesPlease
|
|
FREAD_READS_DIRECTORIES = UnfortunatelyYes
|
|
BASIC_CFLAGS += -DHAVE_SYSINFO
|
|
PROCFS_EXECUTABLE_PATH = /proc/self/exe
|
|
HAVE_PLATFORM_PROCINFO = YesPlease
|
|
COMPAT_OBJS += compat/linux/procinfo.o
|
|
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".
|
|
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
|
|
|
|
# Workaround for `gettext` being keg-only and not even being linked via
|
|
# `brew link --force gettext`, should be obsolete as of
|
|
# https://github.com/Homebrew/homebrew-core/pull/53489
|
|
ifeq ($(shell test -d /usr/local/opt/gettext/ && echo y),y)
|
|
BASIC_CFLAGS += -I/usr/local/include -I/usr/local/opt/gettext/include
|
|
BASIC_LDFLAGS += -L/usr/local/lib -L/usr/local/opt/gettext/lib
|
|
ifeq ($(shell test -x /usr/local/opt/gettext/bin/msgfmt && echo y),y)
|
|
MSGFMT = /usr/local/opt/gettext/bin/msgfmt
|
|
endif
|
|
endif
|
|
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_STRCASESTR = YesPlease
|
|
NO_MEMMEM = YesPlease
|
|
NO_MKDTEMP = 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_SETENV = 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_SETENV = YesPlease
|
|
NO_STRLCPY = YesPlease
|
|
NO_STRTOUMAX = YesPlease
|
|
GIT_TEST_CMP = cmp
|
|
endif
|
|
ifeq ($(uname_R),5.8)
|
|
NO_UNSETENV = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_STRTOUMAX = YesPlease
|
|
GIT_TEST_CMP = cmp
|
|
endif
|
|
ifeq ($(uname_R),5.9)
|
|
NO_UNSETENV = YesPlease
|
|
NO_SETENV = YesPlease
|
|
NO_STRTOUMAX = 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
|
|
NO_REGEX = UnfortunatelyYes
|
|
endif
|
|
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
|
|
NO_MEMMEM = YesPlease
|
|
BASIC_CFLAGS += -I/usr/local/include
|
|
BASIC_LDFLAGS += -L/usr/local/lib
|
|
DIR_HAS_BSD_GROUP_SEMANTICS = YesPlease
|
|
USE_ST_TIMESPEC = YesPlease
|
|
ifeq ($(shell expr "$(uname_R)" : '4\.'),2)
|
|
PTHREAD_LIBS = -pthread
|
|
NO_UINTMAX_T = YesPlease
|
|
NO_STRTOUMAX = YesPlease
|
|
endif
|
|
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)
|
|
# Versions < 7.0 need compatibility layer
|
|
ifeq ($(shell expr "$(uname_R)" : "[1-6]\."),2)
|
|
NO_UNCOMPRESS2 = UnfortunatelyYes
|
|
endif
|
|
NO_STRCASESTR = YesPlease
|
|
NO_MEMMEM = 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
|
|
HAVE_BSD_KERN_PROC_SYSCTL = YesPlease
|
|
CSPRNG_METHOD = arc4random
|
|
PROCFS_EXECUTABLE_PATH = /proc/curproc/file
|
|
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
|
|
ifeq (MINGW32,$(MSYSTEM))
|
|
prefix = /mingw32
|
|
else
|
|
prefix = /mingw64
|
|
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)
|
|
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_UNIX_SOCKETS = 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
|
|
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
|
|
ifeq (/mingw64,$(subst 32,64,$(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
|
|
COMPAT_OBJS = compat/msvc.o compat/winansi.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_CFLAGS = -D__USE_MINGW_ACCESS -DDETECT_MSYS_TTY -DNOGDI -DHAVE_STRING_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
|
|
BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -ENTRY:wmainCRTStartup -SUBSYSTEM:CONSOLE
|
|
# 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
|
|
PTHREAD_LIBS =
|
|
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
|
|
|
|
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_UNCOMPRESS2 = YesPlease
|
|
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),MINGW)
|
|
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_UNIX_SOCKETS = 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
|
|
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_PYTHON = YesPlease
|
|
ETAGS_TARGET = ETAGS
|
|
NO_POSIX_GOODIES = UnfortunatelyYes
|
|
DEFAULT_HELP_FORMAT = html
|
|
HAVE_PLATFORM_PROCINFO = YesPlease
|
|
CSPRNG_METHOD = rtlgenrandom
|
|
BASIC_LDFLAGS += -municode
|
|
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/path-utils.o \
|
|
compat/win32/pthread.o compat/win32/syslog.o \
|
|
compat/win32/dirent.o
|
|
BASIC_CFLAGS += -DWIN32
|
|
EXTLIBS += -lws2_32
|
|
GITLIBS += git.res
|
|
PTHREAD_LIBS =
|
|
RC = windres -O coff
|
|
NATIVE_CRLF = YesPlease
|
|
X = .exe
|
|
ifneq (,$(wildcard ../THIS_IS_MSYSGIT))
|
|
htmldir = doc/git/html/
|
|
prefix =
|
|
INSTALL = /bin/install
|
|
EXTLIBS += /mingw/lib/libz.a
|
|
INTERNAL_QSORT = YesPlease
|
|
HAVE_LIBCHARSET_H = YesPlease
|
|
NO_GETTEXT = YesPlease
|
|
COMPAT_CFLAGS += -D__USE_MINGW_ACCESS
|
|
else
|
|
ifneq ($(shell expr "$(uname_R)" : '1\.'),2)
|
|
# 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
|
|
ifeq (MINGW32,$(MSYSTEM))
|
|
prefix = /mingw32
|
|
HOST_CPU = i686
|
|
BASIC_LDFLAGS += -Wl,--pic-executable,-e,_mainCRTStartup
|
|
endif
|
|
ifeq (MINGW64,$(MSYSTEM))
|
|
prefix = /mingw64
|
|
HOST_CPU = x86_64
|
|
BASIC_LDFLAGS += -Wl,--pic-executable,-e,mainCRTStartup
|
|
else
|
|
COMPAT_CFLAGS += -D_USE_32BIT_TIME_T
|
|
BASIC_LDFLAGS += -Wl,--large-address-aware
|
|
endif
|
|
CC = gcc
|
|
COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 -DDETECT_MSYS_TTY \
|
|
-fstack-protector-strong
|
|
EXTLIBS += -lntdll
|
|
INSTALL = /bin/install
|
|
INTERNAL_QSORT = YesPlease
|
|
HAVE_LIBCHARSET_H = YesPlease
|
|
NO_GETTEXT =
|
|
USE_GETTEXT_SCHEME = fallthrough
|
|
USE_LIBPCRE = YesPlease
|
|
NO_CURL =
|
|
USE_NED_ALLOCATOR = YesPlease
|
|
ifeq (/mingw64,$(subst 32,64,$(prefix)))
|
|
# Move system config into top-level /etc/
|
|
ETC_GITCONFIG = ../etc/gitconfig
|
|
ETC_GITATTRIBUTES = ../etc/gitattributes
|
|
endif
|
|
else
|
|
COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO
|
|
NO_CURL = YesPlease
|
|
endif
|
|
endif
|
|
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
|
|
|
|
vcxproj:
|
|
# Require clean work tree
|
|
git update-index -q --refresh && \
|
|
git diff-files --quiet && \
|
|
git diff-index --cached --quiet HEAD --
|
|
|
|
# Make .vcxproj files and add them
|
|
unset QUIET_GEN QUIET_BUILT_IN; \
|
|
perl contrib/buildsystems/generate -g Vcxproj
|
|
git add -f git.sln {*,*/lib,t/helper/*}/*.vcxproj
|
|
|
|
# Generate the LinkOrCopyBuiltins.targets and LinkOrCopyRemoteHttp.targets file
|
|
(echo '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">' && \
|
|
echo ' <Target Name="CopyBuiltins_AfterBuild" AfterTargets="AfterBuild">' && \
|
|
for name in $(BUILT_INS);\
|
|
do \
|
|
echo ' <Copy SourceFiles="$$(OutDir)\git.exe" DestinationFiles="$$(OutDir)\'"$$name"'" SkipUnchangedFiles="true" UseHardlinksIfPossible="true" />'; \
|
|
done && \
|
|
echo ' </Target>' && \
|
|
echo '</Project>') >git/LinkOrCopyBuiltins.targets
|
|
(echo '<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">' && \
|
|
echo ' <Target Name="CopyBuiltins_AfterBuild" AfterTargets="AfterBuild">' && \
|
|
for name in $(REMOTE_CURL_ALIASES); \
|
|
do \
|
|
echo ' <Copy SourceFiles="$$(OutDir)\'"$(REMOTE_CURL_PRIMARY)"'" DestinationFiles="$$(OutDir)\'"$$name"'" SkipUnchangedFiles="true" UseHardlinksIfPossible="true" />'; \
|
|
done && \
|
|
echo ' </Target>' && \
|
|
echo '</Project>') >git-remote-http/LinkOrCopyRemoteHttp.targets
|
|
git add -f git/LinkOrCopyBuiltins.targets git-remote-http/LinkOrCopyRemoteHttp.targets
|
|
|
|
# Add generated headers
|
|
$(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(GENERATED_H)
|
|
git add -f $(GENERATED_H)
|
|
|
|
# Add scripts
|
|
rm -f perl/perl.mak
|
|
$(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(SCRIPT_LIB) $(SCRIPTS)
|
|
# Strip out the sane tool path, needed only for building
|
|
sed -i '/^git_broken_path_fix ".*/d' git-sh-setup
|
|
git add -f $(SCRIPT_LIB) $(SCRIPTS)
|
|
|
|
# Add Perl module
|
|
$(MAKE) $(LIB_PERL_GEN)
|
|
git add -f perl/build
|
|
|
|
# Add bin-wrappers, for testing
|
|
rm -rf bin-wrappers/
|
|
$(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(test_bindir_programs)
|
|
# Ensure that the GIT_EXEC_PATH is a Unix-y one, and that the absolute
|
|
# path of the repository is not hard-coded (GIT_EXEC_PATH will be set
|
|
# by test-lib.sh according to the current setup)
|
|
sed -i -e 's/^\(GIT_EXEC_PATH\)=.*/test -n "$${\1##*:*}" ||\
|
|
\1="$$(cygpath -u "$$\1")"/' \
|
|
-e "s|'$$(pwd)|\"\$$GIT_EXEC_PATH\"'|g" bin-wrappers/*
|
|
# Ensure that test-* helpers find the .dll files copied to top-level
|
|
sed -i 's|^PATH=.*|&:"$$GIT_EXEC_PATH"|' bin-wrappers/test-*
|
|
# We do not want to force hard-linking builtins
|
|
sed -i 's|\(git\)-\([-a-z]*\)\.exe"|\1.exe" \2|g' \
|
|
bin-wrappers/git-{receive-pack,upload-archive}
|
|
git add -f $(test_bindir_programs)
|
|
# remote-ext is a builtin, but invoked as if it were external
|
|
sed 's|receive-pack|remote-ext|g' \
|
|
<bin-wrappers/git-receive-pack >bin-wrappers/git-remote-ext
|
|
git add -f bin-wrappers/git-remote-ext
|
|
|
|
# Add templates
|
|
$(MAKE) -C templates
|
|
git add -f templates/boilerplates.made templates/blt/
|
|
|
|
# Add the translated messages
|
|
make MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 $(MOFILES)
|
|
git add -f $(MOFILES)
|
|
|
|
# Add build options
|
|
$(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 GIT-BUILD-OPTIONS
|
|
git add -f GIT-BUILD-OPTIONS
|
|
|
|
# Commit the whole shebang
|
|
git commit -m "Generate Visual Studio solution" \
|
|
-m "Auto-generated by \`$(MAKE)$(MAKEFLAGS) $@\`"
|