2 REM ================================================================
3 REM You can use either GCC (the default) or MSVC to build git
4 REM using the GIT-SDK command line tools.
8 REM GIT-SDK BASH windows inherit environment variables with all of
9 REM the bin/lib/include paths for GCC. It DOES NOT inherit values
10 REM for the corresponding MSVC tools.
12 REM During normal (non-git) Windows development, you launch one
13 REM of the provided "developer command prompts" to set environment
14 REM variables for the MSVC tools.
16 REM Therefore, to allow MSVC command line builds of git from BASH
17 REM and MAKE, we must blend these two different worlds. This script
18 REM attempts to do that.
19 REM ================================================================
20 REM This BAT file starts in a plain (non-developer) command prompt,
21 REM searches for the "best" commmand prompt setup script, installs
22 REM it into the current CMD process, and exports the various MSVC
23 REM environment variables for use by MAKE.
25 REM The output of this script should be written to a make "include
26 REM file" and referenced by the top-level Makefile.
28 REM See "config.mak.uname" (look for compat/vcbuild/MSVC-DEFS-GEN).
29 REM ================================================================
30 REM The provided command prompts are custom to each VS release and
31 REM filled with lots of internal knowledge (such as Registry settings);
32 REM even their names vary by release, so it is not appropriate for us
33 REM to look inside them. Rather, just run them in a subordinate
34 REM process and extract the settings we need.
35 REM ================================================================
37 REM Current (VS2017 and beyond)
38 REM -------------------
39 REM Visual Studio 2017 introduced a new installation layout and
40 REM support for side-by-side installation of multiple versions of
41 REM VS2017. Furthermore, these can all coexist with installations
42 REM of previous versions of VS (which have a completely different
45 REM VS2017 Update 2 introduced a "vswhere.exe" command:
46 REM https://github.com/Microsoft/vswhere
47 REM https://blogs.msdn.microsoft.com/heaths/2017/02/25/vswhere-available/
48 REM https://blogs.msdn.microsoft.com/vcblog/2017/03/06/finding-the-visual-c-compiler-tools-in-visual-studio-2017/
52 REM Visual Studio 2015 uses the traditional VcVarsAll.
56 REM Currently unsupported.
58 REM ================================================================
59 REM Note: Throughout this script we use "dir <path> && <cmd>" rather
60 REM than "if exist <path>" because of script problems with pathnames
61 REM containing spaces.
62 REM ================================================================
64 REM Sanitize PATH to prevent git-sdk paths from confusing "wmic.exe"
65 REM (called internally in some of the system BAT files).
66 SET PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;
68 REM ================================================================
71 SET vs_where=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe
72 dir "%vs_where%" >nul 2>nul && GOTO have_vs_where
76 REM Try to use VsWhere to get the location of VsDevCmd.
78 REM Keep VsDevCmd from cd'ing away.
81 REM Get the root of the VS product installation.
82 FOR /F "usebackq tokens=*" %%i IN (`"%vs_where%" -latest -requires Microsoft.VisualStudio.Workload.NativeDesktop -property installationPath`) DO @SET vs_ip=%%i
84 SET vs_devcmd=%vs_ip%\Common7\Tools\VsDevCmd.bat
85 dir "%vs_devcmd%" >nul 2>nul && GOTO have_vs_devcmd
89 REM Use VsDevCmd to setup the environment of this process.
90 REM Setup CL for building 64-bit apps using 64-bit tools.
91 @call "%vs_devcmd%" -no_logo -arch=x64 -host_arch=x64
93 SET tgt=%VSCMD_ARG_TGT_ARCH%
95 SET mn=%VCToolsInstallDir%
96 SET msvc_includes=-I"%mn%INCLUDE"
97 SET msvc_libs=-L"%mn%lib\%tgt%"
98 SET msvc_bin_dir=%mn%bin\Host%VSCMD_ARG_HOST_ARCH%\%tgt%
100 SET sdk_dir=%WindowsSdkDir%
101 SET sdk_ver=%WindowsSDKVersion%
102 SET si=%sdk_dir%Include\%sdk_ver%
103 SET sdk_includes=-I"%si%ucrt" -I"%si%um" -I"%si%shared"
104 SET sl=%sdk_dir%lib\%sdk_ver%
105 SET sdk_libs=-L"%sl%ucrt\%tgt%" -L"%sl%um\%tgt%"
107 SET vs_ver=%VisualStudioVersion%
111 REM ================================================================
114 REM See if VS2015 is installed.
116 SET vs_2015_bat=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
117 dir "%vs_2015_bat%" >nul 2>nul && GOTO have_vs_2015
121 REM Use VcVarsAll like the "x64 Native" command prompt.
122 REM Setup CL for building 64-bit apps using 64-bit tools.
123 @call "%vs_2015_bat%" amd64
125 REM Note that in VS2015 they use "x64" in some contexts and "amd64" in others.
126 SET mn=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\
127 SET msvc_includes=-I"%mn%INCLUDE"
128 SET msvc_libs=-L"%mn%lib\amd64"
129 SET msvc_bin_dir=%mn%bin\amd64
131 SET sdk_dir=%WindowsSdkDir%
132 SET sdk_ver=%WindowsSDKVersion%
133 SET si=%sdk_dir%Include\%sdk_ver%
134 SET sdk_includes=-I"%si%ucrt" -I"%si%um" -I"%si%shared" -I"%si%winrt"
135 SET sl=%sdk_dir%lib\%sdk_ver%
136 SET sdk_libs=-L"%sl%ucrt\x64" -L"%sl%um\x64"
138 SET vs_ver=%VisualStudioVersion%
142 REM ================================================================
145 echo "ERROR: unsupported VS version (older than VS2015)" >&2
148 REM ================================================================
151 REM Dump the essential vars to stdout to allow the main
152 REM Makefile to include it. See config.mak.uname.
153 REM Include DOS-style and BASH-style path for bin dir.
155 echo msvc_bin_dir=%msvc_bin_dir%
156 SET X1=%msvc_bin_dir:C:=/C%
158 echo msvc_bin_dir_msys=%X2%
160 echo msvc_includes=%msvc_includes%
161 echo msvc_libs=%msvc_libs%
163 echo sdk_includes=%sdk_includes%
164 echo sdk_libs=%sdk_libs%