blob: 2df94a7be7c9b6194c7348fafc6ca60e0b44a4ff [file] [log] [blame] [edit]
/* 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); }
};