Procházet zdrojové kódy

Introduce cmState::Snapshot.

Create snapshots for buildsystem directories during configure time.

This class will be extended in follow up commits to snapshot
all values in the cmState.
Stephen Kelly před 10 roky
rodič
revize
3a041c5949
4 změnil soubory, kde provedl 48 přidání a 2 odebrání
  1. 17 1
      Source/cmMakefile.cxx
  2. 1 1
      Source/cmMakefile.h
  3. 15 0
      Source/cmState.cxx
  4. 15 0
      Source/cmState.h

+ 17 - 1
Source/cmMakefile.cxx

@@ -54,7 +54,10 @@ public:
 
 // default is not to be building executables
 cmMakefile::cmMakefile(cmLocalGenerator* localGenerator)
-  : Internal(new Internals)
+  : Internal(new Internals),
+    LocalGenerator(localGenerator),
+    StateSnapshot(localGenerator->GetGlobalGenerator()
+                                ->GetCMakeInstance()->GetState())
 {
   const cmDefinitions& defs = cmDefinitions();
   const std::set<std::string> globalKeys = defs.LocalKeys();
@@ -63,6 +66,19 @@ cmMakefile::cmMakefile(cmLocalGenerator* localGenerator)
   this->Internal->VarUsageStack.push(globalKeys);
   this->Internal->IsSourceFileTryCompile = false;
 
+  if (this->LocalGenerator->GetParent())
+    {
+    cmMakefile* parentMf = this->LocalGenerator->GetParent()->GetMakefile();
+    this->StateSnapshot =
+        this->GetState()->CreateSnapshot(parentMf->StateSnapshot);
+    }
+  else
+    {
+    this->StateSnapshot =
+        this->GetState()->CreateSnapshot(this->StateSnapshot);
+    }
+
+
   // Initialize these first since AddDefaultDefinitions calls AddDefinition
   this->WarnUnused = false;
   this->CheckSystemVars = false;

+ 1 - 1
Source/cmMakefile.h

@@ -922,7 +922,7 @@ private:
   cmMakefile& operator=(const cmMakefile& mf);
   void Initialize();
 
-
+  cmState::Snapshot StateSnapshot;
 
   bool ReadListFileInternal(const char* filenametoread,
                             bool noPolicyScope,

+ 15 - 0
Source/cmState.cxx

@@ -22,6 +22,7 @@ cmState::cmState(cmake* cm)
   : CMakeInstance(cm),
     IsInTryCompile(false)
 {
+  this->CreateSnapshot(Snapshot());
   this->Initialize();
 }
 
@@ -466,3 +467,17 @@ const char* cmState::GetBinaryDirectory() const
 {
   return this->BinaryDirectory.c_str();
 }
+
+cmState::Snapshot cmState::CreateSnapshot(Snapshot originSnapshot)
+{
+  PositionType pos = this->ParentPositions.size();
+  this->ParentPositions.push_back(originSnapshot.Position);
+  return cmState::Snapshot(this, pos);
+}
+
+cmState::Snapshot::Snapshot(cmState* state, PositionType position)
+  : State(state),
+  Position(position)
+{
+
+}

+ 15 - 0
Source/cmState.h

@@ -21,10 +21,24 @@ class cmCommand;
 
 class cmState
 {
+  typedef std::vector<std::string>::size_type PositionType;
+  friend class Snapshot;
 public:
   cmState(cmake* cm);
   ~cmState();
 
+  class Snapshot {
+  public:
+    Snapshot(cmState* state = 0, PositionType position = 0);
+
+  private:
+    friend class cmState;
+    cmState* State;
+    cmState::PositionType Position;
+  };
+
+  Snapshot CreateSnapshot(Snapshot originSnapshot);
+
   enum CacheEntryType{ BOOL=0, PATH, FILEPATH, STRING, INTERNAL,STATIC,
                        UNINITIALIZED };
   static CacheEntryType StringToCacheEntryType(const char*);
@@ -106,6 +120,7 @@ private:
   std::map<std::string, cmCommand*> Commands;
   cmPropertyMap GlobalProperties;
   cmake* CMakeInstance;
+  std::vector<PositionType> ParentPositions;
   std::string SourceDirectory;
   std::string BinaryDirectory;
   bool IsInTryCompile;