msvc.sh 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #!/bin/bash
  2. # This configures the environment for running MSVC. It uses vswhere, the
  3. # registry, and a little knowledge of how MSVC is laid out.
  4. if ! hash vswhere 2>/dev/null; then
  5. echo "Can't find vswhere on the path, aborting" 1>&2
  6. exit 1
  7. fi
  8. if ! hash reg 2>/dev/null; then
  9. echo "Can't find reg on the path, aborting" 1>&2
  10. exit 1
  11. fi
  12. # Turn a unix-y path into a windows one.
  13. fixpath() {
  14. if hash cygpath 2>/dev/null; then
  15. cygpath --unix "$1"
  16. else # haxx
  17. echo "$1" | sed -e 's,\\,/,g;s,^\(.\):,/\L\1,;s,/$,,'
  18. fi
  19. }
  20. # Query the registry. This takes $1 and tags that on the end of several
  21. # different paths, looking for a value called $2 at that location.
  22. # e.g.,
  23. # regquery Microsoft\Microsoft SDKs\Windows\v10.0 ProductVersion
  24. # looks for a REG_SZ value called ProductVersion at
  25. # HKLM\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0
  26. # HKLU\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0
  27. # etc...
  28. regquery() {
  29. search=("HKLM\\SOFTWARE\\Wow6432Node" \
  30. "HKCU\\SOFTWARE\\Wow6432Node" \
  31. "HKLM\\SOFTWARE" \
  32. "HKCU\\SOFTWARE")
  33. for i in "${search[@]}"; do
  34. r=$(reg query "${i}\\${1}" -v "$2" | sed -e 's/ *'"$2"' *REG_SZ *//;t;d')
  35. if [ -n "$r" ]; then
  36. echo "$r"
  37. return 0
  38. fi
  39. done
  40. return 1
  41. }
  42. VSCOMPONENT=Microsoft.VisualStudio.Component.VC.Tools.x86.x64
  43. vsinstall=$(vswhere -latest -requires "$VSCOMPONENT" -property installationPath)
  44. # Attempt to setup paths if vswhere returns something and VSPATH isn't set.
  45. # Otherwise, assume that the env is setup.
  46. if [[ -n "$vsinstall" && -z "$VSPATH" ]]; then
  47. case "$target_arch" in
  48. ia32) m=x86 ;;
  49. x64) m="$target_arch" ;;
  50. *)
  51. echo "No support for target '$target_arch' with MSVC." 1>&2
  52. exit 1
  53. esac
  54. export VSPATH=$(fixpath "$vsinstall")
  55. export WINDOWSSDKDIR="${VSPATH}/SDK"
  56. export VCINSTALLDIR="${VSPATH}/VC"
  57. CRTREG="Microsoft\\Microsoft SDKs\\Windows\\v10.0"
  58. UniversalCRTSdkDir=$(regquery "$CRTREG" InstallationFolder)
  59. UniversalCRTSdkDir=$(fixpath "$UniversalCRTSdkDir")
  60. UCRTVersion=$(regquery "$CRTREG" ProductVersion)
  61. UCRTVersion=$(cd "${UniversalCRTSdkDir}/include"; ls -d "${UCRTVersion}"* | tail -1)
  62. VCVER=$(cat "${VCINSTALLDIR}/Auxiliary/Build/Microsoft.VCToolsVersion.default.txt")
  63. REDISTVER=$(cat "${VCINSTALLDIR}/Auxiliary/Build/Microsoft.VCRedistVersion.default.txt")
  64. export WIN32_REDIST_DIR="${VCINSTALLDIR}/Redist/MSVC/${REDISTVER}/${m}/Microsoft.VC141.CRT"
  65. export WIN_UCRT_REDIST_DIR="${UniversalCRTSdkDir}/Redist/ucrt/DLLs/${m}"
  66. if [ "$m" == "x86" ]; then
  67. PATH="${PATH}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/bin/Hostx64/x64"
  68. PATH="${PATH}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/bin/Hostx64/x86"
  69. fi
  70. PATH="${PATH}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/bin/Host${m}/${m}"
  71. PATH="${PATH}:${UniversalCRTSdkDir}/bin/${UCRTVersion}/${m}"
  72. PATH="${PATH}:${WIN32_REDIST_DIR}"
  73. export PATH
  74. INCLUDE="${VCINSTALLDIR}/Tools/MSVC/${VCVER}/ATLMFC/include"
  75. INCLUDE="${INCLUDE}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/include"
  76. INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/ucrt"
  77. INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/shared"
  78. INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/um"
  79. INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/winrt"
  80. INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/cppwinrt"
  81. export INCLUDE
  82. LIB="${VCINSTALLDIR}/lib/${m}"
  83. LIB="${VCINSTALLDIR}/Tools/MSVC/${VCVER}/lib/${m}"
  84. LIB="${LIB}:${UniversalCRTSdkDir}/lib/${UCRTVersion}/ucrt/${m}"
  85. LIB="${LIB}:${UniversalCRTSdkDir}/lib/${UCRTVersion}/um/${m}"
  86. export LIB
  87. export GYP_MSVS_OVERRIDE_PATH="${VSPATH}"
  88. export GYP_MSVS_VERSION=$(vswhere -latest -requires "$VSCOMPONENT" -property catalog_productLineVersion)
  89. else
  90. echo Assuming env setup is already done.
  91. echo VSPATH=$VSPATH
  92. fi