| 1 | @ECHO OFF |
| 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. |
| 5 | REM $ make |
| 6 | REM $ make MSVC=1 |
| 7 | REM |
| 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. |
| 11 | REM |
| 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. |
| 15 | REM |
| 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" command 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. |
| 24 | REM |
| 25 | REM The output of this script should be written to a make "include |
| 26 | REM file" and referenced by the top-level Makefile. |
| 27 | REM |
| 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 ================================================================ |
| 36 | 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 |
| 43 | REM layout on disk). |
| 44 | REM |
| 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/ |
| 49 | REM |
| 50 | REM VS2015 |
| 51 | REM ------ |
| 52 | REM Visual Studio 2015 uses the traditional VcVarsAll. |
| 53 | REM |
| 54 | REM Earlier Versions |
| 55 | REM ---------------- |
| 56 | REM Currently unsupported. |
| 57 | REM |
| 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 ================================================================ |
| 63 | |
| 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; |
| 67 | |
| 68 | REM ================================================================ |
| 69 | |
| 70 | :current |
| 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 |
| 73 | GOTO not_2017 |
| 74 | |
| 75 | :have_vs_where |
| 76 | REM Try to use VsWhere to get the location of VsDevCmd. |
| 77 | |
| 78 | REM Keep VsDevCmd from cd'ing away. |
| 79 | SET VSCMD_START_DIR=. |
| 80 | |
| 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 |
| 83 | |
| 84 | SET vs_devcmd=%vs_ip%\Common7\Tools\VsDevCmd.bat |
| 85 | dir "%vs_devcmd%" >nul 2>nul && GOTO have_vs_devcmd |
| 86 | GOTO not_2017 |
| 87 | |
| 88 | :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 |
| 92 | |
| 93 | SET tgt=%VSCMD_ARG_TGT_ARCH% |
| 94 | |
| 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% |
| 99 | |
| 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%" |
| 106 | |
| 107 | SET vs_ver=%VisualStudioVersion% |
| 108 | |
| 109 | GOTO print_vars |
| 110 | |
| 111 | REM ================================================================ |
| 112 | |
| 113 | :not_2017 |
| 114 | REM See if VS2015 is installed. |
| 115 | |
| 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 |
| 118 | GOTO not_2015 |
| 119 | |
| 120 | :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 |
| 124 | |
| 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 |
| 130 | |
| 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" |
| 137 | |
| 138 | SET vs_ver=%VisualStudioVersion% |
| 139 | |
| 140 | GOTO print_vars |
| 141 | |
| 142 | REM ================================================================ |
| 143 | |
| 144 | :not_2015 |
| 145 | echo "ERROR: unsupported VS version (older than VS2015)" >&2 |
| 146 | EXIT /B 1 |
| 147 | |
| 148 | REM ================================================================ |
| 149 | |
| 150 | :print_vars |
| 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. |
| 154 | |
| 155 | echo msvc_bin_dir=%msvc_bin_dir% |
| 156 | SET X1=%msvc_bin_dir:C:=/C% |
| 157 | SET X2=%X1:\=/% |
| 158 | echo msvc_bin_dir_msys=%X2% |
| 159 | |
| 160 | echo msvc_includes=%msvc_includes% |
| 161 | echo msvc_libs=%msvc_libs% |
| 162 | |
| 163 | echo sdk_includes=%sdk_includes% |
| 164 | echo sdk_libs=%sdk_libs% |
| 165 | |
| 166 | echo vs_ver=%vs_ver% |
| 167 | |
| 168 | EXIT /B 0 |