Merge branch 'en/merge-options-ff-and-friends'
[gitweb.git] / config.mak.uname
index b71688eeb73f10da004f3d16e3de9afd13eb9c7e..db7f06b95fda4ea8de9f409e11f594c163220463 100644 (file)
@@ -1,5 +1,9 @@
 # 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')
@@ -11,6 +15,21 @@ 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"
@@ -356,6 +375,19 @@ 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
@@ -368,11 +400,14 @@ ifeq ($(uname_S),Windows)
        NO_STRCASESTR = YesPlease
        NO_STRLCPY = YesPlease
        NO_MEMMEM = YesPlease
-       # NEEDS_LIBICONV = YesPlease
-       NO_ICONV = YesPlease
+       NEEDS_LIBICONV = YesPlease
        NO_STRTOUMAX = YesPlease
        NO_MKDTEMP = YesPlease
-       SNPRINTF_RETURNS_BOGUS = YesPlease
+       NO_INTTYPES_H = YesPlease
+       # 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
@@ -385,7 +420,6 @@ ifeq ($(uname_S),Windows)
        NO_REGEX = YesPlease
        NO_GETTEXT = YesPlease
        NO_PYTHON = YesPlease
-       BLK_SHA1 = YesPlease
        ETAGS_TARGET = ETAGS
        NO_POSIX_GOODIES = UnfortunatelyYes
        NATIVE_CRLF = YesPlease
@@ -394,26 +428,52 @@ ifeq ($(uname_S),Windows)
        CC = compat/vcbuild/scripts/clink.pl
        AR = compat/vcbuild/scripts/lib.pl
        CFLAGS =
-       BASIC_CFLAGS = -nologo -I. -I../zlib -Icompat/vcbuild -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE
+       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 -DNOGDI -DHAVE_STRING_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
-       BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE
-       EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib invalidcontinue.obj
+       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
        BASIC_CFLAGS += -DPROTECT_NTFS_DEFAULT=1
+       # 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 -Os -MD
-       BASIC_LDFLAGS += -LTCG
+       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 += -Zi -MDd
+       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
@@ -548,6 +608,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
        ETAGS_TARGET = ETAGS
        NO_POSIX_GOODIES = UnfortunatelyYes
        DEFAULT_HELP_FORMAT = html
+       BASIC_LDFLAGS += -municode
        COMPAT_CFLAGS += -DNOGDI -Icompat -Icompat/win32
        COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
        COMPAT_OBJS += compat/mingw.o compat/winansi.o \
@@ -571,7 +632,7 @@ ifneq (,$(wildcard ../THIS_IS_MSYSGIT))
        INTERNAL_QSORT = YesPlease
        HAVE_LIBCHARSET_H = YesPlease
        NO_GETTEXT = YesPlease
-       COMPAT_CLFAGS += -D__USE_MINGW_ACCESS
+       COMPAT_CFLAGS += -D__USE_MINGW_ACCESS
 else
        ifneq ($(shell expr "$(uname_R)" : '1\.'),2)
                # MSys2
@@ -596,7 +657,8 @@ else
                        BASIC_LDFLAGS += -Wl,--large-address-aware
                endif
                CC = gcc
-               COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 -DDETECT_MSYS_TTY
+               COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 -DDETECT_MSYS_TTY \
+                       -fstack-protector-strong
                EXTLIBS += -lntdll
                INSTALL = /bin/install
                NO_R_TO_GCC_LINKER = YesPlease
@@ -629,3 +691,77 @@ ifeq ($(uname_S),QNX)
        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 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 && \
+        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/LinkOrCopyBuiltins.targets
+       git add -f git/LinkOrCopyBuiltins.targets
+
+       # Add command-list.h
+       $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 command-list.h
+       git add -f command-list.h
+
+       # Add scripts
+       rm -f perl/perl.mak
+       $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 \
+               $(SCRIPT_LIB) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN)
+       # 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) $(SCRIPT_SH_GEN) $(SCRIPT_PERL_GEN)
+
+       # 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 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) $@\`"