CMake/Source/cmCacheManager.h
Kitware Robot bdca8b01d2 Modernize: Use #pragma once in all header files
#pragma once is a widely supported compiler pragma, even though it is
not part of the C++ standard. Many of the issues keeping #pragma once
from being standardized (distributed filesystems, build farms, hard
links, etc.) do not apply to CMake - it is easy to build CMake on a
single machine. CMake also does not install any header files which can
be consumed by other projects (though cmCPluginAPI.h has been
deliberately omitted from this conversion in case anyone is still using
it.) Finally, #pragma once has been required to build CMake since at
least August 2017 (7f29bbe6 enabled server mode unconditionally, which
had been using #pragma once since September 2016 (b13d3e0d)). The fact
that we now require C++11 filters out old compilers, and it is unlikely
that there is a compiler which supports C++11 but does not support
#pragma once.
2020-09-03 09:30:21 -04:00

212 lines
6.6 KiB
C++

/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt 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 "cmProperty.h"
#include "cmPropertyMap.h"
#include "cmStateTypes.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:
const std::string& GetValue() const { return this->Value; }
void SetValue(const char*);
cmStateEnums::CacheEntryType GetType() const { return this->Type; }
void SetType(cmStateEnums::CacheEntryType ty) { this->Type = ty; }
std::vector<std::string> GetPropertyList() const;
cmProp GetProperty(const std::string& property) const;
bool GetPropertyAsBool(const std::string& property) const;
void SetProperty(const std::string& property, const char* value);
void SetProperty(const std::string& property, bool value);
void AppendProperty(const std::string& property, const std::string& 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(const std::string& 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(const std::string& path, cmMessenger* messenger);
//! Delete the cache given
bool DeleteCache(const std::string& path);
//! Print the cache to a stream
void PrintCache(std::ostream&) const;
//! Get a value from the cache given a key
cmProp GetInitializedCacheValue(const std::string& key) const;
cmProp GetCacheEntryValue(const std::string& key) const
{
if (auto entry = this->GetCacheEntry(key)) {
return &entry->GetValue();
}
return nullptr;
}
void SetCacheEntryValue(std::string const& key, std::string const& value)
{
if (auto entry = this->GetCacheEntry(key)) {
entry->SetValue(value.c_str());
}
}
cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key) const
{
if (auto entry = this->GetCacheEntry(key)) {
return entry->GetType();
}
return cmStateEnums::UNINITIALIZED;
}
std::vector<std::string> GetCacheEntryPropertyList(
std::string const& key) const
{
if (auto entry = this->GetCacheEntry(key)) {
return entry->GetPropertyList();
}
return {};
}
cmProp GetCacheEntryProperty(std::string const& key,
std::string const& propName) const
{
if (auto entry = this->GetCacheEntry(key)) {
return entry->GetProperty(propName);
}
return nullptr;
}
bool GetCacheEntryPropertyAsBool(std::string const& key,
std::string const& propName) const
{
if (auto 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.c_str());
}
}
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->SetProperty(propName, nullptr);
}
}
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(const std::string& key, const char* value,
const char* helpString,
cmStateEnums::CacheEntryType type);
//! Remove an entry from the cache
void RemoveCacheEntry(const std::string& key);
private:
//! Get a cache entry object for a key
CacheEntry* GetCacheEntry(const std::string& key);
const CacheEntry* GetCacheEntry(const std::string& key) const;
//! Clean out the CMakeFiles directory if no CMakeCache.txt
void CleanCMakeFiles(const std::string& path);
static void OutputHelpString(std::ostream& fout,
const std::string& 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 const char* PersistentProperties[];
bool ReadPropertyEntry(const std::string& key, const CacheEntry& e);
void WritePropertyEntries(std::ostream& os, const std::string& entryKey,
const CacheEntry& e, cmMessenger* messenger) const;
std::map<std::string, CacheEntry> Cache;
// Cache version info
unsigned int CacheMajorVersion = 0;
unsigned int CacheMinorVersion = 0;
};