Files
CMake/Source/cmCxxModuleMetadata.h
Vito Gamberini fa10dc6c22 Experimental/CXXModules: Implement EcoStd Module Metadata parser
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.
2025-11-18 11:39:59 -05:00

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); }
};