#!/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