summaryrefslogtreecommitdiff
path: root/coreconf/msvc.sh
diff options
context:
space:
mode:
Diffstat (limited to 'coreconf/msvc.sh')
-rw-r--r--coreconf/msvc.sh106
1 files changed, 106 insertions, 0 deletions
diff --git a/coreconf/msvc.sh b/coreconf/msvc.sh
new file mode 100644
index 000000000..a592279c9
--- /dev/null
+++ b/coreconf/msvc.sh
@@ -0,0 +1,106 @@
+#!/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