diff --git a/.gitattributes b/.gitattributes
index 1bdc91e282c539..9fc30e5c76831e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -5,6 +5,7 @@
*.pl eof=lf diff=perl
*.pm eol=lf diff=perl
*.py eol=lf diff=python
+*.bat eol=crlf
/Documentation/git-*.txt eol=lf
/command-list.txt eol=lf
/GIT-VERSION-GEN eol=lf
diff --git a/.gitignore b/.gitignore
index 4e8e84ba5f441f..49a50889e141fe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
/GIT-BUILD-OPTIONS
/GIT-CFLAGS
/GIT-LDFLAGS
-/GIT-MSVC-GEN
/GIT-PREFIX
/GIT-PERL-DEFINES
/GIT-PERL-HEADER
diff --git a/.nuget/NuGet.config b/.nuget/NuGet.config
deleted file mode 100644
index 93e50042cb7699..00000000000000
--- a/.nuget/NuGet.config
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/Makefile b/Makefile
index e653f36eda859e..9f2b80f8e5d0c7 100644
--- a/Makefile
+++ b/Makefile
@@ -2587,9 +2587,6 @@ ifdef GIT_INTEROP_MAKE_OPTS
endif
ifdef TEST_GIT_INDEX_VERSION
@echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@+
-endif
-ifdef MSVC_DEPS
- @echo MSVC_DEPS=\''$(subst ','\'',$(subst ','\'',$(MSVC_DEPS)))'\' >>$@+
endif
@if cmp $@+ $@ >/dev/null 2>&1; then $(RM) $@+; else mv $@+ $@; fi
@@ -2731,8 +2728,6 @@ install: all
$(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
$(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)'
ifdef MSVC
- $(INSTALL) compat/vcbuild/GEN.DEPS/bin/*.dll '$(DESTDIR_SQ)$(bindir_SQ)'
- $(INSTALL) compat/vcbuild/GEN.DEPS/bin/*.pdb '$(DESTDIR_SQ)$(bindir_SQ)'
# We DO NOT install the individual foo.o.pdb files because they
# have already been rolled up into the exe's pdb file.
# We DO NOT have pdb files for the builtin commands (like git-status.exe)
@@ -2751,6 +2746,13 @@ ifdef MSVC
$(INSTALL) git-remote-testsvn.pdb '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
$(INSTALL) git-sh-i18n--envsubst.pdb '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
$(INSTALL) git-show-index.pdb '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
+ifndef DEBUG
+ $(INSTALL) $(vcpkg_rel_bin)/*.dll '$(DESTDIR_SQ)$(bindir_SQ)'
+ $(INSTALL) $(vcpkg_rel_bin)/*.pdb '$(DESTDIR_SQ)$(bindir_SQ)'
+else
+ $(INSTALL) $(vcpkg_dbg_bin)/*.dll '$(DESTDIR_SQ)$(bindir_SQ)'
+ $(INSTALL) $(vcpkg_dbg_bin)/*.pdb '$(DESTDIR_SQ)$(bindir_SQ)'
+endif
endif
$(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)'
@@ -2953,9 +2955,15 @@ endif
ifdef MSVC
$(RM) $(patsubst %.o,%.o.pdb,$(OBJECTS))
$(RM) $(patsubst %.exe,%.pdb,$(OTHER_PROGRAMS))
+ $(RM) $(patsubst %.exe,%.iobj,$(OTHER_PROGRAMS))
+ $(RM) $(patsubst %.exe,%.ipdb,$(OTHER_PROGRAMS))
$(RM) $(patsubst %.exe,%.pdb,$(PROGRAMS))
+ $(RM) $(patsubst %.exe,%.iobj,$(PROGRAMS))
+ $(RM) $(patsubst %.exe,%.ipdb,$(PROGRAMS))
$(RM) $(patsubst %.exe,%.pdb,$(TEST_PROGRAMS))
- $(RM) GIT-MSVC-GEN
+ $(RM) $(patsubst %.exe,%.iobj,$(TEST_PROGRAMS))
+ $(RM) $(patsubst %.exe,%.ipdb,$(TEST_PROGRAMS))
+ $(RM) compat/vcbuild/MSVC-DEFS-GEN
endif
.PHONY: all install profile-clean clean strip
diff --git a/compat/vcbuild/.gitignore b/compat/vcbuild/.gitignore
index e14691508ec6b5..8f8b794ef39f75 100644
--- a/compat/vcbuild/.gitignore
+++ b/compat/vcbuild/.gitignore
@@ -1 +1,3 @@
-GEN.*
+/vcpkg/
+/MSVC-DEFS-GEN
+/VCPKG-DEFS
diff --git a/compat/vcbuild/Makefile b/compat/vcbuild/Makefile
deleted file mode 100644
index 255dd4308435af..00000000000000
--- a/compat/vcbuild/Makefile
+++ /dev/null
@@ -1,147 +0,0 @@
-## Makefile to install nuget package dependencies.
-##################################################################
-
-INST=GEN.DEPS
-INST_INC=$(INST)/include
-INST_LIB=$(INST)/lib
-INST_BIN=$(INST)/bin
-
-PKGDIR=GEN.PKGS
-NUGET ?= nuget.exe
-ifneq ($(shell $(NUGET) help 2>/dev/null; echo $$?),0)
- NUGET := /usr/src/build-extra/nuget/nuget.exe
-endif
-
-##################################################################
-all: unpack expat libssh libssh_redist curl curl_redist openssl zlib \
- libiconv libiconv_redist
-
-unpack:
- [ -d $(PKGDIR) ] || mkdir $(PKGDIR)
- "$(NUGET)" restore packages.config -ConfigFile nuget.config \
- -NonInteractive -OutputDirectory $(PKGDIR)
-
-insdir:
- [ -d $(INST) ] || mkdir $(INST)
- [ -d $(INST_INC) ] || mkdir $(INST_INC)
- [ -d $(INST_BIN) ] || mkdir $(INST_BIN)
- [ -d $(INST_LIB) ] || mkdir $(INST_LIB)
-
-##################################################################
-## We place the expat headers in their own subdirectory.
-## The custom is to reference , so compile with:
-## -I$(INST_INC)/expat
-
-EXPAT_VER=2.1.0.11
-EXPAT_ROOT=$(PKGDIR)/expat.$(EXPAT_VER)/build/native
-EXPAT_INC=$(EXPAT_ROOT)/include
-EXPAT_LIB=$(EXPAT_ROOT)/lib/v110/x64/Release/dynamic/utf8
-
-expat: insdir
- [ -d $(INST_INC)/expat ] || mkdir $(INST_INC)/expat
- cp -r $(EXPAT_INC)/* $(INST_INC)/expat/
- cp -r $(EXPAT_LIB)/* $(INST_LIB)/
-
-
-##################################################################
-
-LIBICONV_VER=1.14.0.11
-LIBICONV_ROOT=$(PKGDIR)/libiconv.$(LIBICONV_VER)/build/native
-LIBICONV_INC=$(LIBICONV_ROOT)/include
-LIBICONV_LIB=$(LIBICONV_ROOT)/lib/v110/x64/Release/dynamic/cdecl
-
-libiconv: insdir
- cp -r $(LIBICONV_INC)/* $(INST_INC)/
- cp -r $(LIBICONV_LIB)/libiconv.lib $(INST_LIB)/iconv.lib
-
-
-LIBICONV_REDIST_ROOT=$(PKGDIR)/libiconv.redist.$(LIBICONV_VER)/build/native
-LIBICONV_REDIST_BIN=$(LIBICONV_REDIST_ROOT)/bin/v110/x64/Release/dynamic/cdecl
-
-libiconv_redist: insdir
- cp -r $(LIBICONV_REDIST_BIN)/* $(INST_BIN)/
-
-
-##################################################################
-
-LIBSSH_VER=1.4.3.3
-LIBSSH_ROOT=$(PKGDIR)/libssh2.$(LIBSSH_VER)/build/native
-LIBSSH_INC=$(LIBSSH_ROOT)/include
-LIBSSH_LIB=$(LIBSSH_ROOT)/lib/v110/x64/Release/dynamic/cdecl
-
-libssh: insdir
- [ -d $(INST_INC)/libssh2 ] || mkdir $(INST_INC)/libssh2
- cp -r $(LIBSSH_INC)/* $(INST_INC)/libssh2
- cp -r $(LIBSSH_LIB)/* $(INST_LIB)/
-
-
-LIBSSH_REDIST_ROOT=$(PKGDIR)/libssh2.redist.$(LIBSSH_VER)/build/native
-LIBSSH_REDIST_BIN=$(LIBSSH_REDIST_ROOT)/bin/v110/x64/Release/dynamic/cdecl
-
-libssh_redist: insdir
- cp -r $(LIBSSH_REDIST_BIN)/* $(INST_BIN)/
-
-
-##################################################################
-## We place the curl headers in their own subdirectory.
-## The custom is to reference , so compile with:
-## -I$(INST_INC)
-
-CURL_VER=7.30.0.2
-CURL_ROOT=$(PKGDIR)/curl.$(CURL_VER)/build/native
-CURL_INC=$(CURL_ROOT)/include/curl
-CURL_LIB=$(CURL_ROOT)/lib/v110/x64/Release/dynamic
-
-curl: insdir
- [ -d $(INST_INC)/curl ] || mkdir $(INST_INC)/curl
- cp -r $(CURL_INC)/* $(INST_INC)/curl
- cp -r $(CURL_LIB)/* $(INST_LIB)/
-
-
-CURL_REDIST_ROOT=$(PKGDIR)/curl.redist.$(CURL_VER)/build/native
-CURL_REDIST_BIN=$(CURL_REDIST_ROOT)/bin/v110/x64/Release/dynamic
-
-curl_redist: insdir
- cp -r $(CURL_REDIST_BIN)/* $(INST_BIN)/
-
-
-##################################################################
-## We place the openssl headers in their own subdirectory.
-## The custom is to reference , so compile with:
-## -I$(INST_INC)
-
-OPENSSL_VER=1.0.2.1
-OPENSSL_ROOT=$(PKGDIR)/openssl.v140.windesktop.msvcstl.dyn.rt-dyn.x64.$(OPENSSL_VER)
-OPENSSL_INC=$(OPENSSL_ROOT)/build/native/include/openssl
-OPENSSL_LIB=$(OPENSSL_ROOT)/lib/native/v140/windesktop/msvcstl/dyn/rt-dyn/x64/release
-
-openssl: insdir
- [ -d $(INST_INC)/openssl ] || mkdir $(INST_INC)/openssl
- cp -r $(OPENSSL_INC)/* $(INST_INC)/openssl
- cp -r $(OPENSSL_LIB)/*.lib $(INST_LIB)/
- cp -r $(OPENSSL_LIB)/*.dll $(INST_BIN)/
- cp -r $(OPENSSL_LIB)/*.pdb $(INST_BIN)/
-
-##################################################################
-## We place the zlib headers in their own subdirectory.
-## The custom is to reference , so compile with:
-## -I$(INST_INC)/zlib
-
-ZLIB_VER=1.2.8.8
-ZLIB_ROOT=$(PKGDIR)/zlib.v140.windesktop.msvcstl.dyn.rt-dyn.$(ZLIB_VER)
-ZLIB_INC=$(ZLIB_ROOT)/build/native/include
-ZLIB_LIB=$(ZLIB_ROOT)/lib/native/v140/windesktop/msvcstl/dyn/rt-dyn/x64/RelWithDebInfo
-
-zlib: insdir
- [ -d $(INST_INC)/zlib ] || mkdir $(INST_INC)/zlib
- cp -r $(ZLIB_INC)/* $(INST_INC)/zlib
- cp -r $(ZLIB_LIB)/*.lib $(INST_LIB)/
- cp -r $(ZLIB_LIB)/*.dll $(INST_BIN)/
- cp -r $(ZLIB_LIB)/*.pdb $(INST_BIN)/
-
-##################################################################
-clean:
- rm -rf $(INST)
-
-clobber: clean
- rm -rf $(PKGDIR)
diff --git a/compat/vcbuild/README b/compat/vcbuild/README
index df8a6574c9ac24..b986460bb27206 100644
--- a/compat/vcbuild/README
+++ b/compat/vcbuild/README
@@ -1,3 +1,54 @@
+The Steps to Build Git with VS2015 or VS2017 from the command line.
+
+1. Install the "vcpkg" open source package manager and build essential
+ third-party libaries. The steps for this have been captured in a
+ set of convenience scripts. These can be run from a stock Command
+ Prompt or from an SDK bash window:
+
+ $ cd
+ $ ./compat/vcbuild/vcpkg_install.bat
+
+ The vcpkg tools and all of the third-party sources will be installed
+ in this folder:
+ /compat/vcbuild/vcpkg/
+
+ A file will be created with a set of Makefile macros pointing to a
+ unified "include", "lib", and "bin" directory (release and debug) for
+ all of the required packages. This file will be included by the main
+ Makefile:
+ /compat/vcbuild/MSVC-DEFS-GEN
+
+2. OPTIONALLY copy the third-party *.dll and *.pdb files into the repo
+ root to make it easier to run and debug git.exe without having to
+ manipulate your PATH. This is especially true for debug sessions in
+ Visual Studio.
+
+ Use ONE of the following forms which should match how you want to
+ compile git.exe.
+
+ $ ./compat/vcbuild/vcpkg_copy_packages.bat debug
+ $ ./compat/vcbuild/vcpkg_copy_packages.bat release
+
+3. Build git using MSVC from an SDK bash window using one of the
+ following commands:
+
+ $ make MSVC=1
+ $ make MSVC=1 DEBUG=1
+
+================================================================
+
+Alternatively, run `make MSVC=1 vcxproj` and then load the generated
+git.sln in Visual Studio. The initial build will install the vcpkg
+system and build the dependencies automatically. This will take a while.
+
+Note that this will automatically add and commit the generated
+.sln and .vcxproj files to the repo. You may want to drop this
+commit before submitting a Pull Request....
+
+Or maybe we should put the .sln/.vcxproj files in the .gitignores
+and not do this. I'm not sure.
+
+================================================================
The Steps of Build Git with VS2008
1. You need the build environment, which contains the Git dependencies
diff --git a/compat/vcbuild/README_VS2015.txt b/compat/vcbuild/README_VS2015.txt
deleted file mode 100644
index a9c6f59dc6cfd8..00000000000000
--- a/compat/vcbuild/README_VS2015.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-Instructions for building Git for Windows using VS2015.
-================================================================
-
-Installing third-party dependencies:
-====================================
-
-[1] Install nuget.exe somewhere on your system and add it to your PATH.
- https://docs.nuget.org/consume/command-line-reference
- https://dist.nuget.org/index.html
-
-[2] Download required nuget packages for third-party libraries.
- Using a terminal window, type:
-
- make -C compat/vcbuild
-
- This will download the packages, unpack them into GEN.PKGS,
- and populate the {include, lib, bin} directories in GEN.DEPS.
-
-
-Building Git for Windows using VS2015:
-======================================
-
-[3] Build 64-bit version of Git for Windows.
- Using a terminal window:
-
- make MSVC=1 DEBUG=1
-
-
-[4] Add compat/vcbuild/GEN.DEPS/bin to your PATH.
-
-[5] You should then be able to run the test suite and any interactive
- commands.
-
-[6] To debug/profile in VS, open the git.exe in VS and run/debug
- it. (Be sure to add GEN.DEPS/bin to the PATH in the debug
- dialog.)
-
-
-TODO List:
-==========
-
-[A] config.mak.uname currently contains hard-coded paths
- to the various MSVC and SDK libraries for the 64-bit
- version of the compilers and libaries.
-
- See: SANE_TOOL_PATH, MSVC_DEPS, MSVC_SDK*, MSVC_VCDIR.
-
- Long term, we need to figure out how to properly import
- values for %VCINSTALLDIR%, %LIB%, %LIBPATH%, and the
- other values normally set by "vsvars32.bat" when a
- developer command prompt is started. This would also
- allow us to switch between 32- and 64-bit tool chains.
-
-[B] We need to build SLN or VCPROJ files.
diff --git a/compat/vcbuild/find_vs_env.bat b/compat/vcbuild/find_vs_env.bat
index 7a736eb3715088..4223ad962cb76c 100644
--- a/compat/vcbuild/find_vs_env.bat
+++ b/compat/vcbuild/find_vs_env.bat
@@ -1,167 +1,167 @@
-@ECHO OFF
-REM ================================================================
-REM You can use either GCC (the default) or MSVC to build git
-REM using the GIT-SDK command line tools.
-REM $ make
-REM $ make MSVC=1
-REM
-REM GIT-SDK BASH windows inherit environment variables with all of
-REM the bin/lib/include paths for GCC. It DOES NOT inherit values
-REM for the corresponding MSVC tools.
-REM
-REM During normal (non-git) Windows development, you launch one
-REM of the provided "developer command prompts" to set environment
-REM variables for the MSVC tools.
-REM
-REM Therefore, to allow MSVC command line builds of git from BASH
-REM and MAKE, we must blend these two different worlds. This script
-REM attempts to do that.
-REM ================================================================
-REM This BAT file starts in a plain (non-developer) command prompt,
-REM searches for the "best" commmand prompt setup script, installs
-REM it into the current CMD process, and exports the various MSVC
-REM environment variables for use by MAKE.
-REM
-REM The output of this script should be written to a make "include
-REM file" and referenced by the top-level Makefile.
-REM
-REM See "config.mak.uname" (look for GIT-MSVC-GEN).
-REM ================================================================
-REM The provided command prompts are custom to each VS release and
-REM filled with lots of internal knowledge (such as Registry settings);
-REM even their names vary by release, so it is not appropriate for us
-REM to look inside them. Rather, just run them in a subordinate
-REM process and extract the settings we need.
-REM ================================================================
-REM
-REM Current (VS2017 and beyond)
-REM -------------------
-REM Visual Studio 2017 introduced a new installation layout and
-REM support for side-by-side installation of multiple versions of
-REM VS2017. Furthermore, these can all coexist with installations
-REM of previous versions of VS (which have a completely different
-REM layout on disk).
-REM
-REM VS2017 Update 2 introduced a "vswhere.exe" command:
-REM https://github.com/Microsoft/vswhere
-REM https://blogs.msdn.microsoft.com/heaths/2017/02/25/vswhere-available/
-REM https://blogs.msdn.microsoft.com/vcblog/2017/03/06/finding-the-visual-c-compiler-tools-in-visual-studio-2017/
-REM
-REM VS2015
-REM ------
-REM Visual Studio 2015 uses the traditional VcVarsAll.
-REM
-REM Earlier Versions
-REM ----------------
-REM TODO
-REM
-REM ================================================================
-REM Note: Throughout this script we use "dir && " rather
-REM than "if exist " because of script problems with pathnames
-REM containing spaces.
-REM ================================================================
-
-REM Sanitize PATH to prevent git-sdk paths from confusing "wmic.exe"
-REM (called internally in some of the system BAT files).
-SET PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;
-
-REM ================================================================
-
-:current
- SET vs_where=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe
- dir "%vs_where%" >nul 2>nul && GOTO have_vs_where
- GOTO not_2017
-
-:have_vs_where
- REM Try to use VsWhere to get the location of VsDevCmd.
-
- REM Keep VsDevCmd from cd'ing away.
- SET VSCMD_START_DIR=.
-
- REM Get the root of the VS product installation.
- FOR /F "usebackq tokens=*" %%i IN (`"%vs_where%" -latest -requires Microsoft.VisualStudio.Workload.NativeDesktop -property installationPath`) DO @SET vs_ip=%%i
-
- SET vs_devcmd=%vs_ip%\Common7\Tools\VsDevCmd.bat
- dir "%vs_devcmd%" >nul 2>nul && GOTO have_vs_devcmd
- GOTO not_2017
-
-:have_vs_devcmd
- REM Use VsDevCmd to setup the environment of this process.
- REM Setup CL for building 64-bit apps using 64-bit tools.
- @call "%vs_devcmd%" -no_logo -arch=x64 -host_arch=x64
-
- SET tgt=%VSCMD_ARG_TGT_ARCH%
-
- SET mn=%VCToolsInstallDir%
- SET msvc_includes=-I"%mn%INCLUDE"
- SET msvc_libs=-L"%mn%lib\%tgt%"
- SET msvc_bin_dir=%mn%bin\Host%VSCMD_ARG_HOST_ARCH%\%tgt%
-
- SET sdk_dir=%WindowsSdkDir%
- SET sdk_ver=%WindowsSDKVersion%
- SET si=%sdk_dir%Include\%sdk_ver%
- SET sdk_includes=-I"%si%ucrt" -I"%si%um" -I"%si%shared"
- SET sl=%sdk_dir%lib\%sdk_ver%
- SET sdk_libs=-L"%sl%ucrt\%tgt%" -L"%sl%um\%tgt%"
-
- SET vs_ver=%VisualStudioVersion%
-
- GOTO print_vars
-
-REM ================================================================
-
-:not_2017
- REM See if VS2015 is installed.
-
- SET vs_2015_bat=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
- dir "%vs_2015_bat%" >nul 2>nul && GOTO have_vs_2015
- GOTO not_2015
-
-:have_vs_2015
- REM Use VcVarsAll like the "x64 Native" command prompt.
- REM Setup CL for building 64-bit apps using 64-bit tools.
- @call "%vs_2015_bat%" amd64
-
- REM Note that in VS2015 they use "x64" in some contexts and "amd64" in others.
- SET mn=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\
- SET msvc_includes=-I"%mn%INCLUDE"
- SET msvc_libs=-L"%mn%lib\amd64"
- SET msvc_bin_dir=%mn%bin\amd64
-
- SET sdk_dir=%WindowsSdkDir%
- SET sdk_ver=%WindowsSDKVersion%
- SET si=%sdk_dir%Include\%sdk_ver%
- SET sdk_includes=-I"%si%ucrt" -I"%si%um" -I"%si%shared" -I"%si%winrt"
- SET sl=%sdk_dir%lib\%sdk_ver%
- SET sdk_libs=-L"%sl%ucrt\x64" -L"%sl%um\x64"
-
- SET vs_ver=%VisualStudioVersion%
-
- GOTO print_vars
-
-REM ================================================================
-
-:not_2015
- REM TODO....
- echo TODO support older versions of VS. >&2
- EXIT /B 1
-
-REM ================================================================
-
-:print_vars
- REM Dump the essential vars to stdout to allow the main
- REM Makefile to include it. See config.mak.uname.
- REM Include DOS-style and BASH-style path for bin dir.
-
- echo msvc_bin_dir=%msvc_bin_dir%
- echo msvc_bin_dir_msys=%msvc_bin_dir:C:=/C%
-
- echo msvc_includes=%msvc_includes%
- echo msvc_libs=%msvc_libs%
-
- echo sdk_includes=%sdk_includes%
- echo sdk_libs=%sdk_libs%
-
- echo vs_ver=%vs_ver%
-
- EXIT /B 0
+@ECHO OFF
+REM ================================================================
+REM You can use either GCC (the default) or MSVC to build git
+REM using the GIT-SDK command line tools.
+REM $ make
+REM $ make MSVC=1
+REM
+REM GIT-SDK BASH windows inherit environment variables with all of
+REM the bin/lib/include paths for GCC. It DOES NOT inherit values
+REM for the corresponding MSVC tools.
+REM
+REM During normal (non-git) Windows development, you launch one
+REM of the provided "developer command prompts" to set environment
+REM variables for the MSVC tools.
+REM
+REM Therefore, to allow MSVC command line builds of git from BASH
+REM and MAKE, we must blend these two different worlds. This script
+REM attempts to do that.
+REM ================================================================
+REM This BAT file starts in a plain (non-developer) command prompt,
+REM searches for the "best" commmand prompt setup script, installs
+REM it into the current CMD process, and exports the various MSVC
+REM environment variables for use by MAKE.
+REM
+REM The output of this script should be written to a make "include
+REM file" and referenced by the top-level Makefile.
+REM
+REM See "config.mak.uname" (look for compat/vcbuild/MSVC-DEFS-GEN).
+REM ================================================================
+REM The provided command prompts are custom to each VS release and
+REM filled with lots of internal knowledge (such as Registry settings);
+REM even their names vary by release, so it is not appropriate for us
+REM to look inside them. Rather, just run them in a subordinate
+REM process and extract the settings we need.
+REM ================================================================
+REM
+REM Current (VS2017 and beyond)
+REM -------------------
+REM Visual Studio 2017 introduced a new installation layout and
+REM support for side-by-side installation of multiple versions of
+REM VS2017. Furthermore, these can all coexist with installations
+REM of previous versions of VS (which have a completely different
+REM layout on disk).
+REM
+REM VS2017 Update 2 introduced a "vswhere.exe" command:
+REM https://github.com/Microsoft/vswhere
+REM https://blogs.msdn.microsoft.com/heaths/2017/02/25/vswhere-available/
+REM https://blogs.msdn.microsoft.com/vcblog/2017/03/06/finding-the-visual-c-compiler-tools-in-visual-studio-2017/
+REM
+REM VS2015
+REM ------
+REM Visual Studio 2015 uses the traditional VcVarsAll.
+REM
+REM Earlier Versions
+REM ----------------
+REM TODO
+REM
+REM ================================================================
+REM Note: Throughout this script we use "dir && " rather
+REM than "if exist " because of script problems with pathnames
+REM containing spaces.
+REM ================================================================
+
+REM Sanitize PATH to prevent git-sdk paths from confusing "wmic.exe"
+REM (called internally in some of the system BAT files).
+SET PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;
+
+REM ================================================================
+
+:current
+ SET vs_where=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe
+ dir "%vs_where%" >nul 2>nul && GOTO have_vs_where
+ GOTO not_2017
+
+:have_vs_where
+ REM Try to use VsWhere to get the location of VsDevCmd.
+
+ REM Keep VsDevCmd from cd'ing away.
+ SET VSCMD_START_DIR=.
+
+ REM Get the root of the VS product installation.
+ FOR /F "usebackq tokens=*" %%i IN (`"%vs_where%" -latest -requires Microsoft.VisualStudio.Workload.NativeDesktop -property installationPath`) DO @SET vs_ip=%%i
+
+ SET vs_devcmd=%vs_ip%\Common7\Tools\VsDevCmd.bat
+ dir "%vs_devcmd%" >nul 2>nul && GOTO have_vs_devcmd
+ GOTO not_2017
+
+:have_vs_devcmd
+ REM Use VsDevCmd to setup the environment of this process.
+ REM Setup CL for building 64-bit apps using 64-bit tools.
+ @call "%vs_devcmd%" -no_logo -arch=x64 -host_arch=x64
+
+ SET tgt=%VSCMD_ARG_TGT_ARCH%
+
+ SET mn=%VCToolsInstallDir%
+ SET msvc_includes=-I"%mn%INCLUDE"
+ SET msvc_libs=-L"%mn%lib\%tgt%"
+ SET msvc_bin_dir=%mn%bin\Host%VSCMD_ARG_HOST_ARCH%\%tgt%
+
+ SET sdk_dir=%WindowsSdkDir%
+ SET sdk_ver=%WindowsSDKVersion%
+ SET si=%sdk_dir%Include\%sdk_ver%
+ SET sdk_includes=-I"%si%ucrt" -I"%si%um" -I"%si%shared"
+ SET sl=%sdk_dir%lib\%sdk_ver%
+ SET sdk_libs=-L"%sl%ucrt\%tgt%" -L"%sl%um\%tgt%"
+
+ SET vs_ver=%VisualStudioVersion%
+
+ GOTO print_vars
+
+REM ================================================================
+
+:not_2017
+ REM See if VS2015 is installed.
+
+ SET vs_2015_bat=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
+ dir "%vs_2015_bat%" >nul 2>nul && GOTO have_vs_2015
+ GOTO not_2015
+
+:have_vs_2015
+ REM Use VcVarsAll like the "x64 Native" command prompt.
+ REM Setup CL for building 64-bit apps using 64-bit tools.
+ @call "%vs_2015_bat%" amd64
+
+ REM Note that in VS2015 they use "x64" in some contexts and "amd64" in others.
+ SET mn=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\
+ SET msvc_includes=-I"%mn%INCLUDE"
+ SET msvc_libs=-L"%mn%lib\amd64"
+ SET msvc_bin_dir=%mn%bin\amd64
+
+ SET sdk_dir=%WindowsSdkDir%
+ SET sdk_ver=%WindowsSDKVersion%
+ SET si=%sdk_dir%Include\%sdk_ver%
+ SET sdk_includes=-I"%si%ucrt" -I"%si%um" -I"%si%shared" -I"%si%winrt"
+ SET sl=%sdk_dir%lib\%sdk_ver%
+ SET sdk_libs=-L"%sl%ucrt\x64" -L"%sl%um\x64"
+
+ SET vs_ver=%VisualStudioVersion%
+
+ GOTO print_vars
+
+REM ================================================================
+
+:not_2015
+ REM TODO....
+ echo TODO support older versions of VS. >&2
+ EXIT /B 1
+
+REM ================================================================
+
+:print_vars
+ REM Dump the essential vars to stdout to allow the main
+ REM Makefile to include it. See config.mak.uname.
+ REM Include DOS-style and BASH-style path for bin dir.
+
+ echo msvc_bin_dir=%msvc_bin_dir%
+ echo msvc_bin_dir_msys=%msvc_bin_dir:C:=/C%
+
+ echo msvc_includes=%msvc_includes%
+ echo msvc_libs=%msvc_libs%
+
+ echo sdk_includes=%sdk_includes%
+ echo sdk_libs=%sdk_libs%
+
+ echo vs_ver=%vs_ver%
+
+ EXIT /B 0
diff --git a/compat/vcbuild/nuget.config b/compat/vcbuild/nuget.config
deleted file mode 100644
index b5e734950478fa..00000000000000
--- a/compat/vcbuild/nuget.config
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/compat/vcbuild/packages.config b/compat/vcbuild/packages.config
deleted file mode 100644
index 53b1ede4f5361c..00000000000000
--- a/compat/vcbuild/packages.config
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/compat/vcbuild/scripts/clink.pl b/compat/vcbuild/scripts/clink.pl
index b67b8313043352..3d6fa21c1e5690 100755
--- a/compat/vcbuild/scripts/clink.pl
+++ b/compat/vcbuild/scripts/clink.pl
@@ -14,8 +14,15 @@
my @cflags = ();
my @lflags = ();
my $is_linking = 0;
+my $is_debug = 0;
while (@ARGV) {
my $arg = shift @ARGV;
+ if ("$arg" eq "-DDEBUG") {
+ # Some vcpkg-based libraries have different names for release
+ # and debug versions. This hack assumes that -DDEBUG comes
+ # before any "-l*" flags.
+ $is_debug = 1;
+ }
if ("$arg" =~ /^-[DIMGOZ]/) {
push(@cflags, $arg);
} elsif ("$arg" eq "-o") {
@@ -30,9 +37,13 @@
push(@args, "-Fd$file_out.pdb");
}
} elsif ("$arg" eq "-lz") {
+ if ($is_debug) {
+ push(@args, "zlibd.lib");
+ } else{
push(@args, "zlib.lib");
+ }
} elsif ("$arg" eq "-liconv") {
- push(@args, "iconv.lib");
+ push(@args, "libiconv.lib");
} elsif ("$arg" eq "-lcrypto") {
push(@args, "libeay32.lib");
} elsif ("$arg" eq "-lssl") {
@@ -40,7 +51,7 @@
} elsif ("$arg" eq "-lcurl") {
push(@args, "libcurl.lib");
} elsif ("$arg" eq "-lexpat") {
- push(@args, "libexpat.lib");
+ push(@args, "expat.lib");
} elsif ("$arg" =~ /^-L/ && "$arg" ne "-LTCG") {
$arg =~ s/^-L/-LIBPATH:/;
push(@lflags, $arg);
diff --git a/compat/vcbuild/vcpkg_copy_dlls.bat b/compat/vcbuild/vcpkg_copy_dlls.bat
new file mode 100644
index 00000000000000..13661c14f8705c
--- /dev/null
+++ b/compat/vcbuild/vcpkg_copy_dlls.bat
@@ -0,0 +1,39 @@
+@ECHO OFF
+REM ================================================================
+REM This script is an optional step. It copies the *.dll and *.pdb
+REM files (created by vcpkg_install.bat) into the top-level directory
+REM of the repo so that you can type "./git.exe" and find them without
+REM having to fixup your PATH.
+REM
+REM NOTE: Because the names of some DLL files change between DEBUG and
+REM NOTE: RELEASE builds when built using "vcpkg.exe", you will need
+REM NOTE: to copy up the corresponding version.
+REM ================================================================
+
+ SETLOCAL EnableDelayedExpansion
+
+ @FOR /F "delims=" %%D IN ("%~dp0") DO @SET cwd=%%~fD
+ cd %cwd%
+
+ SET arch=x64-windows
+ SET inst=%cwd%vcpkg\installed\%arch%
+
+ IF [%1]==[release] (
+ echo Copying RELEASE mode DLLs to repo root...
+ ) ELSE IF [%1]==[debug] (
+ SET inst=%inst%\debug
+ echo Copying DEBUG mode DLLs to repo root...
+ ) ELSE (
+ echo ERROR: Invalid argument.
+ echo Usage: %~0 release
+ echo Usage: %~0 debug
+ EXIT /B 1
+ )
+
+ xcopy /e/s/v/y %inst%\bin\*.dll ..\..\
+ xcopy /e/s/v/y %inst%\bin\*.pdb ..\..\
+
+ xcopy /e/s/v/y %inst%\bin\*.dll ..\..\t\helper\
+ xcopy /e/s/v/y %inst%\bin\*.pdb ..\..\t\helper\
+
+ EXIT /B 0
diff --git a/compat/vcbuild/vcpkg_install.bat b/compat/vcbuild/vcpkg_install.bat
new file mode 100644
index 00000000000000..3d086c39c31a53
--- /dev/null
+++ b/compat/vcbuild/vcpkg_install.bat
@@ -0,0 +1,81 @@
+@ECHO OFF
+REM ================================================================
+REM This script installs the "vcpkg" source package manager and uses
+REM it to build the third-party libraries that git requires when it
+REM is built using MSVC.
+REM
+REM [1] Install VCPKG.
+REM [a] Create /compat/vcbuild/vcpkg/
+REM [b] Download "vcpkg".
+REM [c] Compile using the currently installed version of VS.
+REM [d] Create /compat/vcbuild/vcpkg/vcpkg.exe
+REM
+REM [2] Install third-party libraries.
+REM [a] Download each (which may also install CMAKE).
+REM [b] Compile in RELEASE mode and install in:
+REM vcpkg/installed//{bin,lib}
+REM [c] Compile in DEBUG mode and install in:
+REM vcpkg/installed//debug/{bin,lib}
+REM [d] Install headers in:
+REM vcpkg/installed//include
+REM
+REM [3] Create a set of MAKE definitions for the top-level
+REM Makefile to allow "make MSVC=1" to find the above
+REM third-party libraries.
+REM [a] Write vcpkg/VCPGK-DEFS
+REM
+REM https://blogs.msdn.microsoft.com/vcblog/2016/09/19/vcpkg-a-tool-to-acquire-and-build-c-open-source-libraries-on-windows/
+REM https://github.com/Microsoft/vcpkg
+REM https://vcpkg.readthedocs.io/en/latest/
+REM ================================================================
+
+ SETLOCAL EnableDelayedExpansion
+
+ @FOR /F "delims=" %%D IN ("%~dp0") DO @SET cwd=%%~fD
+ cd %cwd%
+
+ dir vcpkg\vcpkg.exe >nul 2>nul && GOTO :install_libraries
+
+ echo Fetching vcpkg in %cwd%vcpkg
+ git.exe clone https://github.com/Microsoft/vcpkg vcpkg
+ IF ERRORLEVEL 1 ( EXIT /B 1 )
+
+ cd vcpkg
+ echo Building vcpkg
+ powershell -exec bypass scripts\bootstrap.ps1
+ IF ERRORLEVEL 1 ( EXIT /B 1 )
+
+ echo Successfully installed %cwd%vcpkg\vcpkg.exe
+
+:install_libraries
+ SET arch=x64-windows
+
+ echo Installing third-party libraries...
+ FOR %%i IN (zlib expat libiconv openssl libssh2 curl) DO (
+ cd %cwd%vcpkg
+ SET p="packages\%%i_%arch%"
+ IF NOT EXIST "%p%" CALL :sub__install_one %%i
+ IF ERRORLEVEL 1 ( EXIT /B 1 )
+ )
+
+:install_defines
+ cd %cwd%
+ SET inst=%cwd%vcpkg\installed\%arch%
+
+ echo vcpkg_inc=-I"%inst%\include">VCPKG-DEFS
+ echo vcpkg_rel_lib=-L"%inst%\lib">>VCPKG-DEFS
+ echo vcpkg_rel_bin="%inst%\bin">>VCPKG-DEFS
+ echo vcpkg_dbg_lib=-L"%inst%\debug\lib">>VCPKG-DEFS
+ echo vcpkg_dbg_bin="%inst%\debug\bin">>VCPKG-DEFS
+
+ EXIT /B 0
+
+
+:sub__install_one
+ echo Installing package %1...
+
+ .\vcpkg.exe install %1:%arch%
+ IF ERRORLEVEL 1 ( EXIT /B 1 )
+
+ echo Finished %1
+ goto :EOF
diff --git a/config.mak.uname b/config.mak.uname
index c67af7ac09140b..7ff739569e39eb 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -18,9 +18,18 @@ ifdef MSVC
# Generate and include makefile variables that point to the
# currently installed set of MSVC command line tools.
-GIT-MSVC-GEN: ./compat/vcbuild/find_vs_env.bat
- @./compat/vcbuild/find_vs_env.bat | sed 's|\\|/|g' >GIT-MSVC-GEN
--include GIT-MSVC-GEN
+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"
@@ -419,13 +428,13 @@ ifeq ($(uname_S),Windows)
EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib invalidcontinue.obj kernel32.lib ntdll.lib
PTHREAD_LIBS =
lib =
- # Path to the unpacked third-party libraries
- MSVC_DEPS = compat/vcbuild/GEN.DEPS
- BASIC_CFLAGS += \
- -I$(MSVC_DEPS)/include -I$(MSVC_DEPS)/include/expat -I$(MSVC_DEPS)/include/zlib \
- -L$(MSVC_DEPS)/lib \
- $(sdk_includes) $(sdk_libs) \
- $(msvc_includes) $(msvc_libs)
+ 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)
# Optionally enable memory leak reporting.
# BASIC_CLFAGS += -DUSE_MSVC_CRTDBG
@@ -449,65 +458,6 @@ endif
X = .exe
compat/msvc.o: compat/msvc.c compat/mingw.c GIT-CFLAGS
-
-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/*}/{packages.config,*.vcxproj}
-
- # Add common-cmds.h
- $(MAKE) MSVC=1 prefix=/mingw64 common-cmds.h
- git add -f common-cmds.h
-
- # Add scripts
- rm -f perl/perl.mak
- $(MAKE) MSVC=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 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-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 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) $@\`"
endif
ifeq ($(uname_S),Interix)
NO_INITGROUPS = YesPlease
@@ -770,3 +720,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 '' && \
+ echo ' ' && \
+ for name in $(BUILT_INS);\
+ do \
+ echo ' '; \
+ done && \
+ for name in $(REMOTE_CURL_ALIASES); \
+ do \
+ echo ' '; \
+ done && \
+ echo ' ' && \
+ echo '') >git/LinkOrCopyBuiltins.targets
+ git add -f git/LinkOrCopyBuiltins.targets
+
+ # Add common-cmds.h
+ $(MAKE) MSVC=1 SKIP_VCPKG=1 prefix=/mingw64 common-cmds.h
+ git add -f common-cmds.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-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) $@\`"
diff --git a/contrib/buildsystems/Generators/Vcxproj.pm b/contrib/buildsystems/Generators/Vcxproj.pm
index ae443449aac203..26c1fd54878d96 100644
--- a/contrib/buildsystems/Generators/Vcxproj.pm
+++ b/contrib/buildsystems/Generators/Vcxproj.pm
@@ -123,62 +123,24 @@ sub createProject {
my $defines = join(";", sort(@{$$build_structure{"$prefix${name}_DEFINES"}}));
my $includes= join(";", sort(map { s/^-I//; s/\//\\/g; File::Spec->file_name_is_absolute($_) ? $_ : "$rel_dir\\$_" } @{$$build_structure{"$prefix${name}_INCLUDES"}}));
my $cflags = join(" ", sort(map { s/^-[GLMOZ].*//; s/.* .*/"$&"/; $_; } @{$$build_structure{"$prefix${name}_CFLAGS"}}));
- $cflags =~ s/\"/"/g;
$cflags =~ s/</g;
$cflags =~ s/>/>/g;
- my $libs = '';
+ my $libs_release = "\n ";
+ my $libs_debug = "\n ";
if (!$static_library) {
- $libs = join(";", sort(grep /^(?!libgit\.lib|xdiff\/lib\.lib|vcs-svn\/lib\.lib|libcurl\.lib|libeay32\.lib|libiconv\.lib|ssleay32\.lib|zlib\.lib)/, @{$$build_structure{"$prefix${name}_LIBS"}}));
+ $libs_release = join(";", sort(grep /^(?!libgit\.lib|xdiff\/lib\.lib|vcs-svn\/lib\.lib)/, @{$$build_structure{"$prefix${name}_LIBS"}}));
+ $libs_debug = $libs_release;
+ $libs_debug =~ s/zlib\.lib/zlibd\.lib/;
}
$defines =~ s/-D//g;
- $defines =~ s/\"/"/g;
$defines =~ s/</g;
$defines =~ s/>/>/g;
$defines =~ s/\'//g;
die "Could not create the directory $target for $label project!\n" unless (-d "$target" || mkdir "$target");
- use File::Copy;
- copy("$git_dir/compat/vcbuild/packages.config", "$target/packages.config");
-
- my $needsCurl = grep(/libcurl.lib/, @{$$build_structure{"$prefix${name}_LIBS"}});
- my $targetsImport = '';
- my $targetsErrors = '';
- my $afterTargets = '';
- open F, "<$git_dir/compat/vcbuild/packages.config";
- while () {
- if (/";
- } elsif ($needsCurl && $1 eq 'curl') {
- # libcurl is only available targeting v100 and v110
- $libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.$2\\build\\native\\lib\\v110\\\$(Platform)\\Release\\dynamic\\libcurl.lib";
- $afterTargets .= "\n ";
- } elsif ($needsCurl && $1 eq 'expat') {
- # libexpat is only available targeting v100 and v110
- $libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.$2\\build\\native\\lib\\v110\\\$(Platform)\\Release\\dynamic\\utf8\\libexpat.lib";
- } elsif ($1 eq 'zlib') {
- # zlib
- $libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.v140.windesktop.msvcstl.dyn.rt-dyn.$2\\lib\\native\\v140\\windesktop\\msvcstl\\dyn\\rt-dyn\\x64\\RelWithDebInfo\\zlib.lib";
- } elsif ($1 eq 'openssl') {
- # openssl
- $libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.v140.windesktop.msvcstl.dyn.rt-dyn.x64.$2\\lib\\native\\v140\\windesktop\\msvcstl\\dyn\\rt-dyn\\x64\\release\\libeay32.lib";
- $libs .= ";$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.v140.windesktop.msvcstl.dyn.rt-dyn.x64.$2\\lib\\native\\v140\\windesktop\\msvcstl\\dyn\\rt-dyn\\x64\\release\\ssleay32.lib";
- }
- next if ($1 =~ /^(zlib$|openssl(?!.*(x64|x86)$))/);
- my $targetsFile = "$rel_dir\\compat\\vcbuild\\GEN.PKGS\\$1.$2\\build\\native\\$1.targets";
- $targetsImport .= "\n ";
- $targetsErrors .= "\n ";
- }
- }
- close F;
-
open F, ">$vcxproj" or die "Could not open $vcxproj for writing!\n";
binmode F, ":crlf :utf8";
print F chr(0xFEFF);
@@ -206,6 +168,16 @@ sub createProject {
$uuidWin32Proj
+ x86-windows
+ x64-windows
+ $cdup\\compat\\vcbuild\\vcpkg\\installed\\\$(VCPKGArch)
+ \$(VCPKGArchDirectory)\\debug\\bin
+ \$(VCPKGArchDirectory)\\debug\\lib
+ \$(VCPKGArchDirectory)\\bin
+ \$(VCPKGArchDirectory)\\lib
+ \$(VCPKGArchDirectory)\\include
+ $libs_debug
+ $libs_release
@@ -239,7 +211,7 @@ sub createProject {
$cflags %(AdditionalOptions)
- $includes;%(AdditionalIncludeDirectories)
+ $cdup;$cdup\\compat;$cdup\\compat\\regex;$cdup\\compat\\win32;$cdup\\compat\\poll;$cdup\\compat\\vcbuild\\include;\$(VCPKGIncludeDirectory);%(AdditionalIncludeDirectories)trueOnlyExplicitInline
@@ -250,11 +222,22 @@ sub createProject {
true
- $libs;\$(AdditionalDependencies)
+ \$(VCPKGLibDirectory);%(AdditionalLibraryDirectories)
+ \$(VCPKGLibs);\$(AdditionalDependencies)invalidcontinue.obj %(AdditionalOptions)$cdup\\compat\\win32\\git.manifestConsole
+EOM
+ if ($target eq 'libgit') {
+ print F << "EOM";
+
+ Initialize VCPKG
+ call "$cdup\\compat\\vcbuild\\vcpkg_install.bat"
+
+EOM
+ }
+ print F << "EOM";
@@ -296,7 +279,7 @@ EOM
print F << "EOM";
EOM
- if (!$static_library) {
+ if (!$static_library || $target =~ 'vcs-svn') {
my $uuid_libgit = $$build_structure{"LIBS_libgit_GUID"};
my $uuid_xdiff_lib = $$build_structure{"LIBS_xdiff/lib_GUID"};
@@ -325,24 +308,21 @@ EOM
EOM
}
print F << "EOM";
-
-
-
- $targetsImport
-
-
-
- This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
- $targetsErrors
-
EOM
- if (!$static_library && $afterTargets ne '') {
+ if (!$static_library) {
print F << "EOM";
- $afterTargets
+
+
+
+
+
EOM
}
+ if ($target eq 'git') {
+ print F " \n";
+ }
print F << "EOM";
EOM
diff --git a/contrib/buildsystems/engine.pl b/contrib/buildsystems/engine.pl
index 6cfaedb029364d..fba8a3f056a0e1 100755
--- a/contrib/buildsystems/engine.pl
+++ b/contrib/buildsystems/engine.pl
@@ -57,6 +57,8 @@ sub showUsage
open(F, "<$infile") || die "Couldn't open file $infile";
@makedry = ;
close(F);
+ } else {
+ die "Unknown option: " . $arg;
}
}
@@ -80,7 +82,8 @@ sub showUsage
# Capture the make dry stderr to file for review (will be empty for a release build).
my $ErrsFile = "msvc-build-makedryerrors.txt";
-@makedry = `cd $git_dir && make -n MSVC=1 V=1 2>$ErrsFile` if !@makedry;
+@makedry = `make -C $git_dir -n MSVC=1 SKIP_VCPKG=1 V=1 2>$ErrsFile`
+if !@makedry;
# test for an empty Errors file and remove it
unlink $ErrsFile if -f -z $ErrsFile;
@@ -345,6 +348,8 @@ sub handleLinkLine
push(@libs, "ssleay32.lib");
} elsif ("$part" eq "-lcurl") {
push(@libs, "libcurl.lib");
+ } elsif ("$part" eq "-lexpat") {
+ push(@libs, "expat.lib");
} elsif ("$part" eq "-liconv") {
push(@libs, "libiconv.lib");
} elsif ($part =~ /^[-\/]/) {
diff --git a/t/test-lib.sh b/t/test-lib.sh
index 3d7d210e9c2d2e..fe886a53fbd3e8 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -66,9 +66,6 @@ fi
. "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS
export PERL_PATH SHELL_PATH
-test -z "$MSVC_DEPS" ||
-PATH="$GIT_BUILD_DIR/$MSVC_DEPS/bin$PATH_SEP$PATH"
-
################################################################
# It appears that people try to run tests without building...
test -n "$GIT_TEST_INSTALLED" || "$GIT_BUILD_DIR/git$X" >/dev/null ||