//===-- 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_SUPPORT_MSVCPATHS_H
#define LLVM_SUPPORT_MSVCPATHS_H

#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Triple.h"
#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,
                      llvm::Optional<llvm::StringRef> WinSdkDir,
                      llvm::Optional<llvm::StringRef> WinSdkVersion,
                      llvm::Optional<llvm::StringRef> WinSysRoot,
                      std::string &Path, int &Major,
                      std::string &WindowsSDKIncludeVersion,
                      std::string &WindowsSDKLibVersion);

bool getUniversalCRTSdkDir(vfs::FileSystem &VFS,
                           llvm::Optional<llvm::StringRef> WinSdkDir,
                           llvm::Optional<llvm::StringRef> WinSdkVersion,
                           llvm::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, llvm::Optional<llvm::StringRef> VCToolsDir,
    llvm::Optional<llvm::StringRef> VCToolsVersion,
    llvm::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
