mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-01-30 12:54:19 +00:00
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.
102 lines
2.8 KiB
C++
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); }
|
|
};
|