From 0be0283f30c58c82797579ca19cf0adf9b83dbad Mon Sep 17 00:00:00 2001 From: Alexander Neundorf Date: Fri, 1 Jun 2007 14:16:46 -0400 Subject: [PATCH] BUG: also put a variable into the cache when defined using -D if no type is given, then STRING is used. Also add command line option -U as suggested for undefining cache variables. This fixes #4896 and #4264. Alex --- Source/cmake.cxx | 49 +++++++++++++++++++++++++++++++++++++++++++++++- Source/cmake.h | 5 +++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 973fc2088..aae773ff4 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -299,7 +299,7 @@ bool cmake::SetCacheArgs(const std::vector& args) { this->CacheManager->AddCacheEntry(var.c_str(), value.c_str(), "No help, variable specified on the command line.", - type); + type==cmCacheManager::UNINITIALIZED?cmCacheManager::STRING:type); } else { @@ -309,6 +309,49 @@ bool cmake::SetCacheArgs(const std::vector& args) return false; } } + else if(arg.find("-U",0) == 0) + { + std::string entryPattern = arg.substr(2); + if(entryPattern.size() == 0) + { + ++i; + if(i < args.size()) + { + entryPattern = args[i]; + } + else + { + cmSystemTools::Error("-U must be followed with VAR."); + return false; + } + } + + //go through all cache entries and collect the vars which will be removed + std::vector entriesToDelete; + cmCacheManager::CacheIterator it = + this->CacheManager->GetCacheIterator(); + for ( it.Begin(); !it.IsAtEnd(); it.Next() ) + { + cmCacheManager::CacheEntryType t = it.GetType(); + if(t != cmCacheManager::STATIC && t != cmCacheManager::UNINITIALIZED) + { + std::string entryName = it.GetName(); + if (entryName.find(entryPattern) != std::string::npos) + { + entriesToDelete.push_back(entryName); + } + } + } + + // now remove them from the cache + for(std::vector::const_iterator currentEntry = + entriesToDelete.begin(); + currentEntry != entriesToDelete.end(); + ++currentEntry) + { + this->CacheManager->RemoveCacheEntry(currentEntry->c_str()); + } + } else if(arg.find("-C",0) == 0) { std::string path = arg.substr(2); @@ -432,6 +475,10 @@ void cmake::SetArgs(const std::vector& args) { // skip for now } + else if(arg.find("-U",0) == 0) + { + // skip for now + } else if(arg.find("-C",0) == 0) { // skip for now diff --git a/Source/cmake.h b/Source/cmake.h index d0ba30074..c1485155f 100644 --- a/Source/cmake.h +++ b/Source/cmake.h @@ -388,6 +388,11 @@ private: "for the project. This option may be used to specify a setting " \ "that takes priority over the project's default value. The option " \ "may be repeated for as many cache entries as desired."}, \ + {"-U ", "Remove one or more cmake cache entries.", \ + "This option may be used to remove one or more variables from the " \ + "CMakeCache.txt file, so that CMake will search them again. All " \ + "variables which contain \"\" will be removed. The option may be "\ + "repeated for as many cache entries as desired."}, \ {"-G ", "Specify a makefile generator.", \ "CMake may support multiple native build systems on certain platforms. " \ "A makefile generator is responsible for generating a particular build " \