diff --git a/Source/cmSetCommand.cxx b/Source/cmSetCommand.cxx index 6065780d1..083f4226d 100644 --- a/Source/cmSetCommand.cxx +++ b/Source/cmSetCommand.cxx @@ -107,19 +107,21 @@ bool cmSetCommand::InitialPass(std::vector const& args) type = cmCacheManager::StringToType(args[cacheStart+1].c_str()); docstring = args[cacheStart+2].c_str(); } - // get the current cache value for the variable - const char* cacheValue = - m_Makefile->GetDefinition(variable); - if(cacheValue) + // see if this is already in the cache + cmCacheManager::CacheIterator it = + m_Makefile->GetCacheManager()->GetCacheIterator(variable); + if(!it.IsAtEnd()) { - // if it is not a cached value, or it is a cached - // value that is not internal keep the value found - // in the cache + // if the set is trying to CACHE the value but the value + // is already in the cache and the type is not internal + // then leave now without setting any definitions in the cache + // or the makefile if(cache && type != cmCacheManager::INTERNAL) { return true; } } + // if it is meant to be in the cache then define it in the cache if(cache) { diff --git a/Source/cmSetCommand.h b/Source/cmSetCommand.h index 720a805ea..2b55bd9b7 100644 --- a/Source/cmSetCommand.h +++ b/Source/cmSetCommand.h @@ -70,7 +70,8 @@ public: "SET(VAR [VALUE] [CACHE TYPE DOCSTRING])\n" "Within CMAKE sets VAR to the value VALUE. VALUE is expanded before VAR " "is set to it. If CACHE is present, then the VAR is put in the cache." - " TYPE and DOCSTRING are required. If TYPE is INTERNAL, then the " + " TYPE and DOCSTRING are required. TYPE may be BOOL, PATH, FILEPATH, STRING, INTERNAL, " + "or STATIC. If TYPE is INTERNAL, then the " " VALUE is Always written into the cache, replacing any values " "existing in the cache. If it is not a CACHE VAR, then this always " "writes into the current makefile.\n"