/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file LICENSE.rst or https://cmake.org/licensing for details. */ #pragma once #include #include #include #include #include class cmTarget; class cmCxxModuleMetadata { public: struct PreprocessorDefineData { // definition["name"] std::string Name; // definition["value"] cm::optional Value; // definition["undef"] bool Undef = false; }; struct LocalArgumentsData { // local-arguments["include-directories"] std::vector IncludeDirectories; // local-arguments["system-include-directories"] std::vector SystemIncludeDirectories; // local-arguments["definitions"] std::vector Definitions; // These are CMake vendor extensions // local-arguments["vendor"]["cmake"]["compile-options"] std::vector CompileOptions; // local-arguments["vendor"]["cmake"]["compile-features"] std::vector 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 LocalArguments; }; // root["version"] int Version = 1; // root["revision"] int Revision = 1; // root["modules"] std::vector 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 const& configs); static void PopulateTarget(cmTarget& target, cmCxxModuleMetadata const& meta, cm::string_view config) { PopulateTarget(target, meta, std::vector{ std::string(config) }); } static void PopulateTarget(cmTarget& target, cmCxxModuleMetadata const& meta) { PopulateTarget(target, meta, "NOCONFIG"); } }; struct cmCxxModuleMetadata::ParseResult { cm::optional Meta; std::string Error; explicit operator bool() const { return static_cast(Meta); } };