locate_msbuild.ps1 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #-------------------------------------------------------------------------------------------------------
  2. # Copyright (C) Microsoft. All rights reserved.
  3. # Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. #-------------------------------------------------------------------------------------------------------
  5. # Locate-MSBuild
  6. #
  7. # Locate and return the preferred location of MSBuild on this machine.
  8. . $PSScriptRoot\util.ps1
  9. # helper to try to locate a single version installed under "Microsoft Visual Studio" instead of under "MSBuild"
  10. function Locate-MSBuild-Modern-Version([string]$product, [string]$version) {
  11. $msbuildTemplate = "{0}\Microsoft Visual Studio\2017\{1}\MSBuild\{2}\Bin\{3}\msbuild.exe"
  12. $msbuildUnscoped = "{0}\Microsoft Visual Studio\2017\{1}\MSBuild\{2}\Bin\msbuild.exe"
  13. # e.g. C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe
  14. $msbuildExe = $msbuildTemplate -f "${Env:ProgramFiles}", $product, $version, "x86"
  15. $_ = WriteMessage "Trying `"$msbuildExe`""
  16. if (Test-Path $msbuildExe) { return $msbuildExe }
  17. $msbuildExe = $msbuildUnscoped -f "${Env:ProgramFiles(x86)}", $product, $version
  18. $_ = WriteMessage "Trying `"$msbuildExe`""
  19. if (Test-Path $msbuildExe) { return $msbuildExe }
  20. $msbuildExe = $msbuildTemplate -f "${Env:ProgramFiles(x86)}", $product, $version, "amd64"
  21. $_ = WriteMessage "Trying `"$msbuildExe`""
  22. if (Test-Path $msbuildExe) { return $msbuildExe }
  23. }
  24. # helper to try to locate a single version
  25. function Locate-MSBuild-Version([string]$version) {
  26. $msbuildTemplate = "{0}\msbuild\{1}\Bin\{2}\msbuild.exe"
  27. $msbuildUnscoped = "{0}\msbuild\{1}\Bin\msbuild.exe"
  28. $msbuildExe = $msbuildTemplate -f "${Env:ProgramFiles}", $version, "x86"
  29. $_ = WriteMessage "Trying `"$msbuildExe`""
  30. if (Test-Path $msbuildExe) { return $msbuildExe }
  31. $msbuildExe = $msbuildUnscoped -f "${Env:ProgramFiles(x86)}", $version
  32. $_ = WriteMessage "Trying `"$msbuildExe`""
  33. if (Test-Path $msbuildExe) { return $msbuildExe }
  34. $msbuildExe = $msbuildTemplate -f "${Env:ProgramFiles(x86)}", $version, "amd64"
  35. $_ = WriteMessage "Trying `"$msbuildExe`""
  36. if (Test-Path $msbuildExe) { return $msbuildExe }
  37. return "" # didn't find it so return empty string
  38. }
  39. function Locate-MSBuild() {
  40. $msbuildExe = "msbuild.exe"
  41. if (Get-Command $msbuildExe -ErrorAction SilentlyContinue) { return $msbuildExe }
  42. $_ = WriteMessage "msbuild.exe not found on PATH, trying Dev15..."
  43. $msbuildExe = Locate-MSBuild-Modern-Version -product "Enterprise" -version "15.0"
  44. if ($msbuildExe -and (Test-Path $msbuildExe)) {
  45. $_ = WriteMessage "Found `"$msbuildExe`""
  46. return $msbuildExe
  47. }
  48. $_ = WriteMessage "Dev15 not found, trying Dev14..."
  49. $msbuildExe = Locate-MSBuild-Version("14.0")
  50. if ($msbuildExe -and (Test-Path $msbuildExe)) {
  51. $_ = WriteMessage "Found `"$msbuildExe`""
  52. return $msbuildExe
  53. }
  54. $_ = WriteMessage "Dev14 not found, trying Dev12..."
  55. $msbuildExe = Locate-MSBuild-Version("12.0")
  56. if ($msbuildExe -and (Test-Path $msbuildExe)) {
  57. $_ = WriteMessage "Found `"$msbuildExe`""
  58. return $msbuildExe
  59. }
  60. WriteErrorMessage "Can't find msbuild.exe."
  61. return "" # return empty string
  62. }