mirror of
https://github.com/Kitware/CMake.git
synced 2025-12-31 10:50:16 -06:00
Adds a parser and serializer for the EcoStd Module Metadata format RFC: https://github.com/ecostd/rfcs/pull/3 This adapts the existing experimental support for import std; to use the new parser. The CMAKE_CXX_STDLIB_MODULES_JSON is now the canonical variable for controlling how CMake discovers the stdlib module metadata, and is used directly by compiler detection. Toolchains can still override the __CMAKE::CXX## targets if they wish, either in conjunction with CMAKE_CXX_STDLIB_MODULE_JSON or not. It is possible to disable automatic detection of CMAKE_CXX_STDLIB_MODULE_JSON by setting it to the empty string. When available, the CMAKE_CXX_STDLIB_MODULE_JSON will be used to create all requested C++ stdlibs which do not already have targets.
85 lines
2.2 KiB
C++
85 lines
2.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 <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include <cm/optional>
|
|
#include <cm/string_view>
|
|
|
|
#include <cm3p/json/value.h>
|
|
|
|
class cmTarget;
|
|
|
|
class cmCxxModuleMetadata
|
|
{
|
|
public:
|
|
struct PreprocessorDefineData
|
|
{
|
|
std::string Name;
|
|
cm::optional<std::string> Value;
|
|
bool Undef = false;
|
|
cm::optional<Json::Value> Vendor;
|
|
};
|
|
|
|
struct LocalArgumentsData
|
|
{
|
|
std::vector<std::string> IncludeDirectories;
|
|
std::vector<std::string> SystemIncludeDirectories;
|
|
std::vector<PreprocessorDefineData> Definitions;
|
|
cm::optional<Json::Value> Vendor;
|
|
};
|
|
|
|
struct ModuleData
|
|
{
|
|
std::string LogicalName;
|
|
std::string SourcePath;
|
|
bool IsInterface = true;
|
|
bool IsStdLibrary = false;
|
|
cm::optional<LocalArgumentsData> LocalArguments;
|
|
cm::optional<Json::Value> Vendor;
|
|
};
|
|
|
|
int Version = 0;
|
|
int Revision = 0;
|
|
std::vector<ModuleData> Modules;
|
|
std::string MetadataFilePath;
|
|
|
|
std::unordered_map<std::string, Json::Value> Extensions;
|
|
|
|
struct ParseResult;
|
|
|
|
struct SaveResult
|
|
{
|
|
bool Ok = false;
|
|
std::string Error;
|
|
explicit operator bool() const { return Ok; }
|
|
};
|
|
|
|
static ParseResult LoadFromFile(std::string const& path);
|
|
static Json::Value ToJsonValue(cmCxxModuleMetadata const& meta);
|
|
static SaveResult SaveToFile(std::string const& path,
|
|
cmCxxModuleMetadata const& meta);
|
|
static void PopulateTarget(cmTarget& target, cmCxxModuleMetadata const& meta,
|
|
std::vector<std::string> const& configs);
|
|
static void PopulateTarget(cmTarget& target, cmCxxModuleMetadata const& meta,
|
|
cm::string_view config)
|
|
{
|
|
PopulateTarget(target, meta,
|
|
std::vector<std::string>{ std::string(config) });
|
|
}
|
|
static void PopulateTarget(cmTarget& target, cmCxxModuleMetadata const& meta)
|
|
{
|
|
PopulateTarget(target, meta, "NOCONFIG");
|
|
}
|
|
};
|
|
|
|
struct cmCxxModuleMetadata::ParseResult
|
|
{
|
|
cm::optional<cmCxxModuleMetadata> Meta;
|
|
std::string Error;
|
|
explicit operator bool() const { return static_cast<bool>(Meta); }
|
|
};
|