mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 02:08:27 +08:00

Refactoring in commit 3882718872
(VS: Decouple solution generation from
`.sln` file format, 2025-09-15) accidentally left out automatic
detection of the external project type id from its file extension.
179 lines
5.2 KiB
C++
179 lines
5.2 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <map>
|
|
#include <set>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <cm/memory>
|
|
#include <cm/optional>
|
|
#include <cm/string_view>
|
|
|
|
#include "cmVSVersion.h"
|
|
|
|
namespace cm {
|
|
namespace VS {
|
|
|
|
/** Represent a Visual Studio Solution.
|
|
In VS terminology, a "project" corresponds to a CMake "target". */
|
|
struct Solution final
|
|
{
|
|
Solution() = default;
|
|
Solution(Solution&&) = default;
|
|
Solution& operator=(Solution&&) = default;
|
|
|
|
/** Represent how a project behaves under one solution config. */
|
|
struct ProjectConfig final
|
|
{
|
|
/** Project-specific config corresponding to this solution config.
|
|
This is usually the same as the solution config, but it can map
|
|
to another config in some cases. */
|
|
std::string Config;
|
|
|
|
/** Does the project build under this solution config? */
|
|
bool Build = false;
|
|
|
|
/** Does the project deploy under this solution config? */
|
|
bool Deploy = false;
|
|
};
|
|
|
|
/** Represent one project in a Solution.
|
|
This corresponds to one CMake "target". */
|
|
struct Project final
|
|
{
|
|
/** Project name. This corresponds to the CMake "target" name. */
|
|
std::string Name;
|
|
|
|
/** Project GUID. */
|
|
std::string Id;
|
|
|
|
/** Project type GUID. */
|
|
std::string TypeId;
|
|
|
|
/** Path to the project file on disk.
|
|
This is either absolute or relative to the Solution file. */
|
|
std::string Path;
|
|
|
|
/** Project-specific platform. This is usually the same as the
|
|
Solution::Platform, but it can be different in some cases. */
|
|
std::string Platform;
|
|
|
|
/** Project-specific configuration corresponding to each solution config.
|
|
This vector has the same length as the Solution::Configs vector. */
|
|
std::vector<ProjectConfig> Configs;
|
|
|
|
/** Solution-level dependencies of the project on other projects. */
|
|
std::vector<Project const*> BuildDependencies;
|
|
|
|
// Project type GUIDs used during creation.
|
|
static cm::string_view const TypeIdCSharp;
|
|
static cm::string_view const TypeIdDatabase;
|
|
static cm::string_view const TypeIdDefault;
|
|
static cm::string_view const TypeIdFSharp;
|
|
static cm::string_view const TypeIdFortran;
|
|
static cm::string_view const TypeIdPython;
|
|
static cm::string_view const TypeIdVDProj;
|
|
static cm::string_view const TypeIdVisualBasic;
|
|
static cm::string_view const TypeIdWiX;
|
|
};
|
|
|
|
/** Represent one folder in a Solution. */
|
|
struct Folder final
|
|
{
|
|
/** Canonical folder name. This includes parent folders separated by
|
|
forward slashes. */
|
|
std::string Name;
|
|
|
|
/** Folder GUID. */
|
|
std::string Id;
|
|
|
|
/** List of folders contained inside this folder. */
|
|
std::vector<Folder const*> Folders;
|
|
|
|
/** List of projects contained inside this folder. */
|
|
std::vector<Project const*> Projects;
|
|
|
|
/** Solution-level files contained inside this folder. */
|
|
std::set<std::string> Files;
|
|
|
|
// Folder type GUID.
|
|
static cm::string_view const TypeId;
|
|
};
|
|
|
|
/** Represent a group of solution-level Properties. */
|
|
struct PropertyGroup final
|
|
{
|
|
enum class Load
|
|
{
|
|
Pre,
|
|
Post,
|
|
};
|
|
|
|
/** Properties group name. */
|
|
std::string Name;
|
|
|
|
/** Properties group load behavior. */
|
|
Load Scope = Load::Post;
|
|
|
|
/** Property key-value pairs in the group. */
|
|
std::map<std::string, std::string> Map;
|
|
};
|
|
|
|
/** Visual Studio major version number, if known. */
|
|
cm::optional<Version> VSVersion;
|
|
|
|
/** Whether this is a VS Express edition, if known. */
|
|
cm::optional<VersionExpress> VSExpress;
|
|
|
|
/** Solution-wide target platform. This is a Windows architecture. */
|
|
std::string Platform;
|
|
|
|
/** Solution-wide build configurations.
|
|
This corresponds to CMAKE_CONFIGURATION_TYPES. */
|
|
std::vector<std::string> Configs;
|
|
|
|
/** List of all folders in the solution. */
|
|
std::vector<Folder const*> Folders;
|
|
|
|
/** List of projects in the solution that are not in folders. */
|
|
std::vector<Project const*> Projects;
|
|
|
|
/** List of solution-level property groups. */
|
|
std::vector<PropertyGroup const*> PropertyGroups;
|
|
|
|
/** Name of the default startup project. */
|
|
std::string StartupProject;
|
|
|
|
/** Get all projects in the solution, including all folders. */
|
|
std::vector<Project const*> GetAllProjects() const;
|
|
|
|
// Non-const methods used during creation.
|
|
Folder* GetFolder(cm::string_view name);
|
|
Project* GetProject(cm::string_view name);
|
|
PropertyGroup* GetPropertyGroup(cm::string_view name);
|
|
void CanonicalizeOrder();
|
|
|
|
private:
|
|
Solution(Solution const&) = delete;
|
|
Solution& operator=(Solution const&) = delete;
|
|
|
|
// Own and index named entities.
|
|
// The string_view keys point at the Name members.
|
|
std::map<cm::string_view, std::unique_ptr<Folder>> FolderMap;
|
|
std::map<cm::string_view, std::unique_ptr<Project>> ProjectMap;
|
|
std::map<cm::string_view, std::unique_ptr<PropertyGroup>> PropertyGroupMap;
|
|
};
|
|
|
|
/** Write the .sln-format representation. */
|
|
void WriteSln(std::ostream& sln, Solution const& solution);
|
|
|
|
/** Write the .slnx-format representation. */
|
|
void WriteSlnx(std::ostream& slnx, Solution const& solution);
|
|
|
|
}
|
|
}
|