mirror of
https://github.com/git-for-windows/git.git
synced 2026-02-04 03:33:01 -06:00
Add full mingw-w64-git (i.e. regular MSYS2 ecosystem) support (#5971)
Every once in a while, there are bug reports in Git for Windows' bug tracker that describe an issue running [inside MSYS2 proper](https://gitforwindows.org/install-inside-msys2-proper), totally ignoring the big, honking warning on top of [the page](https://gitforwindows.org/install-inside-msys2-proper) that spells out clearly that this is an unsupported use case. At the same time, we cannot easily deflect and say "just use MSYS2 directly" (and leave the "and stop pestering us" out). We cannot do that because there is only an _MSYS_ `git` package in MSYS2 (i.e. a Git that uses the quite slow POSIX emulation layer provided by the MSYS2 runtime), but no `mingw-w64-git` package (which would be equivalent in speed to Git for Windows). In https://github.com/msys2/MINGW-packages/pull/26470, I am preparing to change that. As part of that PR, I noticed and fixed a couple of issues _in `git-for-windows/git` that prevented full support for `mingw-w64-git` in MSYS2, such as problems with CLANG64 and UCRT64. While at it, I simplified the entire setup to trust MSYS2's `MINGW_PREFIX` & related environment variables instead of hard-coding values like the installation prefix and what `MSYSTEM` to fall back on if it is unset.
This commit is contained in:
commit
9987a4d6a5
@ -438,14 +438,8 @@ 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
|
||||
ifeq (CLANGARM64,$(MSYSTEM))
|
||||
prefix = /clangarm64
|
||||
else
|
||||
prefix = /mingw64
|
||||
endif
|
||||
ifneq (,$(MSYSTEM))
|
||||
prefix = $(MINGW_PREFIX)
|
||||
endif
|
||||
# Prepend MSVC 64-bit tool-chain to PATH.
|
||||
#
|
||||
@ -499,7 +493,7 @@ ifeq ($(uname_S),Windows)
|
||||
NATIVE_CRLF = YesPlease
|
||||
DEFAULT_HELP_FORMAT = html
|
||||
SKIP_DASHED_BUILT_INS = YabbaDabbaDoo
|
||||
ifeq (/mingw64,$(subst 32,64,$(subst clangarm,mingw,$(prefix))))
|
||||
ifneq (,$(MINGW_PREFIX))
|
||||
# Move system config into top-level /etc/
|
||||
ETC_GITCONFIG = ../etc/gitconfig
|
||||
ETC_GITATTRIBUTES = ../etc/gitattributes
|
||||
@ -730,26 +724,23 @@ ifeq ($(uname_S),MINGW)
|
||||
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
|
||||
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
|
||||
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
|
||||
ifeq (MINGW64,$(MSYSTEM))
|
||||
prefix = /mingw64
|
||||
HOST_CPU = x86_64
|
||||
BASIC_LDFLAGS += -Wl,--pic-executable,-e,mainCRTStartup
|
||||
else ifeq (CLANGARM64,$(MSYSTEM))
|
||||
prefix = /clangarm64
|
||||
HOST_CPU = aarch64
|
||||
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
|
||||
COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 -fstack-protector-strong
|
||||
EXTLIBS += -lntdll
|
||||
EXTRA_PROGRAMS += headless-git$X
|
||||
INSTALL = /bin/install
|
||||
@ -759,11 +750,6 @@ ifeq ($(uname_S),MINGW)
|
||||
USE_LIBPCRE = YesPlease
|
||||
USE_MIMALLOC = YesPlease
|
||||
NO_PYTHON =
|
||||
ifeq (/mingw64,$(subst 32,64,$(subst clangarm,mingw,$(prefix))))
|
||||
# Move system config into top-level /etc/
|
||||
ETC_GITCONFIG = ../etc/gitconfig
|
||||
ETC_GITATTRIBUTES = ../etc/gitattributes
|
||||
endif
|
||||
endif
|
||||
ifeq ($(uname_S),QNX)
|
||||
COMPAT_CFLAGS += -DSA_RESTART=0
|
||||
|
||||
@ -281,7 +281,14 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
_CONSOLE DETECT_MSYS_TTY STRIP_EXTENSION=".exe" NO_SYMLINK_HEAD UNRELIABLE_FSTAT
|
||||
NOGDI OBJECT_CREATION_MODE=1 __USE_MINGW_ANSI_STDIO=0
|
||||
USE_NED_ALLOCATOR OVERRIDE_STRDUP MMAP_PREVENTS_DELETE USE_WIN32_MMAP
|
||||
HAVE_WPGMPTR ENSURE_MSYSTEM_IS_SET HAVE_RTLGENRANDOM)
|
||||
HAVE_WPGMPTR HAVE_RTLGENRANDOM)
|
||||
if(CMAKE_GENERATOR_PLATFORM STREQUAL "x64")
|
||||
add_compile_definitions(ENSURE_MSYSTEM_IS_SET="MINGW64" MINGW_PREFIX="mingw64")
|
||||
elseif(CMAKE_GENERATOR_PLATFORM STREQUAL "arm64")
|
||||
add_compile_definitions(ENSURE_MSYSTEM_IS_SET="CLANGARM64" MINGW_PREFIX="clangarm64")
|
||||
elseif(CMAKE_GENERATOR_PLATFORM STREQUAL "x86")
|
||||
add_compile_definitions(ENSURE_MSYSTEM_IS_SET="MINGW32" MINGW_PREFIX="mingw32")
|
||||
endif()
|
||||
list(APPEND compat_SOURCES
|
||||
compat/mingw.c
|
||||
compat/winansi.c
|
||||
|
||||
@ -91,16 +91,22 @@ int max_allowed_tree_depth =
|
||||
* the stack overflow can occur.
|
||||
*/
|
||||
512;
|
||||
#elif defined(GIT_WINDOWS_NATIVE) && defined(__clang__) && defined(__aarch64__)
|
||||
#elif defined(GIT_WINDOWS_NATIVE) && defined(__clang__)
|
||||
/*
|
||||
* Similar to Visual C, it seems that on Windows/ARM64 the clang-based
|
||||
* builds have a smaller stack space available. When running out of
|
||||
* that stack space, a `STATUS_STACK_OVERFLOW` is produced. When the
|
||||
* Similar to Visual C, it seems that clang-based builds on Windows
|
||||
* have a smaller stack space available. When running out of that
|
||||
* stack space, a `STATUS_STACK_OVERFLOW` is produced. When the
|
||||
* Git command was run from an MSYS2 Bash, this unfortunately results
|
||||
* in an exit code 127. Let's prevent that by lowering the maximal
|
||||
* tree depth; This value seems to be low enough.
|
||||
* tree depth; Unfortunately, it seems that the exact limit differs
|
||||
* for aarch64 vs x86_64, and the difference is too large to simply
|
||||
* use a single limit.
|
||||
*/
|
||||
#if defined(__aarch64__)
|
||||
1280;
|
||||
#else
|
||||
1152;
|
||||
#endif
|
||||
#else
|
||||
2048;
|
||||
#endif
|
||||
|
||||
13
meson.build
13
meson.build
@ -1268,7 +1268,6 @@ elif host_machine.system() == 'windows'
|
||||
|
||||
libgit_c_args += [
|
||||
'-DDETECT_MSYS_TTY',
|
||||
'-DENSURE_MSYSTEM_IS_SET',
|
||||
'-DNATIVE_CRLF',
|
||||
'-DNOGDI',
|
||||
'-DNO_POSIX_GOODIES',
|
||||
@ -1278,6 +1277,18 @@ elif host_machine.system() == 'windows'
|
||||
'-D__USE_MINGW_ANSI_STDIO=0',
|
||||
]
|
||||
|
||||
msystem = get_option('msystem')
|
||||
if msystem != ''
|
||||
mingw_prefix = get_option('mingw_prefix')
|
||||
if mingw_prefix == ''
|
||||
mingw_prefix = '/' + msystem.to_lower()
|
||||
endif
|
||||
libgit_c_args += [
|
||||
'-DENSURE_MSYSTEM_IS_SET="' + msystem + '"',
|
||||
'-DMINGW_PREFIX="' + mingw_prefix + '"'
|
||||
]
|
||||
endif
|
||||
|
||||
libgit_dependencies += compiler.find_library('ntdll')
|
||||
libgit_include_directories += 'compat/win32'
|
||||
if compiler.get_id() == 'msvc'
|
||||
|
||||
@ -21,6 +21,10 @@ option('runtime_prefix', type: 'boolean', value: false,
|
||||
description: 'Resolve ancillary tooling and support files relative to the location of the runtime binary instead of hard-coding them into the binary.')
|
||||
option('sane_tool_path', type: 'array', value: [],
|
||||
description: 'An array of paths to pick up tools from in case the normal tools are broken or lacking.')
|
||||
option('msystem', type: 'string', value: '',
|
||||
description: 'Fall-back on Windows when MSYSTEM is not set.')
|
||||
option('mingw_prefix', type: 'string', value: '',
|
||||
description: 'Fall-back on Windows when MINGW_PREFIX is not set.')
|
||||
|
||||
# Build information compiled into Git and other parts like documentation.
|
||||
option('build_date', type: 'string', value: '',
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user