| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036 | /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying   file Copyright.txt or https://cmake.org/licensing for details.  */#include "cmState.h"#include <algorithm>#include <array>#include <cassert>#include <cstdlib>#include <utility>#include <cm/memory>#include "cmsys/RegularExpression.hxx"#include "cmCacheManager.h"#include "cmCommand.h"#include "cmDefinitions.h"#include "cmExecutionStatus.h"#include "cmGlobVerificationManager.h"#include "cmListFileCache.h"#include "cmMakefile.h"#include "cmMessageType.h"#include "cmStatePrivate.h"#include "cmStateSnapshot.h"#include "cmStringAlgorithms.h"#include "cmSystemTools.h"#include "cmake.h"cmState::cmState(){  this->CacheManager = cm::make_unique<cmCacheManager>();  this->GlobVerificationManager = cm::make_unique<cmGlobVerificationManager>();}cmState::~cmState() = default;const char* cmState::GetTargetTypeName(cmStateEnums::TargetType targetType){  switch (targetType) {    case cmStateEnums::STATIC_LIBRARY:      return "STATIC_LIBRARY";    case cmStateEnums::MODULE_LIBRARY:      return "MODULE_LIBRARY";    case cmStateEnums::SHARED_LIBRARY:      return "SHARED_LIBRARY";    case cmStateEnums::OBJECT_LIBRARY:      return "OBJECT_LIBRARY";    case cmStateEnums::EXECUTABLE:      return "EXECUTABLE";    case cmStateEnums::UTILITY:      return "UTILITY";    case cmStateEnums::GLOBAL_TARGET:      return "GLOBAL_TARGET";    case cmStateEnums::INTERFACE_LIBRARY:      return "INTERFACE_LIBRARY";    case cmStateEnums::UNKNOWN_LIBRARY:      return "UNKNOWN_LIBRARY";  }  assert(false && "Unexpected target type");  return nullptr;}static const std::array<std::string, 7> cmCacheEntryTypes = {  { "BOOL", "PATH", "FILEPATH", "STRING", "INTERNAL", "STATIC",    "UNINITIALIZED" }};const std::string& cmState::CacheEntryTypeToString(  cmStateEnums::CacheEntryType type){  if (type < cmStateEnums::BOOL || type > cmStateEnums::UNINITIALIZED) {    type = cmStateEnums::UNINITIALIZED;  }  return cmCacheEntryTypes[type];}cmStateEnums::CacheEntryType cmState::StringToCacheEntryType(  const std::string& s){  cmStateEnums::CacheEntryType type = cmStateEnums::STRING;  StringToCacheEntryType(s, type);  return type;}bool cmState::StringToCacheEntryType(const std::string& s,                                     cmStateEnums::CacheEntryType& type){  for (size_t i = 0; i < cmCacheEntryTypes.size(); ++i) {    if (s == cmCacheEntryTypes[i]) {      type = static_cast<cmStateEnums::CacheEntryType>(i);      return true;    }  }  return false;}bool cmState::IsCacheEntryType(std::string const& key){  for (const std::string& i : cmCacheEntryTypes) {    if (key == i) {      return true;    }  }  return false;}bool cmState::LoadCache(const std::string& path, bool internal,                        std::set<std::string>& excludes,                        std::set<std::string>& includes){  return this->CacheManager->LoadCache(path, internal, excludes, includes);}bool cmState::SaveCache(const std::string& path, cmMessenger* messenger){  return this->CacheManager->SaveCache(path, messenger);}bool cmState::DeleteCache(const std::string& path){  return this->CacheManager->DeleteCache(path);}std::vector<std::string> cmState::GetCacheEntryKeys() const{  std::vector<std::string> definitions;  definitions.reserve(this->CacheManager->GetSize());  cmCacheManager::CacheIterator cit = this->CacheManager->GetCacheIterator();  for (cit.Begin(); !cit.IsAtEnd(); cit.Next()) {    definitions.push_back(cit.GetName());  }  return definitions;}const char* cmState::GetCacheEntryValue(std::string const& key) const{  cmCacheManager::CacheEntry* e = this->CacheManager->GetCacheEntry(key);  if (!e) {    return nullptr;  }  return e->Value.c_str();}std::string cmState::GetSafeCacheEntryValue(std::string const& key) const{  std::string retval;  auto val = this->GetCacheEntryValue(key);  if (val) {    retval = val;  }  return retval;}const std::string* cmState::GetInitializedCacheValue(  std::string const& key) const{  return this->CacheManager->GetInitializedCacheValue(key);}cmStateEnums::CacheEntryType cmState::GetCacheEntryType(  std::string const& key) const{  cmCacheManager::CacheIterator it = this->CacheManager->GetCacheIterator(key);  return it.GetType();}void cmState::SetCacheEntryValue(std::string const& key,                                 std::string const& value){  this->CacheManager->SetCacheEntryValue(key, value);}void cmState::SetCacheEntryProperty(std::string const& key,                                    std::string const& propertyName,                                    std::string const& value){  cmCacheManager::CacheIterator it = this->CacheManager->GetCacheIterator(key);  it.SetProperty(propertyName, value.c_str());}void cmState::SetCacheEntryBoolProperty(std::string const& key,                                        std::string const& propertyName,                                        bool value){  cmCacheManager::CacheIterator it = this->CacheManager->GetCacheIterator(key);  it.SetProperty(propertyName, value);}std::vector<std::string> cmState::GetCacheEntryPropertyList(  const std::string& key){  cmCacheManager::CacheIterator it = this->CacheManager->GetCacheIterator(key);  return it.GetPropertyList();}const char* cmState::GetCacheEntryProperty(std::string const& key,                                           std::string const& propertyName){  cmCacheManager::CacheIterator it = this->CacheManager->GetCacheIterator(key);  if (!it.PropertyExists(propertyName)) {    return nullptr;  }  return it.GetProperty(propertyName);}bool cmState::GetCacheEntryPropertyAsBool(std::string const& key,                                          std::string const& propertyName){  return this->CacheManager->GetCacheIterator(key).GetPropertyAsBool(    propertyName);}void cmState::AddCacheEntry(const std::string& key, const char* value,                            const char* helpString,                            cmStateEnums::CacheEntryType type){  this->CacheManager->AddCacheEntry(key, value, helpString, type);}bool cmState::DoWriteGlobVerifyTarget() const{  return this->GlobVerificationManager->DoWriteVerifyTarget();}std::string const& cmState::GetGlobVerifyScript() const{  return this->GlobVerificationManager->GetVerifyScript();}std::string const& cmState::GetGlobVerifyStamp() const{  return this->GlobVerificationManager->GetVerifyStamp();}bool cmState::SaveVerificationScript(const std::string& path){  return this->GlobVerificationManager->SaveVerificationScript(path);}void cmState::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,                                cmListFileBacktrace const& backtrace){  this->GlobVerificationManager->AddCacheEntry(    recurse, listDirectories, followSymlinks, relative, expression, files,    variable, backtrace);}void cmState::RemoveCacheEntry(std::string const& key){  this->CacheManager->RemoveCacheEntry(key);}void cmState::AppendCacheEntryProperty(const std::string& key,                                       const std::string& property,                                       const std::string& value, bool asString){  this->CacheManager->GetCacheIterator(key).AppendProperty(property, value,                                                           asString);}void cmState::RemoveCacheEntryProperty(std::string const& key,                                       std::string const& propertyName){  this->CacheManager->GetCacheIterator(key).SetProperty(propertyName, nullptr);}cmStateSnapshot cmState::Reset(){  this->GlobalProperties.Clear();  this->PropertyDefinitions.clear();  this->GlobVerificationManager->Reset();  cmStateDetail::PositionType pos = this->SnapshotData.Truncate();  this->ExecutionListFiles.Truncate();  {    cmLinkedTree<cmStateDetail::BuildsystemDirectoryStateType>::iterator it =      this->BuildsystemDirectory.Truncate();    it->IncludeDirectories.clear();    it->IncludeDirectoryBacktraces.clear();    it->CompileDefinitions.clear();    it->CompileDefinitionsBacktraces.clear();    it->CompileOptions.clear();    it->CompileOptionsBacktraces.clear();    it->LinkOptions.clear();    it->LinkOptionsBacktraces.clear();    it->LinkDirectories.clear();    it->LinkDirectoriesBacktraces.clear();    it->DirectoryEnd = pos;    it->NormalTargetNames.clear();    it->Properties.Clear();    it->Children.clear();  }  this->PolicyStack.Clear();  pos->Policies = this->PolicyStack.Root();  pos->PolicyRoot = this->PolicyStack.Root();  pos->PolicyScope = this->PolicyStack.Root();  assert(pos->Policies.IsValid());  assert(pos->PolicyRoot.IsValid());  {    std::string srcDir =      *cmDefinitions::Get("CMAKE_SOURCE_DIR", pos->Vars, pos->Root);    std::string binDir =      *cmDefinitions::Get("CMAKE_BINARY_DIR", pos->Vars, pos->Root);    this->VarTree.Clear();    pos->Vars = this->VarTree.Push(this->VarTree.Root());    pos->Parent = this->VarTree.Root();    pos->Root = this->VarTree.Root();    pos->Vars->Set("CMAKE_SOURCE_DIR", srcDir);    pos->Vars->Set("CMAKE_BINARY_DIR", binDir);  }  this->DefineProperty("RULE_LAUNCH_COMPILE", cmProperty::DIRECTORY, "", "",                       true);  this->DefineProperty("RULE_LAUNCH_LINK", cmProperty::DIRECTORY, "", "",                       true);  this->DefineProperty("RULE_LAUNCH_CUSTOM", cmProperty::DIRECTORY, "", "",                       true);  this->DefineProperty("RULE_LAUNCH_COMPILE", cmProperty::TARGET, "", "",                       true);  this->DefineProperty("RULE_LAUNCH_LINK", cmProperty::TARGET, "", "", true);  this->DefineProperty("RULE_LAUNCH_CUSTOM", cmProperty::TARGET, "", "", true);  return { this, pos };}void cmState::DefineProperty(const std::string& name,                             cmProperty::ScopeType scope,                             const std::string& ShortDescription,                             const std::string& FullDescription, bool chained){  this->PropertyDefinitions[scope].DefineProperty(    name, scope, ShortDescription, FullDescription, chained);}cmPropertyDefinition const* cmState::GetPropertyDefinition(  const std::string& name, cmProperty::ScopeType scope) const{  if (this->IsPropertyDefined(name, scope)) {    cmPropertyDefinitionMap const& defs =      this->PropertyDefinitions.find(scope)->second;    return &defs.find(name)->second;  }  return nullptr;}bool cmState::IsPropertyDefined(const std::string& name,                                cmProperty::ScopeType scope) const{  auto it = this->PropertyDefinitions.find(scope);  if (it == this->PropertyDefinitions.end()) {    return false;  }  return it->second.IsPropertyDefined(name);}bool cmState::IsPropertyChained(const std::string& name,                                cmProperty::ScopeType scope) const{  auto it = this->PropertyDefinitions.find(scope);  if (it == this->PropertyDefinitions.end()) {    return false;  }  return it->second.IsPropertyChained(name);}void cmState::SetLanguageEnabled(std::string const& l){  auto it = std::lower_bound(this->EnabledLanguages.begin(),                             this->EnabledLanguages.end(), l);  if (it == this->EnabledLanguages.end() || *it != l) {    this->EnabledLanguages.insert(it, l);  }}bool cmState::GetLanguageEnabled(std::string const& l) const{  return std::binary_search(this->EnabledLanguages.begin(),                            this->EnabledLanguages.end(), l);}std::vector<std::string> cmState::GetEnabledLanguages() const{  return this->EnabledLanguages;}void cmState::SetEnabledLanguages(std::vector<std::string> const& langs){  this->EnabledLanguages = langs;}void cmState::ClearEnabledLanguages(){  this->EnabledLanguages.clear();}bool cmState::GetIsInTryCompile() const{  return this->IsInTryCompile;}void cmState::SetIsInTryCompile(bool b){  this->IsInTryCompile = b;}bool cmState::GetIsGeneratorMultiConfig() const{  return this->IsGeneratorMultiConfig;}void cmState::SetIsGeneratorMultiConfig(bool b){  this->IsGeneratorMultiConfig = b;}void cmState::AddBuiltinCommand(std::string const& name,                                std::unique_ptr<cmCommand> command){  this->AddBuiltinCommand(name, cmLegacyCommandWrapper(std::move(command)));}void cmState::AddBuiltinCommand(std::string const& name, Command command){  assert(name == cmSystemTools::LowerCase(name));  assert(this->BuiltinCommands.find(name) == this->BuiltinCommands.end());  this->BuiltinCommands.emplace(name, std::move(command));}static bool InvokeBuiltinCommand(cmState::BuiltinCommand command,                                 std::vector<cmListFileArgument> const& args,                                 cmExecutionStatus& status){  cmMakefile& mf = status.GetMakefile();  std::vector<std::string> expandedArguments;  if (!mf.ExpandArguments(args, expandedArguments)) {    // There was an error expanding arguments.  It was already    // reported, so we can skip this command without error.    return true;  }  return command(expandedArguments, status);}void cmState::AddBuiltinCommand(std::string const& name,                                BuiltinCommand command){  this->AddBuiltinCommand(    name,    [command](const std::vector<cmListFileArgument>& args,              cmExecutionStatus& status) -> bool {      return InvokeBuiltinCommand(command, args, status);    });}void cmState::AddDisallowedCommand(std::string const& name,                                   BuiltinCommand command,                                   cmPolicies::PolicyID policy,                                   const char* message){  this->AddBuiltinCommand(    name,    [command, policy, message](const std::vector<cmListFileArgument>& args,                               cmExecutionStatus& status) -> bool {      cmMakefile& mf = status.GetMakefile();      switch (mf.GetPolicyStatus(policy)) {        case cmPolicies::WARN:          mf.IssueMessage(MessageType::AUTHOR_WARNING,                          cmPolicies::GetPolicyWarning(policy));          break;        case cmPolicies::OLD:          break;        case cmPolicies::REQUIRED_IF_USED:        case cmPolicies::REQUIRED_ALWAYS:        case cmPolicies::NEW:          mf.IssueMessage(MessageType::FATAL_ERROR, message);          return true;      }      return InvokeBuiltinCommand(command, args, status);    });}void cmState::AddUnexpectedCommand(std::string const& name, const char* error){  this->AddBuiltinCommand(    name,    [name, error](std::vector<cmListFileArgument> const&,                  cmExecutionStatus& status) -> bool {      const char* versionValue =        status.GetMakefile().GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION");      if (name == "endif" && (!versionValue || atof(versionValue) <= 1.4)) {        return true;      }      status.SetError(error);      return false;    });}void cmState::AddScriptedCommand(std::string const& name, Command command){  std::string sName = cmSystemTools::LowerCase(name);  // if the command already exists, give a new name to the old command.  if (Command oldCmd = this->GetCommandByExactName(sName)) {    this->ScriptedCommands["_" + sName] = oldCmd;  }  this->ScriptedCommands[sName] = std::move(command);}cmState::Command cmState::GetCommand(std::string const& name) const{  return GetCommandByExactName(cmSystemTools::LowerCase(name));}cmState::Command cmState::GetCommandByExactName(std::string const& name) const{  auto pos = this->ScriptedCommands.find(name);  if (pos != this->ScriptedCommands.end()) {    return pos->second;  }  pos = this->BuiltinCommands.find(name);  if (pos != this->BuiltinCommands.end()) {    return pos->second;  }  return nullptr;}std::vector<std::string> cmState::GetCommandNames() const{  std::vector<std::string> commandNames;  commandNames.reserve(this->BuiltinCommands.size() +                       this->ScriptedCommands.size());  for (auto const& bc : this->BuiltinCommands) {    commandNames.push_back(bc.first);  }  for (auto const& sc : this->ScriptedCommands) {    commandNames.push_back(sc.first);  }  std::sort(commandNames.begin(), commandNames.end());  commandNames.erase(std::unique(commandNames.begin(), commandNames.end()),                     commandNames.end());  return commandNames;}void cmState::RemoveBuiltinCommand(std::string const& name){  assert(name == cmSystemTools::LowerCase(name));  this->BuiltinCommands.erase(name);}void cmState::RemoveUserDefinedCommands(){  this->ScriptedCommands.clear();}void cmState::SetGlobalProperty(const std::string& prop, const char* value){  this->GlobalProperties.SetProperty(prop, value);}void cmState::AppendGlobalProperty(const std::string& prop,                                   const std::string& value, bool asString){  this->GlobalProperties.AppendProperty(prop, value, asString);}const char* cmState::GetGlobalProperty(const std::string& prop){  if (prop == "CACHE_VARIABLES") {    std::vector<std::string> cacheKeys = this->GetCacheEntryKeys();    this->SetGlobalProperty("CACHE_VARIABLES", cmJoin(cacheKeys, ";").c_str());  } else if (prop == "COMMANDS") {    std::vector<std::string> commands = this->GetCommandNames();    this->SetGlobalProperty("COMMANDS", cmJoin(commands, ";").c_str());  } else if (prop == "IN_TRY_COMPILE") {    this->SetGlobalProperty("IN_TRY_COMPILE",                            this->IsInTryCompile ? "1" : "0");  } else if (prop == "GENERATOR_IS_MULTI_CONFIG") {    this->SetGlobalProperty("GENERATOR_IS_MULTI_CONFIG",                            this->IsGeneratorMultiConfig ? "1" : "0");  } else if (prop == "ENABLED_LANGUAGES") {    std::string langs;    langs = cmJoin(this->EnabledLanguages, ";");    this->SetGlobalProperty("ENABLED_LANGUAGES", langs.c_str());  } else if (prop == "CMAKE_ROLE") {    std::string mode = this->GetModeString();    this->SetGlobalProperty("CMAKE_ROLE", mode.c_str());  }#define STRING_LIST_ELEMENT(F) ";" #F  if (prop == "CMAKE_C_KNOWN_FEATURES") {    return &FOR_EACH_C_FEATURE(STRING_LIST_ELEMENT)[1];  }  if (prop == "CMAKE_C90_KNOWN_FEATURES") {    return &FOR_EACH_C90_FEATURE(STRING_LIST_ELEMENT)[1];  }  if (prop == "CMAKE_C99_KNOWN_FEATURES") {    return &FOR_EACH_C99_FEATURE(STRING_LIST_ELEMENT)[1];  }  if (prop == "CMAKE_C11_KNOWN_FEATURES") {    return &FOR_EACH_C11_FEATURE(STRING_LIST_ELEMENT)[1];  }  if (prop == "CMAKE_CXX_KNOWN_FEATURES") {    return &FOR_EACH_CXX_FEATURE(STRING_LIST_ELEMENT)[1];  }  if (prop == "CMAKE_CXX98_KNOWN_FEATURES") {    return &FOR_EACH_CXX98_FEATURE(STRING_LIST_ELEMENT)[1];  }  if (prop == "CMAKE_CXX11_KNOWN_FEATURES") {    return &FOR_EACH_CXX11_FEATURE(STRING_LIST_ELEMENT)[1];  }  if (prop == "CMAKE_CXX14_KNOWN_FEATURES") {    return &FOR_EACH_CXX14_FEATURE(STRING_LIST_ELEMENT)[1];  }  if (prop == "CMAKE_CUDA_KNOWN_FEATURES") {    return &FOR_EACH_CUDA_FEATURE(STRING_LIST_ELEMENT)[1];  }#undef STRING_LIST_ELEMENT  return this->GlobalProperties.GetPropertyValue(prop);}bool cmState::GetGlobalPropertyAsBool(const std::string& prop){  return cmIsOn(this->GetGlobalProperty(prop));}void cmState::SetSourceDirectory(std::string const& sourceDirectory){  this->SourceDirectory = sourceDirectory;  cmSystemTools::ConvertToUnixSlashes(this->SourceDirectory);}std::string const& cmState::GetSourceDirectory() const{  return this->SourceDirectory;}void cmState::SetBinaryDirectory(std::string const& binaryDirectory){  this->BinaryDirectory = binaryDirectory;  cmSystemTools::ConvertToUnixSlashes(this->BinaryDirectory);}void cmState::SetWindowsShell(bool windowsShell){  this->WindowsShell = windowsShell;}bool cmState::UseWindowsShell() const{  return this->WindowsShell;}void cmState::SetWindowsVSIDE(bool windowsVSIDE){  this->WindowsVSIDE = windowsVSIDE;}bool cmState::UseWindowsVSIDE() const{  return this->WindowsVSIDE;}void cmState::SetGhsMultiIDE(bool ghsMultiIDE){  this->GhsMultiIDE = ghsMultiIDE;}bool cmState::UseGhsMultiIDE() const{  return this->GhsMultiIDE;}void cmState::SetWatcomWMake(bool watcomWMake){  this->WatcomWMake = watcomWMake;}bool cmState::UseWatcomWMake() const{  return this->WatcomWMake;}void cmState::SetMinGWMake(bool minGWMake){  this->MinGWMake = minGWMake;}bool cmState::UseMinGWMake() const{  return this->MinGWMake;}void cmState::SetNMake(bool nMake){  this->NMake = nMake;}bool cmState::UseNMake() const{  return this->NMake;}void cmState::SetMSYSShell(bool mSYSShell){  this->MSYSShell = mSYSShell;}bool cmState::UseMSYSShell() const{  return this->MSYSShell;}void cmState::SetNinjaMulti(bool ninjaMulti){  this->NinjaMulti = ninjaMulti;}bool cmState::UseNinjaMulti() const{  return this->NinjaMulti;}unsigned int cmState::GetCacheMajorVersion() const{  return this->CacheManager->GetCacheMajorVersion();}unsigned int cmState::GetCacheMinorVersion() const{  return this->CacheManager->GetCacheMinorVersion();}cmState::Mode cmState::GetMode() const{  return this->CurrentMode;}std::string cmState::GetModeString() const{  return ModeToString(this->CurrentMode);}void cmState::SetMode(cmState::Mode mode){  this->CurrentMode = mode;}std::string cmState::ModeToString(cmState::Mode mode){  switch (mode) {    case Project:      return "PROJECT";    case Script:      return "SCRIPT";    case FindPackage:      return "FIND_PACKAGE";    case CTest:      return "CTEST";    case CPack:      return "CPACK";    case Unknown:      return "UNKNOWN";  }  return "UNKNOWN";}std::string const& cmState::GetBinaryDirectory() const{  return this->BinaryDirectory;}cmStateSnapshot cmState::CreateBaseSnapshot(){  cmStateDetail::PositionType pos =    this->SnapshotData.Push(this->SnapshotData.Root());  pos->DirectoryParent = this->SnapshotData.Root();  pos->ScopeParent = this->SnapshotData.Root();  pos->SnapshotType = cmStateEnums::BaseType;  pos->Keep = true;  pos->BuildSystemDirectory =    this->BuildsystemDirectory.Push(this->BuildsystemDirectory.Root());  pos->ExecutionListFile =    this->ExecutionListFiles.Push(this->ExecutionListFiles.Root());  pos->IncludeDirectoryPosition = 0;  pos->CompileDefinitionsPosition = 0;  pos->CompileOptionsPosition = 0;  pos->LinkOptionsPosition = 0;  pos->LinkDirectoriesPosition = 0;  pos->BuildSystemDirectory->DirectoryEnd = pos;  pos->Policies = this->PolicyStack.Root();  pos->PolicyRoot = this->PolicyStack.Root();  pos->PolicyScope = this->PolicyStack.Root();  assert(pos->Policies.IsValid());  assert(pos->PolicyRoot.IsValid());  pos->Vars = this->VarTree.Push(this->VarTree.Root());  assert(pos->Vars.IsValid());  pos->Parent = this->VarTree.Root();  pos->Root = this->VarTree.Root();  return { this, pos };}cmStateSnapshot cmState::CreateBuildsystemDirectorySnapshot(  cmStateSnapshot const& originSnapshot){  assert(originSnapshot.IsValid());  cmStateDetail::PositionType pos =    this->SnapshotData.Push(originSnapshot.Position);  pos->DirectoryParent = originSnapshot.Position;  pos->ScopeParent = originSnapshot.Position;  pos->SnapshotType = cmStateEnums::BuildsystemDirectoryType;  pos->Keep = true;  pos->BuildSystemDirectory = this->BuildsystemDirectory.Push(    originSnapshot.Position->BuildSystemDirectory);  pos->ExecutionListFile =    this->ExecutionListFiles.Push(originSnapshot.Position->ExecutionListFile);  pos->BuildSystemDirectory->DirectoryEnd = pos;  pos->Policies = originSnapshot.Position->Policies;  pos->PolicyRoot = originSnapshot.Position->Policies;  pos->PolicyScope = originSnapshot.Position->Policies;  assert(pos->Policies.IsValid());  assert(pos->PolicyRoot.IsValid());  cmLinkedTree<cmDefinitions>::iterator origin = originSnapshot.Position->Vars;  pos->Parent = origin;  pos->Root = origin;  pos->Vars = this->VarTree.Push(origin);  cmStateSnapshot snapshot = cmStateSnapshot(this, pos);  originSnapshot.Position->BuildSystemDirectory->Children.push_back(snapshot);  snapshot.SetDefaultDefinitions();  snapshot.InitializeFromParent();  snapshot.SetDirectoryDefinitions();  return snapshot;}cmStateSnapshot cmState::CreateFunctionCallSnapshot(  cmStateSnapshot const& originSnapshot, std::string const& fileName){  cmStateDetail::PositionType pos =    this->SnapshotData.Push(originSnapshot.Position, *originSnapshot.Position);  pos->ScopeParent = originSnapshot.Position;  pos->SnapshotType = cmStateEnums::FunctionCallType;  pos->Keep = false;  pos->ExecutionListFile = this->ExecutionListFiles.Push(    originSnapshot.Position->ExecutionListFile, fileName);  pos->BuildSystemDirectory->DirectoryEnd = pos;  pos->PolicyScope = originSnapshot.Position->Policies;  assert(originSnapshot.Position->Vars.IsValid());  cmLinkedTree<cmDefinitions>::iterator origin = originSnapshot.Position->Vars;  pos->Parent = origin;  pos->Vars = this->VarTree.Push(origin);  return { this, pos };}cmStateSnapshot cmState::CreateMacroCallSnapshot(  cmStateSnapshot const& originSnapshot, std::string const& fileName){  cmStateDetail::PositionType pos =    this->SnapshotData.Push(originSnapshot.Position, *originSnapshot.Position);  pos->SnapshotType = cmStateEnums::MacroCallType;  pos->Keep = false;  pos->ExecutionListFile = this->ExecutionListFiles.Push(    originSnapshot.Position->ExecutionListFile, fileName);  assert(originSnapshot.Position->Vars.IsValid());  pos->BuildSystemDirectory->DirectoryEnd = pos;  pos->PolicyScope = originSnapshot.Position->Policies;  return { this, pos };}cmStateSnapshot cmState::CreateIncludeFileSnapshot(  cmStateSnapshot const& originSnapshot, std::string const& fileName){  cmStateDetail::PositionType pos =    this->SnapshotData.Push(originSnapshot.Position, *originSnapshot.Position);  pos->SnapshotType = cmStateEnums::IncludeFileType;  pos->Keep = true;  pos->ExecutionListFile = this->ExecutionListFiles.Push(    originSnapshot.Position->ExecutionListFile, fileName);  assert(originSnapshot.Position->Vars.IsValid());  pos->BuildSystemDirectory->DirectoryEnd = pos;  pos->PolicyScope = originSnapshot.Position->Policies;  return { this, pos };}cmStateSnapshot cmState::CreateVariableScopeSnapshot(  cmStateSnapshot const& originSnapshot){  cmStateDetail::PositionType pos =    this->SnapshotData.Push(originSnapshot.Position, *originSnapshot.Position);  pos->ScopeParent = originSnapshot.Position;  pos->SnapshotType = cmStateEnums::VariableScopeType;  pos->Keep = false;  pos->PolicyScope = originSnapshot.Position->Policies;  assert(originSnapshot.Position->Vars.IsValid());  cmLinkedTree<cmDefinitions>::iterator origin = originSnapshot.Position->Vars;  pos->Parent = origin;  pos->Vars = this->VarTree.Push(origin);  assert(pos->Vars.IsValid());  return { this, pos };}cmStateSnapshot cmState::CreateInlineListFileSnapshot(  cmStateSnapshot const& originSnapshot, std::string const& fileName){  cmStateDetail::PositionType pos =    this->SnapshotData.Push(originSnapshot.Position, *originSnapshot.Position);  pos->SnapshotType = cmStateEnums::InlineListFileType;  pos->Keep = true;  pos->ExecutionListFile = this->ExecutionListFiles.Push(    originSnapshot.Position->ExecutionListFile, fileName);  pos->BuildSystemDirectory->DirectoryEnd = pos;  pos->PolicyScope = originSnapshot.Position->Policies;  return { this, pos };}cmStateSnapshot cmState::CreatePolicyScopeSnapshot(  cmStateSnapshot const& originSnapshot){  cmStateDetail::PositionType pos =    this->SnapshotData.Push(originSnapshot.Position, *originSnapshot.Position);  pos->SnapshotType = cmStateEnums::PolicyScopeType;  pos->Keep = false;  pos->BuildSystemDirectory->DirectoryEnd = pos;  pos->PolicyScope = originSnapshot.Position->Policies;  return { this, pos };}cmStateSnapshot cmState::Pop(cmStateSnapshot const& originSnapshot){  cmStateDetail::PositionType pos = originSnapshot.Position;  cmStateDetail::PositionType prevPos = pos;  ++prevPos;  prevPos->IncludeDirectoryPosition =    prevPos->BuildSystemDirectory->IncludeDirectories.size();  prevPos->CompileDefinitionsPosition =    prevPos->BuildSystemDirectory->CompileDefinitions.size();  prevPos->CompileOptionsPosition =    prevPos->BuildSystemDirectory->CompileOptions.size();  prevPos->LinkOptionsPosition =    prevPos->BuildSystemDirectory->LinkOptions.size();  prevPos->LinkDirectoriesPosition =    prevPos->BuildSystemDirectory->LinkDirectories.size();  prevPos->BuildSystemDirectory->DirectoryEnd = prevPos;  if (!pos->Keep && this->SnapshotData.IsLast(pos)) {    if (pos->Vars != prevPos->Vars) {      assert(this->VarTree.IsLast(pos->Vars));      this->VarTree.Pop(pos->Vars);    }    if (pos->ExecutionListFile != prevPos->ExecutionListFile) {      assert(this->ExecutionListFiles.IsLast(pos->ExecutionListFile));      this->ExecutionListFiles.Pop(pos->ExecutionListFile);    }    this->SnapshotData.Pop(pos);  }  return { this, prevPos };}static bool ParseEntryWithoutType(const std::string& entry, std::string& var,                                  std::string& value){  // input line is:         key=value  static cmsys::RegularExpression reg(    "^([^=]*)=(.*[^\r\t ]|[\r\t ]*)[\r\t ]*$");  // input line is:         "key"=value  static cmsys::RegularExpression regQuoted(    "^\"([^\"]*)\"=(.*[^\r\t ]|[\r\t ]*)[\r\t ]*$");  bool flag = false;  if (regQuoted.find(entry)) {    var = regQuoted.match(1);    value = regQuoted.match(2);    flag = true;  } else if (reg.find(entry)) {    var = reg.match(1);    value = reg.match(2);    flag = true;  }  // if value is enclosed in single quotes ('foo') then remove them  // it is used to enclose trailing space or tab  if (flag && value.size() >= 2 && value.front() == '\'' &&      value.back() == '\'') {    value = value.substr(1, value.size() - 2);  }  return flag;}bool cmState::ParseCacheEntry(const std::string& entry, std::string& var,                              std::string& value,                              cmStateEnums::CacheEntryType& type){  // input line is:         key:type=value  static cmsys::RegularExpression reg(    "^([^=:]*):([^=]*)=(.*[^\r\t ]|[\r\t ]*)[\r\t ]*$");  // input line is:         "key":type=value  static cmsys::RegularExpression regQuoted(    "^\"([^\"]*)\":([^=]*)=(.*[^\r\t ]|[\r\t ]*)[\r\t ]*$");  bool flag = false;  if (regQuoted.find(entry)) {    var = regQuoted.match(1);    type = cmState::StringToCacheEntryType(regQuoted.match(2));    value = regQuoted.match(3);    flag = true;  } else if (reg.find(entry)) {    var = reg.match(1);    type = cmState::StringToCacheEntryType(reg.match(2));    value = reg.match(3);    flag = true;  }  // if value is enclosed in single quotes ('foo') then remove them  // it is used to enclose trailing space or tab  if (flag && value.size() >= 2 && value.front() == '\'' &&      value.back() == '\'') {    value = value.substr(1, value.size() - 2);  }  if (!flag) {    return ParseEntryWithoutType(entry, var, value);  }  return flag;}
 |