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; - 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; 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 { $uuid Win32Proj + 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) true OnlyExplicitInline @@ -250,11 +222,22 @@ sub createProject { true - $libs;\$(AdditionalDependencies) + \$(VCPKGLibDirectory);%(AdditionalLibraryDirectories) + \$(VCPKGLibs);\$(AdditionalDependencies) invalidcontinue.obj %(AdditionalOptions) $cdup\\compat\\win32\\git.manifest Console +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 ||