Browse Source

1. Added EXCLUDE option to LOAD_CACHE.
2. Entries brought in from another cache are now marked as internal.

Berk Geveci 24 năm trước cách đây
mục cha
commit
06a0f67f93
3 tập tin đã thay đổi với 72 bổ sung13 xóa
  1. 42 8
      Source/cmCacheManager.cxx
  2. 2 0
      Source/cmCacheManager.h
  3. 28 5
      Source/cmLoadCacheCommand.cxx

+ 42 - 8
Source/cmCacheManager.cxx

@@ -106,8 +106,17 @@ bool cmCacheManager::LoadCache(const char* path)
 {
   return this->LoadCache(path,true);
 }
+
 bool cmCacheManager::LoadCache(const char* path,
 			       bool internal)
+{
+  std::set<std::string> emptySet;
+  return this->LoadCache(path, internal, emptySet);
+}
+
+bool cmCacheManager::LoadCache(const char* path,
+			       bool internal,
+			       std::set<std::string>& excludes)
 {
   std::string cacheFile = path;
   cacheFile += "/CMakeCache.txt";
@@ -127,6 +136,9 @@ bool cmCacheManager::LoadCache(const char* path,
   cmRegularExpression reg("^([^:]*):([^=]*)=(.*[^\t ]|[\t ]*)[\t ]*$");
   // input line is:         "key":type=value
   cmRegularExpression regQuoted("^\"([^\"]*)\":([^=]*)=(.*[^\t ]|[\t ]*)[\t ]*$");
+
+  std::set<std::string>::const_iterator iter;
+  std::string entryKey;
   while(fin)
     {
     // Format is key:type=value
@@ -148,22 +160,44 @@ bool cmCacheManager::LoadCache(const char* path,
       }
     if(regQuoted.find(buffer))
       {
-      e.m_Type = cmCacheManager::StringToType(regQuoted.match(2).c_str());
-      // only load internal values if internal is set
-      if (internal || e.m_Type != INTERNAL)
+      entryKey = regQuoted.match(1);
+      if ( excludes.find(entryKey) == excludes.end() )
 	{
+	e.m_Type = cmCacheManager::StringToType(regQuoted.match(2).c_str());
+	// only load internal values if internal is set
+	if (internal || e.m_Type != INTERNAL)
+	  {
+	  // If we are loading the cache from another project,
+	  // make all loaded entries internal so that it is
+	  // not visible in the gui
+	  if (!internal)
+	    {
+	    e.m_Type = INTERNAL;
+	    }
 	  e.m_Value = regQuoted.match(3);
-	  m_Cache[regQuoted.match(1)] = e;
+	  m_Cache[entryKey] = e;
+	  }
 	}
       }
     else if (reg.find(buffer))
       {
-      e.m_Type = cmCacheManager::StringToType(reg.match(2).c_str());
-      // only load internal values if internal is set
-      if (internal || e.m_Type != INTERNAL)
+      entryKey = reg.match(1);
+      if ( excludes.find(entryKey) == excludes.end() )
 	{
+	e.m_Type = cmCacheManager::StringToType(reg.match(2).c_str());
+	// only load internal values if internal is set
+	if (internal || e.m_Type != INTERNAL)
+	  {
+	  // If we are loading the cache from another project,
+	  // make all loaded entries internal so that it is
+	  // not visible in the gui
+	  if (!internal)
+	    {
+	    e.m_Type = INTERNAL;
+	    }
 	  e.m_Value = reg.match(3);
-	  m_Cache[reg.match(1)] = e;
+	  m_Cache[entryKey] = e;
+	  }
 	}
       }
     else

+ 2 - 0
Source/cmCacheManager.h

@@ -78,6 +78,8 @@ public:
   ///! Load a cache for given makefile.  Loads from path/CMakeCache.txt.
   bool LoadCache(const char* path);
   bool LoadCache(const char* path, bool internal);
+  bool LoadCache(const char* path, bool internal, 
+		 std::set<std::string>& excludes);
 
   ///! Put cache definitions into makefile
   void DefineCache(cmMakefile*); 

+ 28 - 5
Source/cmLoadCacheCommand.cxx

@@ -21,16 +21,39 @@ bool cmLoadCacheCommand::InitialPass(std::vector<std::string>& args)
 {
   if (args.size()< 1)
     {
-      this->SetError("called with wrong number of arguments.");
+    this->SetError("called with wrong number of arguments.");
     }
   
-  for( unsigned int i=0; i< args.size(); i++)
+  bool excludeFiles=false;
+  unsigned int excludeIndex=0;
+  unsigned int i;
+  std::set<std::string> excludes;
+
+  for(i=0; i<args.size(); i++)
     {
-      m_Makefile->ExpandVariablesInString( args[i]);
-      cmCacheManager::GetInstance()->LoadCache(args[i].c_str(),false);
-      cmCacheManager::GetInstance()->DefineCache(m_Makefile);
+    if (excludeFiles)
+      {
+      m_Makefile->ExpandVariablesInString(args[i]);
+      excludes.insert(args[i]);
+      }
+    if (args[i] == "EXCLUDE")
+      {
+      excludeFiles=true;
+      }
     }
 
+  for(i=0; i<args.size(); i++)
+    {
+    if (args[i] == "EXCLUDE")
+      {
+      break;
+      }
+    m_Makefile->ExpandVariablesInString(args[i]);
+    cmCacheManager::GetInstance()->LoadCache(args[i].c_str(),false,excludes);
+    cmCacheManager::GetInstance()->DefineCache(m_Makefile);
+    }
+
+
   return true;
 }