Viewing file: MSVCPaths.h (4.4 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===-- MSVCPaths.h - MSVC path-parsing helpers -----------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===//
#ifndef LLVM_WINDOWSDRIVER_MSVCPATHS_H #define LLVM_WINDOWSDRIVER_MSVCPATHS_H
#include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" #include "llvm/TargetParser/Triple.h" #include <optional> #include <string>
namespace llvm {
namespace vfs { class FileSystem; }
enum class SubDirectoryType { Bin, Include, Lib, };
enum class ToolsetLayout { OlderVS, VS2017OrNewer, DevDivInternal, };
// Windows SDKs and VC Toolchains group their contents into subdirectories based // on the target architecture. This function converts an llvm::Triple::ArchType // to the corresponding subdirectory name. const char *archToWindowsSDKArch(llvm::Triple::ArchType Arch);
// Similar to the above function, but for Visual Studios before VS2017. const char *archToLegacyVCArch(llvm::Triple::ArchType Arch);
// Similar to the above function, but for DevDiv internal builds. const char *archToDevDivInternalArch(llvm::Triple::ArchType Arch);
bool appendArchToWindowsSDKLibPath(int SDKMajor, llvm::SmallString<128> LibPath, llvm::Triple::ArchType Arch, std::string &path);
// Get the path to a specific subdirectory in the current toolchain for // a given target architecture. // VS2017 changed the VC toolchain layout, so this should be used instead // of hardcoding paths. std::string getSubDirectoryPath(SubDirectoryType Type, ToolsetLayout VSLayout, const std::string &VCToolChainPath, llvm::Triple::ArchType TargetArch, llvm::StringRef SubdirParent = "");
// Check if the Include path of a specified version of Visual Studio contains // specific header files. If not, they are probably shipped with Universal CRT. bool useUniversalCRT(ToolsetLayout VSLayout, const std::string &VCToolChainPath, llvm::Triple::ArchType TargetArch, llvm::vfs::FileSystem &VFS);
/// Get Windows SDK installation directory. bool getWindowsSDKDir(vfs::FileSystem &VFS, std::optional<llvm::StringRef> WinSdkDir, std::optional<llvm::StringRef> WinSdkVersion, std::optional<llvm::StringRef> WinSysRoot, std::string &Path, int &Major, std::string &WindowsSDKIncludeVersion, std::string &WindowsSDKLibVersion);
bool getUniversalCRTSdkDir(vfs::FileSystem &VFS, std::optional<llvm::StringRef> WinSdkDir, std::optional<llvm::StringRef> WinSdkVersion, std::optional<llvm::StringRef> WinSysRoot, std::string &Path, std::string &UCRTVersion);
// Check command line arguments to try and find a toolchain. bool findVCToolChainViaCommandLine( vfs::FileSystem &VFS, std::optional<llvm::StringRef> VCToolsDir, std::optional<llvm::StringRef> VCToolsVersion, std::optional<llvm::StringRef> WinSysRoot, std::string &Path, ToolsetLayout &VSLayout);
// Check various environment variables to try and find a toolchain. bool findVCToolChainViaEnvironment(vfs::FileSystem &VFS, std::string &Path, ToolsetLayout &VSLayout);
// Query the Setup Config server for installs, then pick the newest version // and find its default VC toolchain. If `VCToolsVersion` is specified, that // version is preferred over the latest version. // // This is the preferred way to discover new Visual Studios, as they're no // longer listed in the registry. bool findVCToolChainViaSetupConfig(vfs::FileSystem &VFS, std::optional<llvm::StringRef> VCToolsVersion, std::string &Path, ToolsetLayout &VSLayout);
// Look in the registry for Visual Studio installs, and use that to get // a toolchain path. VS2017 and newer don't get added to the registry. // So if we find something here, we know that it's an older version. bool findVCToolChainViaRegistry(std::string &Path, ToolsetLayout &VSLayout);
} // namespace llvm
#endif
|