1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#pragma once
#include "cmConfigure.h" // IWYU pragma: keep
#include <iosfwd>
#include <map>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include "cmPropertyMap.h"
#include "cmStateTypes.h"
#include "cmValue.h"
class cmMessenger;
/** \class cmCacheManager
* \brief Control class for cmake's cache
*
* Load and Save CMake cache files.
*
*/
class cmCacheManager
{
class CacheEntry
{
friend class cmCacheManager;
public:
std::string const& GetValue() const { return this->Value; }
void SetValue(cmValue);
cmStateEnums::CacheEntryType GetType() const { return this->Type; }
void SetType(cmStateEnums::CacheEntryType ty) { this->Type = ty; }
std::vector<std::string> GetPropertyList() const;
cmValue GetProperty(std::string const& property) const;
bool GetPropertyAsBool(std::string const& property) const;
void SetProperty(std::string const& property, std::string const& value);
void SetProperty(std::string const& property, bool value);
void RemoveProperty(std::string const& property);
void AppendProperty(std::string const& property, std::string const& value,
bool asString = false);
private:
std::string Value;
cmStateEnums::CacheEntryType Type = cmStateEnums::UNINITIALIZED;
cmPropertyMap Properties;
bool Initialized = false;
};
public:
//! Load a cache for given makefile. Loads from path/CMakeCache.txt.
bool LoadCache(std::string const& path, bool internal,
std::set<std::string>& excludes,
std::set<std::string>& includes);
//! Save cache for given makefile. Saves to output path/CMakeCache.txt
bool SaveCache(std::string const& path, cmMessenger* messenger);
//! Delete the cache given
bool DeleteCache(std::string const& path);
//! Print the cache to a stream
void PrintCache(std::ostream&) const;
//! Get whether or not cache is loaded
bool IsCacheLoaded() const { return this->CacheLoaded; }
//! Get a value from the cache given a key
cmValue GetInitializedCacheValue(std::string const& key) const;
cmValue GetCacheEntryValue(std::string const& key) const
{
if (auto const* entry = this->GetCacheEntry(key)) {
return cmValue(entry->GetValue());
}
return nullptr;
}
void SetCacheEntryValue(std::string const& key, std::string const& value)
{
if (auto* entry = this->GetCacheEntry(key)) {
entry->SetValue(cmValue(value));
}
}
cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key) const
{
if (auto const* entry = this->GetCacheEntry(key)) {
return entry->GetType();
}
return cmStateEnums::UNINITIALIZED;
}
std::vector<std::string> GetCacheEntryPropertyList(
std::string const& key) const
{
if (auto const* entry = this->GetCacheEntry(key)) {
return entry->GetPropertyList();
}
return {};
}
cmValue GetCacheEntryProperty(std::string const& key,
std::string const& propName) const
{
if (auto const* entry = this->GetCacheEntry(key)) {
return entry->GetProperty(propName);
}
return nullptr;
}
bool GetCacheEntryPropertyAsBool(std::string const& key,
std::string const& propName) const
{
if (auto const* entry = this->GetCacheEntry(key)) {
return entry->GetPropertyAsBool(propName);
}
return false;
}
void SetCacheEntryProperty(std::string const& key,
std::string const& propName,
std::string const& value)
{
if (auto* entry = this->GetCacheEntry(key)) {
entry->SetProperty(propName, value);
}
}
void SetCacheEntryBoolProperty(std::string const& key,
std::string const& propName, bool value)
{
if (auto* entry = this->GetCacheEntry(key)) {
entry->SetProperty(propName, value);
}
}
void RemoveCacheEntryProperty(std::string const& key,
std::string const& propName)
{
if (auto* entry = this->GetCacheEntry(key)) {
entry->RemoveProperty(propName);
}
}
void AppendCacheEntryProperty(std::string const& key,
std::string const& propName,
std::string const& value,
bool asString = false)
{
if (auto* entry = this->GetCacheEntry(key)) {
entry->AppendProperty(propName, value, asString);
}
}
std::vector<std::string> GetCacheEntryKeys() const
{
std::vector<std::string> definitions;
definitions.reserve(this->Cache.size());
for (auto const& i : this->Cache) {
definitions.push_back(i.first);
}
return definitions;
}
/** Get the version of CMake that wrote the cache. */
unsigned int GetCacheMajorVersion() const { return this->CacheMajorVersion; }
unsigned int GetCacheMinorVersion() const { return this->CacheMinorVersion; }
//! Add an entry into the cache
void AddCacheEntry(std::string const& key, std::string const& value,
std::string const& helpString,
cmStateEnums::CacheEntryType type)
{
this->AddCacheEntry(key, cmValue{ value }, cmValue{ helpString }, type);
}
void AddCacheEntry(std::string const& key, cmValue value,
std::string const& helpString,
cmStateEnums::CacheEntryType type)
{
this->AddCacheEntry(key, value, cmValue{ helpString }, type);
}
void AddCacheEntry(std::string const& key, cmValue value, cmValue helpString,
cmStateEnums::CacheEntryType type);
//! Remove an entry from the cache
void RemoveCacheEntry(std::string const& key);
private:
//! Get a cache entry object for a key
CacheEntry* GetCacheEntry(std::string const& key);
CacheEntry const* GetCacheEntry(std::string const& key) const;
//! Clean out the CMakeFiles directory if no CMakeCache.txt
void CleanCMakeFiles(std::string const& path);
static void OutputHelpString(std::ostream& fout,
std::string const& helpString);
static void OutputWarningComment(std::ostream& fout,
std::string const& message,
bool wrapSpaces);
static void OutputNewlineTruncationWarning(std::ostream& fout,
std::string const& key,
std::string const& value,
cmMessenger* messenger);
static void OutputKey(std::ostream& fout, std::string const& key);
static void OutputValue(std::ostream& fout, std::string const& value);
static void OutputValueNoNewlines(std::ostream& fout,
std::string const& value);
static char const* PersistentProperties[];
bool ReadPropertyEntry(std::string const& key, CacheEntry const& e);
void WritePropertyEntries(std::ostream& os, std::string const& entryKey,
CacheEntry const& e, cmMessenger* messenger) const;
std::map<std::string, CacheEntry> Cache;
bool CacheLoaded = false;
// Cache version info
unsigned int CacheMajorVersion = 0;
unsigned int CacheMinorVersion = 0;
};
|