Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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/ADT/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.
  94. // This is the preferred way to discover new Visual Studios, as they're no
  95. // longer listed in the registry.
  96. bool findVCToolChainViaSetupConfig(vfs::FileSystem &VFS, std::string &Path,
  97.                                    ToolsetLayout &VSLayout);
  98.  
  99. // Look in the registry for Visual Studio installs, and use that to get
  100. // a toolchain path. VS2017 and newer don't get added to the registry.
  101. // So if we find something here, we know that it's an older version.
  102. bool findVCToolChainViaRegistry(std::string &Path, ToolsetLayout &VSLayout);
  103.  
  104. } // namespace llvm
  105.  
  106. #endif
  107.