123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===-- 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/ADT/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.
- // 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::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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|