Explorar o código

ENH: Added check of CMAKE_BACKWARDS_COMPATIBILITY to skip the CMake system path search when simulating CMake 2.2 and earlier.

Brad King %!s(int64=20) %!d(string=hai) anos
pai
achega
2b197edb8a
Modificáronse 1 ficheiros con 54 adicións e 3 borrados
  1. 54 3
      Source/cmFindBase.cxx

+ 54 - 3
Source/cmFindBase.cxx

@@ -98,7 +98,15 @@ cmFindBase::cmFindBase()
     "   \"LAST\"   - Try to find frameworks after standard\n"
     "   \"LAST\"   - Try to find frameworks after standard\n"
     "              libraries or headers.\n"
     "              libraries or headers.\n"
     "   \"ONLY\"   - Only try to find frameworks.\n"
     "   \"ONLY\"   - Only try to find frameworks.\n"
-    "   \"NEVER\". - Never try to find frameworks.\n";
+    "   \"NEVER\". - Never try to find frameworks.\n"
+    "The reason the paths listed in the call to the command are searched "
+    "last is that most users of CMake would expect things to be found "
+    "first in the locations specified by their environment. Projects may "
+    "override this behavior by simply calling the command twice:\n"
+    "   FIND_XXX(<VAR> NAMES name PATHS paths NO_DEFAULT_PATH)\n"
+    "   FIND_XXX(<VAR> NAMES name)\n"
+    "Once one of these calls succeeds the result variable will be set "
+    "and stored in the cache so that neither call will search again.";
 }
 }
   
   
 bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
 bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
@@ -108,6 +116,24 @@ bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
     this->SetError("called with incorrect number of arguments");
     this->SetError("called with incorrect number of arguments");
     return false;
     return false;
     }
     }
+
+  // CMake versions below 2.3 did not search all these extra
+  // locations.  Preserve compatibility unless a modern argument is
+  // passed.
+  bool compatibility = false;
+  const char* versionValue =
+    this->Makefile->GetDefinition("CMAKE_BACKWARDS_COMPATIBILITY");
+  int major = 0;
+  int minor = 0;
+  if(versionValue && sscanf(versionValue, "%d.%d", &major, &minor) != 2)
+    {
+    versionValue = 0;
+    }
+  if(versionValue && (major < 2 || major == 2 && minor < 3))
+    {
+    compatibility = true;
+    }
+
   // copy argsIn into args so it can be modified,
   // copy argsIn into args so it can be modified,
   // in the process extract the DOC "documentation" 
   // in the process extract the DOC "documentation" 
   size_t size = argsIn.size();
   size_t size = argsIn.size();
@@ -175,14 +201,23 @@ bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
       doingPathSuf = false;
       doingPathSuf = false;
       }
       }
     else if (args[j] == "PATH_SUFFIXES")
     else if (args[j] == "PATH_SUFFIXES")
-      { 
+      {
+      compatibility = false;
       doingPathSuf = true;
       doingPathSuf = true;
       newStyle = true;
       newStyle = true;
       doingNames = false;
       doingNames = false;
       doingPaths = false;
       doingPaths = false;
       }
       }
-    else if (args[j] == "NO_DEFAULT_PATH" || args[j] == "NO_SYSTEM_PATH")
+    else if (args[j] == "NO_SYSTEM_PATH")
+      {
+      doingPaths = false;
+      doingPathSuf = false;
+      doingNames = false;
+      this->NoDefaultPath = true;
+      }
+    else if (args[j] == "NO_DEFAULT_PATH")
       {
       {
+      compatibility = false;
       doingPaths = false;
       doingPaths = false;
       doingPathSuf = false;
       doingPathSuf = false;
       doingNames = false;
       doingNames = false;
@@ -190,6 +225,7 @@ bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
       }
       }
     else if (args[j] == "NO_CMAKE_ENVIRONMENT_PATH")
     else if (args[j] == "NO_CMAKE_ENVIRONMENT_PATH")
       {
       {
+      compatibility = false;
       doingPaths = false;
       doingPaths = false;
       doingPathSuf = false;
       doingPathSuf = false;
       doingNames = false;
       doingNames = false;
@@ -197,6 +233,7 @@ bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
       }
       }
     else if (args[j] == "NO_CMAKE_PATH")
     else if (args[j] == "NO_CMAKE_PATH")
       {
       {
+      compatibility = false;
       doingPaths = false;
       doingPaths = false;
       doingPathSuf = false;
       doingPathSuf = false;
       doingNames = false;
       doingNames = false;
@@ -204,6 +241,7 @@ bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
       }
       }
     else if (args[j] == "NO_SYSTEM_ENVIRONMENT_PATH")
     else if (args[j] == "NO_SYSTEM_ENVIRONMENT_PATH")
       {
       {
+      compatibility = false;
       doingPaths = false;
       doingPaths = false;
       doingPathSuf = false;
       doingPathSuf = false;
       doingNames = false;
       doingNames = false;
@@ -211,6 +249,7 @@ bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
       }
       }
     else if (args[j] == "NO_CMAKE_SYSTEM_PATH")
     else if (args[j] == "NO_CMAKE_SYSTEM_PATH")
       {
       {
+      compatibility = false;
       doingPaths = false;
       doingPaths = false;
       doingPathSuf = false;
       doingPathSuf = false;
       doingNames = false;
       doingNames = false;
@@ -232,6 +271,18 @@ bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn)
         }
         }
       }
       }
     }
     }
+
+  // Now that arguments have been parsed check the compatibility
+  // setting.  If we need to be compatible with CMake 2.2 and earlier
+  // do not add the CMake system paths.  It is safe to add the CMake
+  // environment paths and system environment paths because that
+  // existed in 2.2.  It is safe to add the CMake user variable paths
+  // because the user or project has explicitly set them.
+  if(compatibility)
+    {
+    this->NoCMakeSystemPath = true;
+    }
+
   if(this->VariableDocumentation.size() == 0)
   if(this->VariableDocumentation.size() == 0)
     {
     {
     this->VariableDocumentation = "Whare can ";
     this->VariableDocumentation = "Whare can ";