cmake/Source/cmState.h

317 lines
12 KiB
C
Raw Normal View History

2016-10-30 18:24:19 +01:00
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
2021-09-14 00:13:48 +02:00
#pragma once
2015-08-17 11:37:30 +02:00
2017-07-20 19:35:53 +02:00
#include "cmConfigure.h" // IWYU pragma: keep
2016-07-09 11:21:54 +02:00
2020-02-01 23:06:01 +01:00
#include <functional>
#include <memory>
2017-04-14 19:02:05 +02:00
#include <set>
#include <string>
2022-08-04 22:12:04 +02:00
#include <type_traits>
2021-09-14 00:13:48 +02:00
#include <unordered_map>
#include <unordered_set>
2022-08-04 22:12:04 +02:00
#include <utility>
2017-04-14 19:02:05 +02:00
#include <vector>
2022-08-04 22:12:04 +02:00
#include <cm/optional>
2016-10-30 18:24:19 +01:00
#include "cmDefinitions.h"
2022-08-04 22:12:04 +02:00
#include "cmDependencyProvider.h"
2016-07-09 11:21:54 +02:00
#include "cmLinkedTree.h"
2017-07-20 19:35:53 +02:00
#include "cmPolicies.h"
2016-10-30 18:24:19 +01:00
#include "cmProperty.h"
2020-08-30 11:54:41 +02:00
#include "cmPropertyDefinition.h"
2016-07-09 11:21:54 +02:00
#include "cmPropertyMap.h"
2017-04-14 19:02:05 +02:00
#include "cmStatePrivate.h"
#include "cmStateTypes.h"
2021-11-20 13:41:27 +01:00
#include "cmValue.h"
2016-10-30 18:24:19 +01:00
class cmCacheManager;
2015-08-17 11:37:30 +02:00
class cmCommand;
2018-08-09 18:06:22 +02:00
class cmGlobVerificationManager;
2021-09-14 00:13:48 +02:00
class cmMakefile;
2017-04-14 19:02:05 +02:00
class cmStateSnapshot;
2018-04-23 21:13:27 +02:00
class cmMessenger;
2020-02-01 23:06:01 +01:00
class cmExecutionStatus;
2022-08-04 22:12:04 +02:00
class cmListFileBacktrace;
struct cmListFileArgument;
template <typename T>
class BT;
2015-08-17 11:37:30 +02:00
class cmState
{
2017-04-14 19:02:05 +02:00
friend class cmStateSnapshot;
2016-07-09 11:21:54 +02:00
2015-08-17 11:37:30 +02:00
public:
2019-11-11 23:01:05 +01:00
enum Mode
{
Unknown,
Project,
Script,
FindPackage,
CTest,
CPack,
};
2021-11-20 13:41:27 +01:00
enum class ProjectKind
{
Normal,
TryCompile,
};
cmState(Mode mode, ProjectKind projectKind = ProjectKind::Normal);
~cmState();
cmState(const cmState&) = delete;
cmState& operator=(const cmState&) = delete;
2020-08-30 11:54:41 +02:00
static const std::string& GetTargetTypeName(
cmStateEnums::TargetType targetType);
2017-04-14 19:02:05 +02:00
cmStateSnapshot CreateBaseSnapshot();
cmStateSnapshot CreateBuildsystemDirectorySnapshot(
2017-07-20 19:35:53 +02:00
cmStateSnapshot const& originSnapshot);
2021-09-14 00:13:48 +02:00
cmStateSnapshot CreateDeferCallSnapshot(
cmStateSnapshot const& originSnapshot, std::string const& fileName);
2017-07-20 19:35:53 +02:00
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);
2017-04-14 19:02:05 +02:00
2020-08-30 11:54:41 +02:00
static cmStateEnums::CacheEntryType StringToCacheEntryType(
const std::string&);
static bool StringToCacheEntryType(const std::string&,
2019-11-11 23:01:05 +01:00
cmStateEnums::CacheEntryType& type);
2020-08-30 11:54:41 +02:00
static const std::string& CacheEntryTypeToString(
cmStateEnums::CacheEntryType);
2015-08-17 11:37:30 +02:00
static bool IsCacheEntryType(std::string const& key);
2016-03-13 13:35:51 +01:00
bool LoadCache(const std::string& path, bool internal,
std::set<std::string>& excludes,
std::set<std::string>& includes);
2018-04-23 21:13:27 +02:00
bool SaveCache(const std::string& path, cmMessenger* messenger);
2016-03-13 13:35:51 +01:00
bool DeleteCache(const std::string& path);
2021-09-14 00:13:48 +02:00
bool IsCacheLoaded() const;
2015-08-17 11:37:30 +02:00
std::vector<std::string> GetCacheEntryKeys() const;
2021-11-20 13:41:27 +01:00
cmValue GetCacheEntryValue(std::string const& key) const;
2020-08-30 11:54:41 +02:00
std::string GetSafeCacheEntryValue(std::string const& key) const;
2021-11-20 13:41:27 +01:00
cmValue GetInitializedCacheValue(std::string const& key) const;
2017-04-14 19:02:05 +02:00
cmStateEnums::CacheEntryType GetCacheEntryType(std::string const& key) const;
2015-08-17 11:37:30 +02:00
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,
2016-07-09 11:21:54 +02:00
std::string const& propertyName, bool value);
2016-10-30 18:24:19 +01:00
std::vector<std::string> GetCacheEntryPropertyList(std::string const& key);
2021-11-20 13:41:27 +01:00
cmValue GetCacheEntryProperty(std::string const& key,
std::string const& propertyName);
2015-08-17 11:37:30 +02:00
bool GetCacheEntryPropertyAsBool(std::string const& key,
std::string const& propertyName);
void AppendCacheEntryProperty(std::string const& key,
const std::string& property,
const std::string& value,
bool asString = false);
void RemoveCacheEntryProperty(std::string const& key,
std::string const& propertyName);
2019-11-11 23:01:05 +01:00
//! Break up a line like VAR:type="value" into var, type and value
2016-07-09 11:21:54 +02:00
static bool ParseCacheEntry(const std::string& entry, std::string& var,
2017-04-14 19:02:05 +02:00
std::string& value,
cmStateEnums::CacheEntryType& type);
2016-03-13 13:35:51 +01:00
2017-04-14 19:02:05 +02:00
cmStateSnapshot Reset();
2015-08-17 11:37:30 +02:00
// Define a property
void DefineProperty(const std::string& name, cmProperty::ScopeType scope,
2020-08-30 11:54:41 +02:00
const std::string& ShortDescription,
2022-03-29 21:10:50 +02:00
const std::string& FullDescription, bool chain = false,
const std::string& initializeFromVariable = "");
2015-08-17 11:37:30 +02:00
// get property definition
2016-07-09 11:21:54 +02:00
cmPropertyDefinition const* GetPropertyDefinition(
const std::string& name, cmProperty::ScopeType scope) const;
2015-08-17 11:37:30 +02:00
2022-03-29 21:10:50 +02:00
const cmPropertyDefinitionMap& GetPropertyDefinitions() const
{
return this->PropertyDefinitions;
}
2015-11-17 17:22:37 +01:00
bool IsPropertyChained(const std::string& name,
cmProperty::ScopeType scope) const;
2015-08-17 11:37:30 +02:00
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();
2017-07-20 19:35:53 +02:00
bool GetIsGeneratorMultiConfig() const;
void SetIsGeneratorMultiConfig(bool b);
2020-02-01 23:06:01 +01:00
using Command = std::function<bool(std::vector<cmListFileArgument> const&,
cmExecutionStatus&)>;
using BuiltinCommand = bool (*)(std::vector<std::string> const&,
cmExecutionStatus&);
2018-08-09 18:06:22 +02:00
// Returns a command from its name, case insensitive, or nullptr
2020-02-01 23:06:01 +01:00
Command GetCommand(std::string const& name) const;
2018-08-09 18:06:22 +02:00
// Returns a command from its name, or nullptr
2020-02-01 23:06:01 +01:00
Command GetCommandByExactName(std::string const& name) const;
2018-08-09 18:06:22 +02:00
2020-02-01 23:06:01 +01:00
void AddBuiltinCommand(std::string const& name,
std::unique_ptr<cmCommand> command);
void AddBuiltinCommand(std::string const& name, Command command);
void AddBuiltinCommand(std::string const& name, BuiltinCommand command);
2021-09-14 00:13:48 +02:00
void AddFlowControlCommand(std::string const& name, Command command);
void AddFlowControlCommand(std::string const& name, BuiltinCommand command);
2020-02-01 23:06:01 +01:00
void AddDisallowedCommand(std::string const& name, BuiltinCommand command,
2017-07-20 19:35:53 +02:00
cmPolicies::PolicyID policy, const char* message);
void AddUnexpectedCommand(std::string const& name, const char* error);
2021-09-14 00:13:48 +02:00
void AddUnexpectedFlowControlCommand(std::string const& name,
const char* error);
bool AddScriptedCommand(std::string const& name, BT<Command> command,
cmMakefile& mf);
2018-11-29 20:27:00 +01:00
void RemoveBuiltinCommand(std::string const& name);
2015-08-17 11:37:30 +02:00
void RemoveUserDefinedCommands();
std::vector<std::string> GetCommandNames() const;
2016-07-09 11:21:54 +02:00
void SetGlobalProperty(const std::string& prop, const char* value);
2021-11-20 13:41:27 +01:00
void SetGlobalProperty(const std::string& prop, cmValue value);
2020-08-30 11:54:41 +02:00
void AppendGlobalProperty(const std::string& prop, const std::string& value,
2016-07-09 11:21:54 +02:00
bool asString = false);
2021-11-20 13:41:27 +01:00
cmValue GetGlobalProperty(const std::string& prop);
2015-08-17 11:37:30 +02:00
bool GetGlobalPropertyAsBool(const std::string& prop);
2018-04-23 21:13:27 +02:00
std::string const& GetSourceDirectory() const;
2015-08-17 11:37:30 +02:00
void SetSourceDirectory(std::string const& sourceDirectory);
2018-04-23 21:13:27 +02:00
std::string const& GetBinaryDirectory() const;
2015-08-17 11:37:30 +02:00
void SetBinaryDirectory(std::string const& binaryDirectory);
void SetWindowsShell(bool windowsShell);
bool UseWindowsShell() const;
void SetWindowsVSIDE(bool windowsVSIDE);
bool UseWindowsVSIDE() const;
2019-11-11 23:01:05 +01:00
void SetGhsMultiIDE(bool ghsMultiIDE);
bool UseGhsMultiIDE() const;
2015-08-17 11:37:30 +02:00
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;
2020-08-30 11:54:41 +02:00
void SetNinjaMulti(bool ninjaMulti);
bool UseNinjaMulti() const;
2015-08-17 11:37:30 +02:00
2016-03-13 13:35:51 +01:00
unsigned int GetCacheMajorVersion() const;
unsigned int GetCacheMinorVersion() const;
2019-11-11 23:01:05 +01:00
Mode GetMode() const;
std::string GetModeString() const;
static std::string ModeToString(Mode mode);
2021-11-20 13:41:27 +01:00
ProjectKind GetProjectKind() const;
2022-08-04 22:12:04 +02:00
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; }
2015-08-17 11:37:30 +02:00
private:
2016-03-13 13:35:51 +01:00
friend class cmake;
void AddCacheEntry(const std::string& key, const char* value,
2021-11-20 13:41:27 +01:00
const char* helpString, cmStateEnums::CacheEntryType type)
{
this->AddCacheEntry(key,
value ? cmValue(std::string(value)) : cmValue(nullptr),
helpString, type);
}
void AddCacheEntry(const std::string& key, const std::string& value,
const char* helpString, cmStateEnums::CacheEntryType type)
{
this->AddCacheEntry(key, cmValue(value), helpString, type);
}
void AddCacheEntry(const std::string& key, cmValue value,
2017-04-14 19:02:05 +02:00
const char* helpString,
cmStateEnums::CacheEntryType type);
2016-03-13 13:35:51 +01:00
2018-08-09 18:06:22 +02:00
bool DoWriteGlobVerifyTarget() const;
std::string const& GetGlobVerifyScript() const;
std::string const& GetGlobVerifyStamp() const;
2022-03-29 21:10:50 +02:00
bool SaveVerificationScript(const std::string& path, cmMessenger* messenger);
2018-08-09 18:06:22 +02:00
void AddGlobCacheEntry(bool recurse, bool listDirectories,
bool followSymlinks, const std::string& relative,
const std::string& expression,
const std::vector<std::string>& files,
const std::string& variable,
2022-03-29 21:10:50 +02:00
cmListFileBacktrace const& bt,
cmMessenger* messenger);
2018-08-09 18:06:22 +02:00
2020-08-30 11:54:41 +02:00
cmPropertyDefinitionMap PropertyDefinitions;
2015-08-17 11:37:30 +02:00
std::vector<std::string> EnabledLanguages;
2021-09-14 00:13:48 +02:00
std::unordered_map<std::string, Command> BuiltinCommands;
std::unordered_map<std::string, Command> ScriptedCommands;
std::unordered_set<std::string> FlowControlCommands;
2015-08-17 11:37:30 +02:00
cmPropertyMap GlobalProperties;
2020-02-01 23:06:01 +01:00
std::unique_ptr<cmCacheManager> CacheManager;
std::unique_ptr<cmGlobVerificationManager> GlobVerificationManager;
2015-11-17 17:22:37 +01:00
2017-04-14 19:02:05 +02:00
cmLinkedTree<cmStateDetail::BuildsystemDirectoryStateType>
BuildsystemDirectory;
2015-11-17 17:22:37 +01:00
cmLinkedTree<std::string> ExecutionListFiles;
2017-04-14 19:02:05 +02:00
cmLinkedTree<cmStateDetail::PolicyStackEntry> PolicyStack;
cmLinkedTree<cmStateDetail::SnapshotDataType> SnapshotData;
2015-11-17 17:22:37 +01:00
cmLinkedTree<cmDefinitions> VarTree;
2015-08-17 11:37:30 +02:00
std::string SourceDirectory;
std::string BinaryDirectory;
2019-11-11 23:01:05 +01:00
bool IsGeneratorMultiConfig = false;
bool WindowsShell = false;
bool WindowsVSIDE = false;
bool GhsMultiIDE = false;
bool WatcomWMake = false;
bool MinGWMake = false;
bool NMake = false;
bool MSYSShell = false;
2020-08-30 11:54:41 +02:00
bool NinjaMulti = false;
2021-11-20 13:41:27 +01:00
Mode StateMode = Unknown;
ProjectKind StateProjectKind = ProjectKind::Normal;
2022-08-04 22:12:04 +02:00
cm::optional<cmDependencyProvider> DependencyProvider;
bool ProcessingTopLevelIncludes = false;
2015-08-17 11:37:30 +02:00
};