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