Source code

Revision control

Copy as Markdown

Other Tools

#!/bin/bash
# This configures the environment for running MSVC. It uses vswhere, the
# registry, and a little knowledge of how MSVC is laid out.
if ! hash vswhere 2>/dev/null; then
echo "Can't find vswhere on the path, aborting" 1>&2
exit 1
fi
if ! hash reg 2>/dev/null; then
echo "Can't find reg on the path, aborting" 1>&2
exit 1
fi
# Turn a unix-y path into a windows one.
fixpath() {
if hash cygpath 2>/dev/null; then
cygpath --unix "$1"
else # haxx
echo "$1" | sed -e 's,\\,/,g;s,^\(.\):,/\L\1,;s,/$,,'
fi
}
# Query the registry. This takes $1 and tags that on the end of several
# different paths, looking for a value called $2 at that location.
# e.g.,
# regquery Microsoft\Microsoft SDKs\Windows\v10.0 ProductVersion
# looks for a REG_SZ value called ProductVersion at
# HKLM\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0
# HKLU\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0
# etc...
regquery() {
search=("HKLM\\SOFTWARE\\Wow6432Node" \
"HKCU\\SOFTWARE\\Wow6432Node" \
"HKLM\\SOFTWARE" \
"HKCU\\SOFTWARE")
for i in "${search[@]}"; do
r=$(reg query "${i}\\${1}" -v "$2" | sed -e 's/ *'"$2"' *REG_SZ *//;t;d')
if [ -n "$r" ]; then
echo "$r"
return 0
fi
done
return 1
}
VSCOMPONENT=Microsoft.VisualStudio.Component.VC.Tools.x86.x64
vsinstall=$(vswhere -latest -requires "$VSCOMPONENT" -property installationPath)
# Attempt to setup paths if vswhere returns something and VSPATH isn't set.
# Otherwise, assume that the env is setup.
if [[ -n "$vsinstall" && -z "$VSPATH" ]]; then
case "$target_arch" in
ia32) m=x86 ;;
x64) m="$target_arch" ;;
*)
echo "No support for target '$target_arch' with MSVC." 1>&2
exit 1
esac
export VSPATH=$(fixpath "$vsinstall")
export WINDOWSSDKDIR="${VSPATH}/SDK"
export VCINSTALLDIR="${VSPATH}/VC"
CRTREG="Microsoft\\Microsoft SDKs\\Windows\\v10.0"
UniversalCRTSdkDir=$(regquery "$CRTREG" InstallationFolder)
UniversalCRTSdkDir=$(fixpath "$UniversalCRTSdkDir")
UCRTVersion=$(regquery "$CRTREG" ProductVersion)
UCRTVersion=$(cd "${UniversalCRTSdkDir}/include"; ls -d "${UCRTVersion}"* | tail -1)
VCVER=$(cat "${VCINSTALLDIR}/Auxiliary/Build/Microsoft.VCToolsVersion.default.txt")
REDISTVER=$(cat "${VCINSTALLDIR}/Auxiliary/Build/Microsoft.VCRedistVersion.default.txt")
export WIN32_REDIST_DIR="${VCINSTALLDIR}/Redist/MSVC/${REDISTVER}/${m}/Microsoft.VC141.CRT"
export WIN_UCRT_REDIST_DIR="${UniversalCRTSdkDir}/Redist/ucrt/DLLs/${m}"
if [ "$m" == "x86" ]; then
PATH="${PATH}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/bin/Hostx64/x64"
PATH="${PATH}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/bin/Hostx64/x86"
fi
PATH="${PATH}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/bin/Host${m}/${m}"
PATH="${PATH}:${UniversalCRTSdkDir}/bin/${UCRTVersion}/${m}"
PATH="${PATH}:${WIN32_REDIST_DIR}"
export PATH
INCLUDE="${VCINSTALLDIR}/Tools/MSVC/${VCVER}/ATLMFC/include"
INCLUDE="${INCLUDE}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/include"
INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/ucrt"
INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/shared"
INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/um"
INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/winrt"
INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/cppwinrt"
export INCLUDE
LIB="${VCINSTALLDIR}/lib/${m}"
LIB="${VCINSTALLDIR}/Tools/MSVC/${VCVER}/lib/${m}"
LIB="${LIB}:${UniversalCRTSdkDir}/lib/${UCRTVersion}/ucrt/${m}"
LIB="${LIB}:${UniversalCRTSdkDir}/lib/${UCRTVersion}/um/${m}"
export LIB
export GYP_MSVS_OVERRIDE_PATH="${VSPATH}"
export GYP_MSVS_VERSION=$(vswhere -latest -requires "$VSCOMPONENT" -property catalog_productLineVersion)
else
echo Assuming env setup is already done.
echo VSPATH=$VSPATH
fi