mirror of
https://github.com/git/git
synced 2024-08-28 20:20:07 +00:00
![Jeff Hostetler](/assets/img/avatar_default.png)
With this patch, Git can be built using the Microsoft toolchain, via: make MSVC=1 [DEBUG=1] Third party libraries are built from source using the open source "vcpkg" tool set. See https://github.com/Microsoft/vcpkg On a first build, the vcpkg tools and the third party libraries are automatically downloaded and built. DLLs for the third party libraries are copied to the top-level (and t/helper) directory to facilitate debugging. See compat/vcbuild/README. A series of .bat files are invoked by the Makefile to find the location of the installed version of Visual Studio and the associated compiler tools (essentially replicating the environment setup performed by a "Developer Command Prompt"). This should find the most recent VS2015 or VS2017 installation. Output from these scripts are used by the Makefile to define compiler and linker pathnames and -I and -L arguments. The build produces .pdb files for both debug and release builds. Note: This commit was squashed from an organic series of commits developed between 2016 and 2018 in Git for Windows' `master` branch. This combined commit eliminates the obsolete commits related to fetching NuGet packages for third party libraries. It is difficult to use NuGet packages for C/C++ sources because they may be built by earlier versions of the MSVC compiler and have CRT version and linking issues. Additionally, the C/C++ NuGet packages that we were using tended to not be updated concurrently with the sources. And in the case of cURL and OpenSSL, this could expose us to security issues. Helped-by: Yue Lin Ho <b8732003@student.nsysu.edu.tw> Helped-by: Philip Oakley <philipoakley@iee.org> Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
169 lines
6 KiB
Batchfile
169 lines
6 KiB
Batchfile
@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 Currently unsupported.
|
|
REM
|
|
REM ================================================================
|
|
REM Note: Throughout this script we use "dir <path> && <cmd>" rather
|
|
REM than "if exist <path>" 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
|
|
echo "ERROR: unsupported VS version (older than VS2015)" >&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%
|
|
SET X1=%msvc_bin_dir:C:=/C%
|
|
SET X2=%X1:\=/%
|
|
echo msvc_bin_dir_msys=%X2%
|
|
|
|
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
|