Remove CMake Policy CMP0015 until it is revised
We revert commit "Create CMake Policy CMP0015 to fix set(CACHE)" because the NEW behavior of the policy breaks a valid use case: # CMakeLists.txt option(BUILD_SHARED_LIBS "..." ON) add_library(mylib ...) set(BUILD_SHARED_LIBS OFF) # we want only mylib to be shared add_subdirectory(ThirdParty) # ThirdParty/CMakeLists.txt option(BUILD_SHARED_LIBS "..." ON) # uh, oh, with NEW behavior this dir uses shared libs!!! We'll re-introduce the policy later with a different change in behavior to resolve the motivating case, which was more subtle but less common. See issue #9008.
This commit is contained in:
parent
24bf97440f
commit
9a77f65da7
|
@ -1642,57 +1642,6 @@ void cmMakefile::AddDefinition(const char* name, const char* value)
|
|||
#endif
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void cmMakefile::UseCacheDefinition(cmCacheManager::CacheIterator const& it)
|
||||
{
|
||||
// Check for a local definition that might hide the cache value.
|
||||
const char* name = it.GetName();
|
||||
const char* def = this->Internal->VarStack.top().Get(name);
|
||||
if(!def)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// If the visible value will change then check policy CMP0015.
|
||||
const char* cache = it.GetValue();
|
||||
if(strcmp(def, cache) != 0)
|
||||
{
|
||||
cmOStringStream e;
|
||||
switch (this->GetPolicyStatus(cmPolicies::CMP0015))
|
||||
{
|
||||
case cmPolicies::WARN:
|
||||
e << "Local variable \"" << name << "\" is set to\n"
|
||||
<< " " << def << "\n"
|
||||
<< "but the CACHE entry of the same name is set to\n"
|
||||
<< " " << cache << "\n"
|
||||
<< "The local variable is hiding the cache value."
|
||||
<< "\n"
|
||||
<< this->GetPolicies()->GetPolicyWarning(cmPolicies::CMP0015);
|
||||
this->IssueMessage(cmake::AUTHOR_WARNING, e.str());
|
||||
case cmPolicies::OLD:
|
||||
// OLD behavior is to leave local definition.
|
||||
return;
|
||||
case cmPolicies::REQUIRED_IF_USED:
|
||||
case cmPolicies::REQUIRED_ALWAYS:
|
||||
e << "Local variable \"" << name << "\" is set to\n"
|
||||
<< " " << def << "\n"
|
||||
<< "but the CACHE entry of the same name is set to\n"
|
||||
<< " " << cache << "\n"
|
||||
<< "This command is removing the local variable to expose "
|
||||
<< "the cache value."
|
||||
<< "\n"
|
||||
<< this->GetPolicies()->GetRequiredPolicyError(cmPolicies::CMP0015);
|
||||
this->IssueMessage(cmake::FATAL_ERROR, e.str());
|
||||
case cmPolicies::NEW:
|
||||
// NEW behavior is to remove local definition (done below).
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the local definition to make the cache value visible.
|
||||
this->RemoveDefinition(name);
|
||||
}
|
||||
|
||||
|
||||
void cmMakefile::AddCacheDefinition(const char* name, const char* value,
|
||||
const char* doc,
|
||||
|
|
|
@ -285,11 +285,6 @@ public:
|
|||
cmCacheManager::CacheEntryType type,
|
||||
bool force = false);
|
||||
|
||||
/**
|
||||
* Update the variable scope to make the cache definition visible.
|
||||
*/
|
||||
void UseCacheDefinition(cmCacheManager::CacheIterator const& it);
|
||||
|
||||
/**
|
||||
* Add bool variable definition to the build.
|
||||
*/
|
||||
|
|
|
@ -53,7 +53,6 @@ bool cmOptionCommand
|
|||
if ( it.GetType() != cmCacheManager::UNINITIALIZED )
|
||||
{
|
||||
it.SetProperty("HELPSTRING", args[1].c_str());
|
||||
this->Makefile->UseCacheDefinition(it);
|
||||
return true;
|
||||
}
|
||||
if ( it.GetValue() )
|
||||
|
|
|
@ -401,37 +401,6 @@ cmPolicies::cmPolicies()
|
|||
"The OLD behavior for this policy is to silently ignore the problem. "
|
||||
"The NEW behavior for this policy is to report an error.",
|
||||
2,8,0, cmPolicies::WARN);
|
||||
|
||||
this->DefinePolicy(
|
||||
CMP0015, "CMP0015",
|
||||
"The set() CACHE mode and option() command make the cache value visible.",
|
||||
"In CMake 2.6 and below the CACHE mode of the set() command and the "
|
||||
"option() command did not expose the value from the named cache entry "
|
||||
"if it was already set both in the cache and as a local variable. "
|
||||
"This led to subtle differences between first and later configurations "
|
||||
"because a conflicting local variable would be overridden only when the "
|
||||
"cache value was first created. "
|
||||
"For example, the code\n"
|
||||
" set(x 1)\n"
|
||||
" set(before ${x})\n"
|
||||
" set(x 2 CACHE STRING \"X\")\n"
|
||||
" set(after ${x})\n"
|
||||
" message(STATUS \"${before},${after}\")\n"
|
||||
"would print \"1,2\" on the first run and \"1,1\" on future runs."
|
||||
"\n"
|
||||
"CMake 2.8.0 and above prefer to expose the cache value in all cases by "
|
||||
"removing the local variable definition, but this changes behavior in "
|
||||
"subtle cases when the local variable has a different value than that "
|
||||
"exposed from the cache. "
|
||||
"The example above will always print \"1,2\"."
|
||||
"\n"
|
||||
"This policy determines whether the commands should always expose the "
|
||||
"cache value. "
|
||||
"The OLD behavior for this policy is to leave conflicting local "
|
||||
"variable values untouched and hide the true cache value. "
|
||||
"The NEW behavior for this policy is to always expose the cache value.",
|
||||
2,8,0, cmPolicies::WARN);
|
||||
|
||||
}
|
||||
|
||||
cmPolicies::~cmPolicies()
|
||||
|
|
|
@ -50,7 +50,6 @@ public:
|
|||
CMP0012, // Strong handling of boolean constants
|
||||
CMP0013, // Duplicate binary directories not allowed
|
||||
CMP0014, // Input directories must have CMakeLists.txt
|
||||
CMP0015, // set(CACHE) and option() make CACHE value visible
|
||||
|
||||
// Always the last entry. Useful mostly to avoid adding a comma
|
||||
// the last policy when adding a new one.
|
||||
|
|
|
@ -155,7 +155,6 @@ bool cmSetCommand
|
|||
// or the makefile
|
||||
if(cache && type != cmCacheManager::INTERNAL && !force)
|
||||
{
|
||||
this->Makefile->UseCacheDefinition(it);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,10 +64,8 @@ public:
|
|||
" set(<variable> <value>\n"
|
||||
" [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])\n"
|
||||
"Within CMake sets <variable> to the value <value>. <value> is expanded"
|
||||
" before <variable> is set to it. If CACHE is present and <variable> "
|
||||
"is not yet in the cache, then <variable> is put in the cache. If it is "
|
||||
"already in the cache, <variable> is assigned the value stored in the "
|
||||
"cache. If CACHE is present, also <type> and <docstring> are "
|
||||
" before <variable> is set to it. If CACHE is present, then the "
|
||||
"<variable> is put in the cache. <type> and <docstring> are then "
|
||||
"required. <type> is used by the CMake GUI to choose a widget with "
|
||||
"which the user sets a value. The value for <type> may be one of\n"
|
||||
" FILEPATH = File chooser dialog.\n"
|
||||
|
|
Loading…
Reference in New Issue