Browse Source

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.
Brad King 16 years ago
parent
commit
9a77f65da7

+ 0 - 51
Source/cmMakefile.cxx

@@ -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,

+ 0 - 5
Source/cmMakefile.h

@@ -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. 
    */

+ 0 - 1
Source/cmOptionCommand.cxx

@@ -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() )

+ 0 - 31
Source/cmPolicies.cxx

@@ -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()

+ 0 - 1
Source/cmPolicies.h

@@ -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.

+ 0 - 1
Source/cmSetCommand.cxx

@@ -155,7 +155,6 @@ bool cmSetCommand
     // or the makefile
     if(cache && type != cmCacheManager::INTERNAL && !force)
       {
-      this->Makefile->UseCacheDefinition(it);
       return true;
       }
     }

+ 2 - 4
Source/cmSetCommand.h

@@ -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"