cmake/Source/cmCxxModuleMetadata.h
Vito Gamberini ce309f8885
cmDyndepCollation: Cxx module manifest format
Support the module manifest format added in !11422 as an output format
of dyndep collation for exports. This is necessary for CPS support of
modules, as CPS uses module manifests to describe C++20 modules.

Additionally, adds some CMake-vendor fields to the module manifest to
support compile-options and compile-features on module sources.
2026-01-22 00:59:43 -05:00

102 lines
2.8 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 <vector>
#include <cm/optional>
#include <cm/string_view>
#include <cm3p/json/value.h>
class cmTarget;
class cmCxxModuleMetadata
{
public:
struct PreprocessorDefineData
{
// definition["name"]
std::string Name;
// definition["value"]
cm::optional<std::string> Value;
// definition["undef"]
bool Undef = false;
};
struct LocalArgumentsData
{
// local-arguments["include-directories"]
std::vector<std::string> IncludeDirectories;
// local-arguments["system-include-directories"]
std::vector<std::string> SystemIncludeDirectories;
// local-arguments["definitions"]
std::vector<PreprocessorDefineData> Definitions;
// These are CMake vendor extensions
// local-arguments["vendor"]["cmake"]["compile-options"]
std::vector<std::string> CompileOptions;
// local-arguments["vendor"]["cmake"]["compile-features"]
std::vector<std::string> CompileFeatures;
};
struct ModuleData
{
// module["logical-name"]
std::string LogicalName;
// module["source-path"]
std::string SourcePath;
// module["is-interface"]
bool IsInterface = true;
// module["is-std-library"]
bool IsStdLibrary = false;
// module["local-arguments"]
cm::optional<LocalArgumentsData> LocalArguments;
};
// root["version"]
int Version = 1;
// root["revision"]
int Revision = 1;
// root["modules"]
std::vector<ModuleData> Modules;
// The path to the manifest file, either absolute or relative to the
// installation root
std::string MetadataFilePath;
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); }
};