1 //===-- MSVCPaths.h - MSVC path-parsing helpers -----------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_WINDOWSDRIVER_MSVCPATHS_H 10 #define LLVM_WINDOWSDRIVER_MSVCPATHS_H 11 12 #include "llvm/ADT/SmallString.h" 13 #include "llvm/ADT/StringRef.h" 14 #include "llvm/TargetParser/Triple.h" 15 #include <optional> 16 #include <string> 17 18 namespace llvm { 19 20 namespace vfs { 21 class FileSystem; 22 } 23 24 enum class SubDirectoryType { 25 Bin, 26 Include, 27 Lib, 28 }; 29 30 enum class ToolsetLayout { 31 OlderVS, 32 VS2017OrNewer, 33 DevDivInternal, 34 }; 35 36 // Windows SDKs and VC Toolchains group their contents into subdirectories based 37 // on the target architecture. This function converts an llvm::Triple::ArchType 38 // to the corresponding subdirectory name. 39 const char *archToWindowsSDKArch(llvm::Triple::ArchType Arch); 40 41 // Similar to the above function, but for Visual Studios before VS2017. 42 const char *archToLegacyVCArch(llvm::Triple::ArchType Arch); 43 44 // Similar to the above function, but for DevDiv internal builds. 45 const char *archToDevDivInternalArch(llvm::Triple::ArchType Arch); 46 47 bool appendArchToWindowsSDKLibPath(int SDKMajor, llvm::SmallString<128> LibPath, 48 llvm::Triple::ArchType Arch, 49 std::string &path); 50 51 // Get the path to a specific subdirectory in the current toolchain for 52 // a given target architecture. 53 // VS2017 changed the VC toolchain layout, so this should be used instead 54 // of hardcoding paths. 55 std::string getSubDirectoryPath(SubDirectoryType Type, ToolsetLayout VSLayout, 56 const std::string &VCToolChainPath, 57 llvm::Triple::ArchType TargetArch, 58 llvm::StringRef SubdirParent = ""); 59 60 // Check if the Include path of a specified version of Visual Studio contains 61 // specific header files. If not, they are probably shipped with Universal CRT. 62 bool useUniversalCRT(ToolsetLayout VSLayout, const std::string &VCToolChainPath, 63 llvm::Triple::ArchType TargetArch, 64 llvm::vfs::FileSystem &VFS); 65 66 /// Get Windows SDK installation directory. 67 bool getWindowsSDKDir(vfs::FileSystem &VFS, 68 std::optional<llvm::StringRef> WinSdkDir, 69 std::optional<llvm::StringRef> WinSdkVersion, 70 std::optional<llvm::StringRef> WinSysRoot, 71 std::string &Path, int &Major, 72 std::string &WindowsSDKIncludeVersion, 73 std::string &WindowsSDKLibVersion); 74 75 bool getUniversalCRTSdkDir(vfs::FileSystem &VFS, 76 std::optional<llvm::StringRef> WinSdkDir, 77 std::optional<llvm::StringRef> WinSdkVersion, 78 std::optional<llvm::StringRef> WinSysRoot, 79 std::string &Path, std::string &UCRTVersion); 80 81 // Check command line arguments to try and find a toolchain. 82 bool findVCToolChainViaCommandLine( 83 vfs::FileSystem &VFS, std::optional<llvm::StringRef> VCToolsDir, 84 std::optional<llvm::StringRef> VCToolsVersion, 85 std::optional<llvm::StringRef> WinSysRoot, std::string &Path, 86 ToolsetLayout &VSLayout); 87 88 // Check various environment variables to try and find a toolchain. 89 bool findVCToolChainViaEnvironment(vfs::FileSystem &VFS, std::string &Path, 90 ToolsetLayout &VSLayout); 91 92 // Query the Setup Config server for installs, then pick the newest version 93 // and find its default VC toolchain. If `VCToolsVersion` is specified, that 94 // version is preferred over the latest version. 95 // 96 // This is the preferred way to discover new Visual Studios, as they're no 97 // longer listed in the registry. 98 bool 99 findVCToolChainViaSetupConfig(vfs::FileSystem &VFS, 100 std::optional<llvm::StringRef> VCToolsVersion, 101 std::string &Path, ToolsetLayout &VSLayout); 102 103 // Look in the registry for Visual Studio installs, and use that to get 104 // a toolchain path. VS2017 and newer don't get added to the registry. 105 // So if we find something here, we know that it's an older version. 106 bool findVCToolChainViaRegistry(std::string &Path, ToolsetLayout &VSLayout); 107 108 } // namespace llvm 109 110 #endif 111