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 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
|
/* 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 <functional>
#include <memory>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
#include <cm/optional>
#include "cmDefinitions.h"
#include "cmDependencyProvider.h"
#include "cmLinkedTree.h"
#include "cmPolicies.h"
#include "cmProperty.h"
#include "cmPropertyDefinition.h"
#include "cmPropertyMap.h"
#include "cmStatePrivate.h"
#include "cmStateTypes.h"
#include "cmValue.h"
class cmCacheManager;
class cmGlobVerificationManager;
class cmMakefile;
class cmStateSnapshot;
class cmMessenger;
class cmExecutionStatus;
class cmListFileBacktrace;
struct cmGlobCacheEntry;
struct cmListFileArgument;
template <typename T>
class BT;
class cmState
{
friend class cmStateSnapshot;
public:
enum Mode
{
Unknown,
Project,
Script,
FindPackage,
CTest,
CPack,
Help
};
enum class ProjectKind
{
Normal,
TryCompile,
};
cmState(Mode mode, ProjectKind projectKind = ProjectKind::Normal);
~cmState();
cmState(cmState const&) = delete;
cmState& operator=(cmState const&) = delete;
static std::string const& GetTargetTypeName(
cmStateEnums::TargetType targetType);
cmStateSnapshot CreateBaseSnapshot();
cmStateSnapshot CreateBuildsystemDirectorySnapshot(
cmStateSnapshot const& originSnapshot);
cmStateSnapshot CreateDeferCallSnapshot(
cmStateSnapshot const& originSnapshot, std::string const& fileName);
cmStateSnapshot CreateFunctionCallSnapshot(
cmStateSnapshot const& originSnapshot, std::string const& fileName);
cmStateSnapshot CreateMacroCallSnapshot(
cmStateSnapshot const& originSnapshot, std::string const& fileName);
cmStateSnapshot CreateIncludeFileSnapshot(
cmStateSnapshot const& originSnapshot, std::string const& fileName);
cmStateSnapshot CreateVariableScopeSnapshot(
cmStateSnapshot const& originSnapshot);
cmStateSnapshot CreateInlineListFileSnapshot(
cmStateSnapshot const& originSnapshot, std::string const& fileName);
cmStateSnapshot CreatePolicyScopeSnapshot(
cmStateSnapshot const& originSnapshot);
cmStateSnapshot Pop(cmStateSnapshot const& originSnapshot);
static cmStateEnums::CacheEntryType StringToCacheEntryType(
std::string const&);
static bool StringToCacheEntryType(std::string const&,
cmStateEnums::CacheEntryType& type);
static std::string const& CacheEntryTypeToString(
cmStateEnums::CacheEntryType);
static bool IsCacheEntryType(std::string const& key);
bool LoadCache(std::string const& path, bool internal,
std::set<std::string>& excludes,
std::set<std::string>& includes);
bool SaveCache(std::string const& path, cmMessenger* messenger);
bool DeleteCache(std::string const& path);
bool IsCacheLoaded() const;
std::vector<std::string> GetCacheEntryKeys() const;
cmValue GetCacheEntryValue(std::string const& key) const;
std::string GetSafeCacheEntryValue(std::string const& key) const;
cmValue GetInitializedCacheValue(std::string const& key) const;
cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key) const;
void SetCacheEntryValue(std::string const& key, std::string const& value);
void RemoveCacheEntry(std::string const& key);
void SetCacheEntryProperty(std::string const& key,
std::string const& propertyName,
std::string const& value);
void SetCacheEntryBoolProperty(std::string const& key,
std::string const& propertyName, bool value);
std::vector<std::string> GetCacheEntryPropertyList(std::string const& key);
cmValue GetCacheEntryProperty(std::string const& key,
std::string const& propertyName);
bool GetCacheEntryPropertyAsBool(std::string const& key,
std::string const& propertyName);
void AppendCacheEntryProperty(std::string const& key,
std::string const& property,
std::string const& value,
bool asString = false);
void RemoveCacheEntryProperty(std::string const& key,
std::string const& propertyName);
//! Break up a line like VAR:type="value" into var, type and value
static bool ParseCacheEntry(std::string const& entry, std::string& var,
std::string& value,
cmStateEnums::CacheEntryType& type);
cmStateSnapshot Reset();
// Define a property
void DefineProperty(std::string const& name, cmProperty::ScopeType scope,
std::string const& ShortDescription,
std::string const& FullDescription, bool chain = false,
std::string const& initializeFromVariable = "");
// get property definition
cmPropertyDefinition const* GetPropertyDefinition(
std::string const& name, cmProperty::ScopeType scope) const;
cmPropertyDefinitionMap const& GetPropertyDefinitions() const
{
return this->PropertyDefinitions;
}
bool IsPropertyChained(std::string const& name,
cmProperty::ScopeType scope) const;
void SetLanguageEnabled(std::string const& l);
bool GetLanguageEnabled(std::string const& l) const;
std::vector<std::string> GetEnabledLanguages() const;
void SetEnabledLanguages(std::vector<std::string> const& langs);
void ClearEnabledLanguages();
bool GetIsGeneratorMultiConfig() const;
void SetIsGeneratorMultiConfig(bool b);
using Command = std::function<bool(std::vector<cmListFileArgument> const&,
cmExecutionStatus&)>;
using BuiltinCommand = bool (*)(std::vector<std::string> const&,
cmExecutionStatus&);
// Returns a command from its name, case insensitive, or nullptr
Command GetCommand(std::string const& name) const;
// Returns a command from its name, or nullptr
Command GetCommandByExactName(std::string const& name) const;
void AddBuiltinCommand(std::string const& name, Command command);
void AddBuiltinCommand(std::string const& name, BuiltinCommand command);
void AddFlowControlCommand(std::string const& name, Command command);
void AddFlowControlCommand(std::string const& name, BuiltinCommand command);
void AddDisallowedCommand(std::string const& name, BuiltinCommand command,
cmPolicies::PolicyID policy, char const* message,
char const* additionalWarning = nullptr);
void AddRemovedCommand(std::string const& name, std::string const& message);
void AddUnexpectedCommand(std::string const& name, char const* error);
void AddUnexpectedFlowControlCommand(std::string const& name,
char const* error);
bool AddScriptedCommand(std::string const& name, BT<Command> command,
cmMakefile& mf);
void RemoveBuiltinCommand(std::string const& name);
void RemoveUserDefinedCommands();
std::vector<std::string> GetCommandNames() const;
void SetGlobalProperty(std::string const& prop, std::string const& value);
void SetGlobalProperty(std::string const& prop, cmValue value);
void AppendGlobalProperty(std::string const& prop, std::string const& value,
bool asString = false);
cmValue GetGlobalProperty(std::string const& prop);
bool GetGlobalPropertyAsBool(std::string const& prop);
std::string const& GetSourceDirectory() const;
void SetSourceDirectory(std::string const& sourceDirectory);
std::string const& GetBinaryDirectory() const;
void SetBinaryDirectory(std::string const& binaryDirectory);
void SetWindowsShell(bool windowsShell);
bool UseWindowsShell() const;
void SetWindowsVSIDE(bool windowsVSIDE);
bool UseWindowsVSIDE() const;
void SetGhsMultiIDE(bool ghsMultiIDE);
bool UseGhsMultiIDE() const;
void SetBorlandMake(bool borlandMake);
bool UseBorlandMake() const;
void SetWatcomWMake(bool watcomWMake);
bool UseWatcomWMake() const;
void SetMinGWMake(bool minGWMake);
bool UseMinGWMake() const;
void SetNMake(bool nMake);
bool UseNMake() const;
void SetMSYSShell(bool mSYSShell);
bool UseMSYSShell() const;
void SetNinja(bool ninja);
bool UseNinja() const;
void SetNinjaMulti(bool ninjaMulti);
bool UseNinjaMulti() const;
unsigned int GetCacheMajorVersion() const;
unsigned int GetCacheMinorVersion() const;
Mode GetMode() const;
std::string GetModeString() const;
static std::string ModeToString(Mode mode);
ProjectKind GetProjectKind() const;
void ClearDependencyProvider() { this->DependencyProvider.reset(); }
void SetDependencyProvider(cmDependencyProvider provider)
{
this->DependencyProvider = std::move(provider);
}
cm::optional<cmDependencyProvider> const& GetDependencyProvider() const
{
return this->DependencyProvider;
}
Command GetDependencyProviderCommand(
cmDependencyProvider::Method method) const;
void SetInTopLevelIncludes(bool inTopLevelIncludes)
{
this->ProcessingTopLevelIncludes = inTopLevelIncludes;
}
bool InTopLevelIncludes() const { return this->ProcessingTopLevelIncludes; }
private:
friend class cmake;
void AddCacheEntry(std::string const& key, cmValue value,
std::string const& helpString,
cmStateEnums::CacheEntryType type);
bool DoWriteGlobVerifyTarget() const;
std::string const& GetGlobVerifyScript() const;
std::string const& GetGlobVerifyStamp() const;
bool SaveVerificationScript(std::string const& path, cmMessenger* messenger);
void AddGlobCacheEntry(cmGlobCacheEntry const& entry,
std::string const& variable,
cmListFileBacktrace const& bt,
cmMessenger* messenger);
std::vector<cmGlobCacheEntry> GetGlobCacheEntries() const;
cmPropertyDefinitionMap PropertyDefinitions;
std::vector<std::string> EnabledLanguages;
std::unordered_map<std::string, Command> BuiltinCommands;
std::unordered_map<std::string, Command> ScriptedCommands;
std::unordered_set<std::string> FlowControlCommands;
cmPropertyMap GlobalProperties;
std::unique_ptr<cmCacheManager> CacheManager;
std::unique_ptr<cmGlobVerificationManager> GlobVerificationManager;
cmLinkedTree<cmStateDetail::BuildsystemDirectoryStateType>
BuildsystemDirectory;
cmLinkedTree<std::string> ExecutionListFiles;
cmLinkedTree<cmStateDetail::PolicyStackEntry> PolicyStack;
cmLinkedTree<cmStateDetail::SnapshotDataType> SnapshotData;
cmLinkedTree<cmDefinitions> VarTree;
std::string SourceDirectory;
std::string BinaryDirectory;
bool IsGeneratorMultiConfig = false;
bool WindowsShell = false;
bool WindowsVSIDE = false;
bool GhsMultiIDE = false;
bool BorlandMake = false;
bool WatcomWMake = false;
bool MinGWMake = false;
bool NMake = false;
bool MSYSShell = false;
bool Ninja = false;
bool NinjaMulti = false;
Mode StateMode = Unknown;
ProjectKind StateProjectKind = ProjectKind::Normal;
cm::optional<cmDependencyProvider> DependencyProvider;
bool ProcessingTopLevelIncludes = false;
};
|