Browse Source

Merge topic 'find_package-improve-messages'

eeaaffc find_package: Test error and warning messages in failure cases
52dffb9 Merge branch 'test-CMakeCommands' into find_package-improve-messages
d365104 find_package: Optionally warn when implicitly using Config mode
31ead5f find_package: Reject mixed use of MODULE- and CONFIG-only options
6d83083 find_package: mention requested version number in error message
9c39bbd find_package: add CONFIG mode keyword alias for NO_MODULE
f310f67 find_package: add MODULE mode to use only Find-modules
7d67dcf find_package: improve error message when no Find module is present
978d89b find_package: rename NoModule to UseFindModules
David Cole 14 years ago
parent
commit
0ee7b8ea03
34 changed files with 532 additions and 72 deletions
  1. 20 0
      Source/cmDocumentVariables.cxx
  2. 191 71
      Source/cmFindPackageCommand.cxx
  3. 3 1
      Source/cmFindPackageCommand.h
  4. 1 0
      Tests/CMakeCommands/CMakeLists.txt
  5. 3 0
      Tests/CMakeCommands/find_package/CMakeLists.txt
  6. 13 0
      Tests/CMakeCommands/find_package/MissingConfig-stderr.txt
  7. 1 0
      Tests/CMakeCommands/find_package/MissingConfig.cmake
  8. 10 0
      Tests/CMakeCommands/find_package/MissingConfigOneName-stderr.txt
  9. 1 0
      Tests/CMakeCommands/find_package/MissingConfigOneName.cmake
  10. 1 0
      Tests/CMakeCommands/find_package/MissingConfigRequired-result.txt
  11. 13 0
      Tests/CMakeCommands/find_package/MissingConfigRequired-stderr.txt
  12. 1 0
      Tests/CMakeCommands/find_package/MissingConfigRequired.cmake
  13. 13 0
      Tests/CMakeCommands/find_package/MissingConfigVersion-stderr.txt
  14. 1 0
      Tests/CMakeCommands/find_package/MissingConfigVersion.cmake
  15. 21 0
      Tests/CMakeCommands/find_package/MissingModule-stderr.txt
  16. 1 0
      Tests/CMakeCommands/find_package/MissingModule.cmake
  17. 1 0
      Tests/CMakeCommands/find_package/MissingModuleRequired-result.txt
  18. 21 0
      Tests/CMakeCommands/find_package/MissingModuleRequired-stderr.txt
  19. 1 0
      Tests/CMakeCommands/find_package/MissingModuleRequired.cmake
  20. 17 0
      Tests/CMakeCommands/find_package/MissingNormal-stderr.txt
  21. 1 0
      Tests/CMakeCommands/find_package/MissingNormal.cmake
  22. 1 0
      Tests/CMakeCommands/find_package/MissingNormalRequired-result.txt
  23. 17 0
      Tests/CMakeCommands/find_package/MissingNormalRequired-stderr.txt
  24. 1 0
      Tests/CMakeCommands/find_package/MissingNormalRequired.cmake
  25. 17 0
      Tests/CMakeCommands/find_package/MissingNormalVersion-stderr.txt
  26. 1 0
      Tests/CMakeCommands/find_package/MissingNormalVersion.cmake
  27. 30 0
      Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleNew-stderr.txt
  28. 3 0
      Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleNew.cmake
  29. 29 0
      Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld-stderr.txt
  30. 2 0
      Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld.cmake
  31. 1 0
      Tests/CMakeCommands/find_package/MixedModeOptions-result.txt
  32. 14 0
      Tests/CMakeCommands/find_package/MixedModeOptions-stderr.txt
  33. 1 0
      Tests/CMakeCommands/find_package/MixedModeOptions.cmake
  34. 80 0
      Tests/CMakeCommands/find_package/test.cmake

+ 20 - 0
Source/cmDocumentVariables.cxx

@@ -745,6 +745,26 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
      "this package from the cache using the cache editor or cmake -U", false,
      "Variables That Change Behavior");
 
+  cm->DefineProperty
+    ("CMAKE_FIND_PACKAGE_WARN_NO_MODULE", cmProperty::VARIABLE,
+     "Tell find_package to warn if called without an explicit mode.",
+     "If find_package is called without an explicit mode option "
+     "(MODULE, CONFIG or NO_MODULE) and no Find<pkg>.cmake module is "
+     "in CMAKE_MODULE_PATH then CMake implicitly assumes that the "
+     "caller intends to search for a package configuration file.  "
+     "If no package configuration file is found then the wording "
+     "of the failure message must account for both the case that the "
+     "package is really missing and the case that the project has a "
+     "bug and failed to provide the intended Find module.  "
+     "If instead the caller specifies an explicit mode option then "
+     "the failure message can be more specific."
+     "\n"
+     "Set CMAKE_FIND_PACKAGE_WARN_NO_MODULE to TRUE to tell find_package "
+     "to warn when it implicitly assumes Config mode.  "
+     "This helps developers enforce use of an explicit mode in all calls "
+     "to find_package within a project.", false,
+     "Variables That Change Behavior");
+
   cm->DefineProperty
     ("CMAKE_USER_MAKE_RULES_OVERRIDE", cmProperty::VARIABLE,
      "Specify a CMake file that overrides platform information.",

+ 191 - 71
Source/cmFindPackageCommand.cxx

@@ -57,7 +57,8 @@ cmFindPackageCommand::cmFindPackageCommand()
   this->NoUserRegistry = false;
   this->NoSystemRegistry = false;
   this->NoBuilds = false;
-  this->NoModule = false;
+  this->UseConfigFiles = true;
+  this->UseFindModules = true;
   this->DebugMode = false;
   this->UseLib64Paths = false;
   this->PolicyScope = true;
@@ -72,6 +73,7 @@ cmFindPackageCommand::cmFindPackageCommand()
   this->VersionFoundPatch = 0;
   this->VersionFoundTweak = 0;
   this->VersionFoundCount = 0;
+  this->RequiredCMakeVersion = 0;
 }
 
 //----------------------------------------------------------------------------
@@ -86,7 +88,7 @@ void cmFindPackageCommand::GenerateDocumentation()
   cmSystemTools::ReplaceString(this->GenericDocumentationPathsOrder,
                                "FIND_XXX", "find_package");
   this->CommandDocumentation =
-    "  find_package(<package> [version] [EXACT] [QUIET]\n"
+    "  find_package(<package> [version] [EXACT] [QUIET] [MODULE]\n"
     "               [[REQUIRED|COMPONENTS] [components...]]\n"
     "               [NO_POLICY_SCOPE])\n"
     "Finds and loads settings from an external project.  "
@@ -94,6 +96,7 @@ void cmFindPackageCommand::GenerateDocumentation()
     "When the package is found package-specific information is provided "
     "through variables documented by the package itself.  "
     "The QUIET option disables messages if the package cannot be found.  "
+    "The MODULE option disables the second signature documented below.  "
     "The REQUIRED option stops processing with an error message if the "
     "package cannot be found.  "
     "A package-specific list of components may be listed after the "
@@ -124,10 +127,12 @@ void cmFindPackageCommand::GenerateDocumentation()
     "and producing any needed messages.  "
     "Many find-modules provide limited or no support for versioning; "
     "check the module documentation.  "
-    "If no module is found the command proceeds to Config mode.\n"
+    "If no module is found and the MODULE option is not given the command "
+    "proceeds to Config mode.\n"
     "The complete Config mode command signature is:\n"
     "  find_package(<package> [version] [EXACT] [QUIET]\n"
-    "               [[REQUIRED|COMPONENTS] [components...]] [NO_MODULE]\n"
+    "               [[REQUIRED|COMPONENTS] [components...]]\n"
+    "               [CONFIG|NO_MODULE]\n"
     "               [NO_POLICY_SCOPE]\n"
     "               [NAMES name1 [name2 ...]]\n"
     "               [CONFIGS config1 [config2 ...]]\n"
@@ -145,9 +150,10 @@ void cmFindPackageCommand::GenerateDocumentation()
     "               [CMAKE_FIND_ROOT_PATH_BOTH |\n"
     "                ONLY_CMAKE_FIND_ROOT_PATH |\n"
     "                NO_CMAKE_FIND_ROOT_PATH])\n"
-    "The NO_MODULE option may be used to skip Module mode explicitly.  "
-    "It is also implied by use of options not specified in the reduced "
-    "signature.  "
+    "The CONFIG option may be used to skip Module mode explicitly and "
+    "switch to Config mode.  It is synonymous to using NO_MODULE.  "
+    "Config mode is also implied by use of options not specified in the "
+    "reduced signature.  "
     "\n"
     "Config mode attempts to locate a configuration file provided by the "
     "package to be found.  A cache entry called <package>_DIR is created to "
@@ -367,6 +373,15 @@ bool cmFindPackageCommand
     return false;
     }
 
+  // Lookup required version of CMake.
+  if(const char* rv =
+     this->Makefile->GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION"))
+    {
+    unsigned int v[3] = {0,0,0};
+    sscanf(rv, "%u.%u.%u", &v[0], &v[1], &v[2]);
+    this->RequiredCMakeVersion = CMake_VERSION_ENCODE(v[0],v[1],v[2]);
+    }
+
   // Check for debug mode.
   this->DebugMode = this->Makefile->IsOn("CMAKE_FIND_DEBUG_MODE");
 
@@ -410,6 +425,8 @@ bool cmFindPackageCommand
   Doing doing = DoingNone;
   cmsys::RegularExpression version("^[0-9.]+$");
   bool haveVersion = false;
+  std::set<unsigned int> configArgs;
+  std::set<unsigned int> moduleArgs;
   for(unsigned int i=1; i < args.size(); ++i)
     {
     if(args[i] == "QUIET")
@@ -423,9 +440,19 @@ bool cmFindPackageCommand
       this->Compatibility_1_6 = false;
       doing = DoingNone;
       }
+    else if(args[i] == "MODULE")
+      {
+      moduleArgs.insert(i);
+      doing = DoingNone;
+      }
+    else if(args[i] == "CONFIG")
+      {
+      configArgs.insert(i);
+      doing = DoingNone;
+      }
     else if(args[i] == "NO_MODULE")
       {
-      this->NoModule = true;
+      configArgs.insert(i);
       doing = DoingNone;
       }
     else if(args[i] == "REQUIRED")
@@ -440,31 +467,31 @@ bool cmFindPackageCommand
       }
     else if(args[i] == "NAMES")
       {
-      this->NoModule = true;
+      configArgs.insert(i);
       this->Compatibility_1_6 = false;
       doing = DoingNames;
       }
     else if(args[i] == "PATHS")
       {
-      this->NoModule = true;
+      configArgs.insert(i);
       this->Compatibility_1_6 = false;
       doing = DoingPaths;
       }
     else if(args[i] == "HINTS")
       {
-      this->NoModule = true;
+      configArgs.insert(i);
       this->Compatibility_1_6 = false;
       doing = DoingHints;
       }
     else if(args[i] == "PATH_SUFFIXES")
       {
-      this->NoModule = true;
+      configArgs.insert(i);
       this->Compatibility_1_6 = false;
       doing = DoingPathSuffixes;
       }
     else if(args[i] == "CONFIGS")
       {
-      this->NoModule = true;
+      configArgs.insert(i);
       this->Compatibility_1_6 = false;
       doing = DoingConfigs;
       }
@@ -477,27 +504,27 @@ bool cmFindPackageCommand
     else if(args[i] == "NO_CMAKE_PACKAGE_REGISTRY")
       {
       this->NoUserRegistry = true;
-      this->NoModule = true;
+      configArgs.insert(i);
       this->Compatibility_1_6 = false;
       doing = DoingNone;
       }
     else if(args[i] == "NO_CMAKE_SYSTEM_PACKAGE_REGISTRY")
       {
       this->NoSystemRegistry = true;
-      this->NoModule = true;
+      configArgs.insert(i);
       this->Compatibility_1_6 = false;
       doing = DoingNone;
       }
     else if(args[i] == "NO_CMAKE_BUILDS_PATH")
       {
       this->NoBuilds = true;
-      this->NoModule = true;
+      configArgs.insert(i);
       this->Compatibility_1_6 = false;
       doing = DoingNone;
       }
     else if(this->CheckCommonArgument(args[i]))
       {
-      this->NoModule = true;
+      configArgs.insert(i);
       this->Compatibility_1_6 = false;
       doing = DoingNone;
       }
@@ -557,6 +584,29 @@ bool cmFindPackageCommand
       }
     }
 
+  // Maybe choose one mode exclusively.
+  this->UseFindModules = configArgs.empty();
+  this->UseConfigFiles = moduleArgs.empty();
+  if(!this->UseFindModules && !this->UseConfigFiles)
+    {
+    cmOStringStream e;
+    e << "given options exclusive to Module mode:\n";
+    for(std::set<unsigned int>::const_iterator si = moduleArgs.begin();
+        si != moduleArgs.end(); ++si)
+      {
+      e << "  " << args[*si] << "\n";
+      }
+    e << "and options exclusive to Config mode:\n";
+    for(std::set<unsigned int>::const_iterator si = configArgs.begin();
+        si != configArgs.end(); ++si)
+      {
+      e << "  " << args[*si] << "\n";
+      }
+    e << "The options are incompatible.";
+    this->SetError(e.str().c_str());
+    return false;
+    }
+
   // Ignore EXACT with no version.
   if(this->Version.empty() && this->VersionExact)
     {
@@ -636,7 +686,7 @@ bool cmFindPackageCommand
   this->SetModuleVariables(components);
 
   // See if there is a Find<package>.cmake module.
-  if(!this->NoModule)
+  if(this->UseFindModules)
     {
     bool foundModule = false;
     if(!this->FindModule(foundModule))
@@ -651,6 +701,37 @@ bool cmFindPackageCommand
       }
     }
 
+  if(this->UseFindModules && this->UseConfigFiles &&
+     this->Makefile->IsOn("CMAKE_FIND_PACKAGE_WARN_NO_MODULE"))
+    {
+    cmOStringStream aw;
+    if(this->RequiredCMakeVersion >= CMake_VERSION_ENCODE(2,8,8))
+      {
+      aw << "find_package called without either MODULE or CONFIG option and "
+        "no Find" << this->Name << ".cmake module is in CMAKE_MODULE_PATH.  "
+        "Add MODULE to exclusively request Module mode and fail if "
+        "Find" << this->Name << ".cmake is missing.  "
+        "Add CONFIG to exclusively request Config mode and search for a "
+        "package configuration file provided by " << this->Name <<
+        " (" << this->Name << "Config.cmake or " <<
+        cmSystemTools::LowerCase(this->Name) << "-config.cmake).  ";
+      }
+    else
+      {
+      aw << "find_package called without NO_MODULE option and no "
+        "Find" << this->Name << ".cmake module is in CMAKE_MODULE_PATH.  "
+        "Add NO_MODULE to exclusively request Config mode and search for a "
+        "package configuration file provided by " << this->Name <<
+        " (" << this->Name << "Config.cmake or " <<
+        cmSystemTools::LowerCase(this->Name) << "-config.cmake).  "
+        "Otherwise make Find" << this->Name << ".cmake available in "
+        "CMAKE_MODULE_PATH.";
+      }
+    aw << "\n"
+      "(Variable CMAKE_FIND_PACKAGE_WARN_NO_MODULE enabled this warning.)";
+    this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, aw.str());
+    }
+
   // No find module.  Assume the project has a CMake config file.  Use
   // a <package>_DIR cache variable to locate it.
   this->Variable = this->Name;
@@ -831,41 +912,44 @@ bool cmFindPackageCommand::HandlePackageMode()
 
   // Try to load the config file if the directory is known
   bool fileFound = false;
-  if(!cmSystemTools::IsOff(def))
+  if (this->UseConfigFiles)
     {
-    // Get the directory from the variable value.
-    std::string dir = def;
-    cmSystemTools::ConvertToUnixSlashes(dir);
-
-    // Treat relative paths with respect to the current source dir.
-    if(!cmSystemTools::FileIsFullPath(dir.c_str()))
+    if(!cmSystemTools::IsOff(def))
       {
-      dir = "/" + dir;
-      dir = this->Makefile->GetCurrentDirectory() + dir;
+      // Get the directory from the variable value.
+      std::string dir = def;
+      cmSystemTools::ConvertToUnixSlashes(dir);
+
+      // Treat relative paths with respect to the current source dir.
+      if(!cmSystemTools::FileIsFullPath(dir.c_str()))
+        {
+        dir = "/" + dir;
+        dir = this->Makefile->GetCurrentDirectory() + dir;
+        }
+      // The file location was cached.  Look for the correct file.
+      std::string file;
+      if (this->FindConfigFile(dir, file))
+        {
+        this->FileFound = file;
+        fileFound = true;
+        }
+      def = this->Makefile->GetDefinition(this->Variable.c_str());
       }
-    // The file location was cached.  Look for the correct file.
-    std::string file;
-    if (this->FindConfigFile(dir, file))
+
+    // Search for the config file if it is not already found.
+    if(cmSystemTools::IsOff(def) || !fileFound)
       {
-      this->FileFound = file;
-      fileFound = true;
+      fileFound = this->FindConfig();
+      def = this->Makefile->GetDefinition(this->Variable.c_str());
       }
-    def = this->Makefile->GetDefinition(this->Variable.c_str());
-    }
 
-  // Search for the config file if it is not already found.
-  if(cmSystemTools::IsOff(def) || !fileFound)
-    {
-    fileFound = this->FindConfig();
-    def = this->Makefile->GetDefinition(this->Variable.c_str());
-    }
-
-  // Sanity check.
-  if(fileFound && this->FileFound.empty())
-    {
-    this->Makefile->IssueMessage(
-      cmake::INTERNAL_ERROR, "fileFound is true but FileFound is empty!");
-    fileFound = false;
+    // Sanity check.
+    if(fileFound && this->FileFound.empty())
+      {
+      this->Makefile->IssueMessage(
+        cmake::INTERNAL_ERROR, "fileFound is true but FileFound is empty!");
+      fileFound = false;
+      }
     }
 
   // If the directory for the config file was found, try to read the file.
@@ -893,6 +977,7 @@ bool cmFindPackageCommand::HandlePackageMode()
     {
     // The variable is not set.
     cmOStringStream e;
+    cmOStringStream aw;
     // If there are files in ConsideredConfigs, it means that FooConfig.cmake
     // have been found, but they didn't have appropriate versions.
     if (this->ConsideredConfigs.size() > 0)
@@ -912,41 +997,76 @@ bool cmFindPackageCommand::HandlePackageMode()
       }
     else
       {
-      e << "Could not find ";
-      if(!this->NoModule)
-        {
-        e << "module Find" << this->Name << ".cmake or ";
-        }
-      e << "a configuration file for package " << this->Name << ".\n";
-      if(!this->NoModule)
-        {
-        e << "Adjust CMAKE_MODULE_PATH to find Find"
-          << this->Name << ".cmake or set ";
-        }
-      else
+      std::string requestedVersionString;
+      if(!this->Version.empty())
         {
-        e << "Set ";
+        requestedVersionString = " (requested version ";
+        requestedVersionString += this->Version;
+        requestedVersionString += ")";
         }
-      e << this->Variable << " to the directory containing a CMake "
-        << "configuration file for " << this->Name << ".  ";
-      if(this->Configs.size() == 1)
-        {
-        e << "The file will be called " << this->Configs[0];
-        }
-      else
+
+      if (this->UseConfigFiles)
         {
-        e << "The file will have one of the following names:\n";
-        for(std::vector<std::string>::const_iterator ci=this->Configs.begin();
-            ci != this->Configs.end(); ++ci)
+        if(this->UseFindModules)
           {
-          e << "  " << *ci << "\n";
+          e << "By not providing \"Find" << this->Name << ".cmake\" in "
+               "CMAKE_MODULE_PATH this project has asked CMake to find a "
+               "package configuration file provided by \""<<this->Name<< "\", "
+               "but CMake did not find one.\n";
           }
+
+        if(this->Configs.size() == 1)
+          {
+          e << "Could not find a package configuration file named \""
+            << this->Configs[0] << "\" provided by package \""
+            << this->Name << "\"" << requestedVersionString <<".\n";
+          }
+        else
+          {
+          e << "Could not find a package configuration file provided by \""
+            << this->Name << "\"" << requestedVersionString
+            << " with any of the following names:\n";
+          for(std::vector<std::string>::const_iterator ci =
+                this->Configs.begin();
+              ci != this->Configs.end(); ++ci)
+            {
+            e << "  " << *ci << "\n";
+            }
+          }
+
+        e << "Add the installation prefix of \"" << this->Name << "\" to "
+          "CMAKE_PREFIX_PATH or set \"" << this->Variable << "\" to a "
+          "directory containing one of the above files. "
+          "If \"" << this->Name << "\" provides a separate development "
+          "package or SDK, be sure it has been installed.";
+        }
+      else // if(!this->UseFindModules && !this->UseConfigFiles)
+        {
+        e << "No \"Find" << this->Name << ".cmake\" found in "
+          << "CMAKE_MODULE_PATH.";
+
+        aw<< "Find"<< this->Name <<".cmake must either be part of this "
+             "project itself, in this case adjust CMAKE_MODULE_PATH so that "
+             "it points to the correct location inside its source tree.\n"
+             "Or it must be installed by a package which has already been "
+             "found via find_package().  In this case make sure that "
+             "package has indeed been found and adjust CMAKE_MODULE_PATH to "
+             "contain the location where that package has installed "
+             "Find" << this->Name << ".cmake.  This must be a location "
+             "provided by that package.  This error in general means that "
+             "the buildsystem of this project is relying on a Find-module "
+             "without ensuring that it is actually available.\n";
         }
       }
 
 
     this->Makefile->IssueMessage(
       this->Required? cmake::FATAL_ERROR : cmake::WARNING, e.str());
+
+    if (!aw.str().empty())
+      {
+      this->Makefile->IssueMessage(cmake::AUTHOR_WARNING,aw.str());
+      }
     }
 
   // Set a variable marking whether the package was found.

+ 3 - 1
Source/cmFindPackageCommand.h

@@ -130,10 +130,12 @@ private:
   unsigned int VersionFoundPatch;
   unsigned int VersionFoundTweak;
   unsigned int VersionFoundCount;
+  unsigned int RequiredCMakeVersion;
   bool Quiet;
   bool Required;
   bool Compatibility_1_6;
-  bool NoModule;
+  bool UseConfigFiles;
+  bool UseFindModules;
   bool NoUserRegistry;
   bool NoSystemRegistry;
   bool NoBuilds;

+ 1 - 0
Tests/CMakeCommands/CMakeLists.txt

@@ -8,3 +8,4 @@ macro(add_CMakeCommands_test test)
 endmacro()
 
 add_CMakeCommands_test(build_command)
+add_CMakeCommands_test(find_package)

+ 3 - 0
Tests/CMakeCommands/find_package/CMakeLists.txt

@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 2.8)
+project(${TEST} NONE)
+include(${TEST}.cmake)

+ 13 - 0
Tests/CMakeCommands/find_package/MissingConfig-stderr.txt

@@ -0,0 +1,13 @@
+CMake Warning at MissingConfig.cmake:1 \(find_package\):
+  Could not find a package configuration file provided by "NotHere" with any
+  of the following names:
+
+    NotHereConfig.cmake
+    nothere-config.cmake
+
+  Add the installation prefix of "NotHere" to CMAKE_PREFIX_PATH or set
+  "NotHere_DIR" to a directory containing one of the above files.  If
+  "NotHere" provides a separate development package or SDK, be sure it has
+  been installed.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/CMakeCommands/find_package/MissingConfig.cmake

@@ -0,0 +1 @@
+find_package(NotHere CONFIG)

+ 10 - 0
Tests/CMakeCommands/find_package/MissingConfigOneName-stderr.txt

@@ -0,0 +1,10 @@
+CMake Warning at MissingConfigOneName.cmake:1 \(find_package\):
+  Could not find a package configuration file named "NotHereConfig.cmake"
+  provided by package "NotHere".
+
+  Add the installation prefix of "NotHere" to CMAKE_PREFIX_PATH or set
+  "NotHere_DIR" to a directory containing one of the above files.  If
+  "NotHere" provides a separate development package or SDK, be sure it has
+  been installed.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/CMakeCommands/find_package/MissingConfigOneName.cmake

@@ -0,0 +1 @@
+find_package(NotHere CONFIGS NotHereConfig.cmake)

+ 1 - 0
Tests/CMakeCommands/find_package/MissingConfigRequired-result.txt

@@ -0,0 +1 @@
+1

+ 13 - 0
Tests/CMakeCommands/find_package/MissingConfigRequired-stderr.txt

@@ -0,0 +1,13 @@
+CMake Error at MissingConfigRequired.cmake:1 \(find_package\):
+  Could not find a package configuration file provided by "NotHere" with any
+  of the following names:
+
+    NotHereConfig.cmake
+    nothere-config.cmake
+
+  Add the installation prefix of "NotHere" to CMAKE_PREFIX_PATH or set
+  "NotHere_DIR" to a directory containing one of the above files.  If
+  "NotHere" provides a separate development package or SDK, be sure it has
+  been installed.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/CMakeCommands/find_package/MissingConfigRequired.cmake

@@ -0,0 +1 @@
+find_package(NotHere CONFIG REQUIRED)

+ 13 - 0
Tests/CMakeCommands/find_package/MissingConfigVersion-stderr.txt

@@ -0,0 +1,13 @@
+CMake Warning at MissingConfigVersion.cmake:1 \(find_package\):
+  Could not find a package configuration file provided by "NotHere"
+  \(requested version 1\.2\) with any of the following names:
+
+    NotHereConfig.cmake
+    nothere-config.cmake
+
+  Add the installation prefix of "NotHere" to CMAKE_PREFIX_PATH or set
+  "NotHere_DIR" to a directory containing one of the above files.  If
+  "NotHere" provides a separate development package or SDK, be sure it has
+  been installed.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/CMakeCommands/find_package/MissingConfigVersion.cmake

@@ -0,0 +1 @@
+find_package(NotHere 1.2 CONFIG)

+ 21 - 0
Tests/CMakeCommands/find_package/MissingModule-stderr.txt

@@ -0,0 +1,21 @@
+CMake Warning at MissingModule.cmake:1 \(find_package\):
+  No "FindNotHere.cmake" found in CMAKE_MODULE_PATH.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
+
+
+CMake Warning \(dev\) at MissingModule.cmake:1 \(find_package\):
+  FindNotHere.cmake must either be part of this project itself, in this case
+  adjust CMAKE_MODULE_PATH so that it points to the correct location inside
+  its source tree.
+
+  Or it must be installed by a package which has already been found via
+  find_package\(\).  In this case make sure that package has indeed been found
+  and adjust CMAKE_MODULE_PATH to contain the location where that package has
+  installed FindNotHere.cmake.  This must be a location provided by that
+  package.  This error in general means that the buildsystem of this project
+  is relying on a Find-module without ensuring that it is actually available.
+
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
+This warning is for project developers.  Use -Wno-dev to suppress it.

+ 1 - 0
Tests/CMakeCommands/find_package/MissingModule.cmake

@@ -0,0 +1 @@
+find_package(NotHere MODULE)

+ 1 - 0
Tests/CMakeCommands/find_package/MissingModuleRequired-result.txt

@@ -0,0 +1 @@
+1

+ 21 - 0
Tests/CMakeCommands/find_package/MissingModuleRequired-stderr.txt

@@ -0,0 +1,21 @@
+CMake Error at MissingModuleRequired.cmake:1 \(find_package\):
+  No "FindNotHere.cmake" found in CMAKE_MODULE_PATH.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
+
+
+CMake Warning \(dev\) at MissingModuleRequired.cmake:1 \(find_package\):
+  FindNotHere.cmake must either be part of this project itself, in this case
+  adjust CMAKE_MODULE_PATH so that it points to the correct location inside
+  its source tree.
+
+  Or it must be installed by a package which has already been found via
+  find_package\(\).  In this case make sure that package has indeed been found
+  and adjust CMAKE_MODULE_PATH to contain the location where that package has
+  installed FindNotHere.cmake.  This must be a location provided by that
+  package.  This error in general means that the buildsystem of this project
+  is relying on a Find-module without ensuring that it is actually available.
+
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
+This warning is for project developers.  Use -Wno-dev to suppress it.

+ 1 - 0
Tests/CMakeCommands/find_package/MissingModuleRequired.cmake

@@ -0,0 +1 @@
+find_package(NotHere MODULE REQUIRED)

+ 17 - 0
Tests/CMakeCommands/find_package/MissingNormal-stderr.txt

@@ -0,0 +1,17 @@
+CMake Warning at MissingNormal.cmake:1 \(find_package\):
+  By not providing "FindNotHere.cmake" in CMAKE_MODULE_PATH this project has
+  asked CMake to find a package configuration file provided by "NotHere", but
+  CMake did not find one.
+
+  Could not find a package configuration file provided by "NotHere" with any
+  of the following names:
+
+    NotHereConfig.cmake
+    nothere-config.cmake
+
+  Add the installation prefix of "NotHere" to CMAKE_PREFIX_PATH or set
+  "NotHere_DIR" to a directory containing one of the above files.  If
+  "NotHere" provides a separate development package or SDK, be sure it has
+  been installed.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/CMakeCommands/find_package/MissingNormal.cmake

@@ -0,0 +1 @@
+find_package(NotHere)

+ 1 - 0
Tests/CMakeCommands/find_package/MissingNormalRequired-result.txt

@@ -0,0 +1 @@
+1

+ 17 - 0
Tests/CMakeCommands/find_package/MissingNormalRequired-stderr.txt

@@ -0,0 +1,17 @@
+CMake Error at MissingNormalRequired.cmake:1 \(find_package\):
+  By not providing "FindNotHere.cmake" in CMAKE_MODULE_PATH this project has
+  asked CMake to find a package configuration file provided by "NotHere", but
+  CMake did not find one.
+
+  Could not find a package configuration file provided by "NotHere" with any
+  of the following names:
+
+    NotHereConfig.cmake
+    nothere-config.cmake
+
+  Add the installation prefix of "NotHere" to CMAKE_PREFIX_PATH or set
+  "NotHere_DIR" to a directory containing one of the above files.  If
+  "NotHere" provides a separate development package or SDK, be sure it has
+  been installed.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/CMakeCommands/find_package/MissingNormalRequired.cmake

@@ -0,0 +1 @@
+find_package(NotHere REQUIRED)

+ 17 - 0
Tests/CMakeCommands/find_package/MissingNormalVersion-stderr.txt

@@ -0,0 +1,17 @@
+CMake Warning at MissingNormalVersion.cmake:1 \(find_package\):
+  By not providing "FindNotHere.cmake" in CMAKE_MODULE_PATH this project has
+  asked CMake to find a package configuration file provided by "NotHere", but
+  CMake did not find one.
+
+  Could not find a package configuration file provided by "NotHere"
+  \(requested version 1\.2\) with any of the following names:
+
+    NotHereConfig.cmake
+    nothere-config.cmake
+
+  Add the installation prefix of "NotHere" to CMAKE_PREFIX_PATH or set
+  "NotHere_DIR" to a directory containing one of the above files.  If
+  "NotHere" provides a separate development package or SDK, be sure it has
+  been installed.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/CMakeCommands/find_package/MissingNormalVersion.cmake

@@ -0,0 +1 @@
+find_package(NotHere 1.2)

+ 30 - 0
Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleNew-stderr.txt

@@ -0,0 +1,30 @@
+CMake Warning \(dev\) at MissingNormalWarnNoModuleNew.cmake:3 \(find_package\):
+  find_package called without either MODULE or CONFIG option and no
+  FindNotHere.cmake module is in CMAKE_MODULE_PATH.  Add MODULE to
+  exclusively request Module mode and fail if FindNotHere.cmake is missing.
+  Add CONFIG to exclusively request Config mode and search for a package
+  configuration file provided by NotHere \(NotHereConfig.cmake or
+  nothere-config.cmake\).
+
+  \(Variable CMAKE_FIND_PACKAGE_WARN_NO_MODULE enabled this warning.\)
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
+This warning is for project developers.  Use -Wno-dev to suppress it.
+
+CMake Warning at MissingNormalWarnNoModuleNew.cmake:3 \(find_package\):
+  By not providing "FindNotHere.cmake" in CMAKE_MODULE_PATH this project has
+  asked CMake to find a package configuration file provided by "NotHere", but
+  CMake did not find one.
+
+  Could not find a package configuration file provided by "NotHere" with any
+  of the following names:
+
+    NotHereConfig.cmake
+    nothere-config.cmake
+
+  Add the installation prefix of "NotHere" to CMAKE_PREFIX_PATH or set
+  "NotHere_DIR" to a directory containing one of the above files.  If
+  "NotHere" provides a separate development package or SDK, be sure it has
+  been installed.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 3 - 0
Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleNew.cmake

@@ -0,0 +1,3 @@
+set(CMAKE_FIND_PACKAGE_WARN_NO_MODULE 1)
+set(CMAKE_MINIMUM_REQUIRED_VERSION 2.8.8)
+find_package(NotHere)

+ 29 - 0
Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld-stderr.txt

@@ -0,0 +1,29 @@
+CMake Warning \(dev\) at MissingNormalWarnNoModuleOld.cmake:2 \(find_package\):
+  find_package called without NO_MODULE option and no FindNotHere.cmake
+  module is in CMAKE_MODULE_PATH.  Add NO_MODULE to exclusively request
+  Config mode and search for a package configuration file provided by NotHere
+  \(NotHereConfig.cmake or nothere-config.cmake\).  Otherwise make
+  FindNotHere.cmake available in CMAKE_MODULE_PATH.
+
+  \(Variable CMAKE_FIND_PACKAGE_WARN_NO_MODULE enabled this warning.\)
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)
+This warning is for project developers.  Use -Wno-dev to suppress it.
+
+CMake Warning at MissingNormalWarnNoModuleOld.cmake:2 \(find_package\):
+  By not providing "FindNotHere.cmake" in CMAKE_MODULE_PATH this project has
+  asked CMake to find a package configuration file provided by "NotHere", but
+  CMake did not find one.
+
+  Could not find a package configuration file provided by "NotHere" with any
+  of the following names:
+
+    NotHereConfig.cmake
+    nothere-config.cmake
+
+  Add the installation prefix of "NotHere" to CMAKE_PREFIX_PATH or set
+  "NotHere_DIR" to a directory containing one of the above files.  If
+  "NotHere" provides a separate development package or SDK, be sure it has
+  been installed.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 2 - 0
Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld.cmake

@@ -0,0 +1,2 @@
+set(CMAKE_FIND_PACKAGE_WARN_NO_MODULE 1)
+find_package(NotHere)

+ 1 - 0
Tests/CMakeCommands/find_package/MixedModeOptions-result.txt

@@ -0,0 +1 @@
+1

+ 14 - 0
Tests/CMakeCommands/find_package/MixedModeOptions-stderr.txt

@@ -0,0 +1,14 @@
+CMake Error at MixedModeOptions.cmake:1 \(find_package\):
+  find_package given options exclusive to Module mode:
+
+    MODULE
+
+  and options exclusive to Config mode:
+
+    CONFIG
+    CONFIGS
+    NO_DEFAULT_PATH
+
+  The options are incompatible.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/CMakeCommands/find_package/MixedModeOptions.cmake

@@ -0,0 +1 @@
+find_package(NotHere MODULE CONFIG CONFIGS NotHereConfig.cmake NO_DEFAULT_PATH)

+ 80 - 0
Tests/CMakeCommands/find_package/test.cmake

@@ -0,0 +1,80 @@
+if(NOT DEFINED dir)
+  message(FATAL_ERROR "dir not defined")
+endif()
+
+if(NOT DEFINED gen)
+  message(FATAL_ERROR "gen not defined")
+endif()
+
+# TODO: Generalize this for other tests.
+function(run_test test)
+  set(top_src "${CMAKE_CURRENT_LIST_DIR}")
+  set(top_bin "${dir}")
+  if(EXISTS ${top_src}/${test}-result.txt)
+    file(READ ${top_src}/${test}-result.txt expect_result)
+    string(REGEX REPLACE "\n+$" "" expect_result "${expect_result}")
+  else()
+    set(expect_result 0)
+  endif()
+  foreach(o out err)
+    if(EXISTS ${top_src}/${test}-std${o}.txt)
+      file(READ ${top_src}/${test}-std${o}.txt expect_std${o})
+      string(REGEX REPLACE "\n+$" "" expect_std${o} "${expect_std${o}}")
+    else()
+      unset(expect_std${o})
+    endif()
+  endforeach()
+  set(source_dir "${top_src}")
+  set(binary_dir "${top_bin}/${test}-build")
+  file(REMOVE_RECURSE "${binary_dir}")
+  file(MAKE_DIRECTORY "${binary_dir}")
+  execute_process(
+    COMMAND ${CMAKE_COMMAND} "${source_dir}" -G "${gen}" -DTEST=${test}
+    WORKING_DIRECTORY "${binary_dir}"
+    OUTPUT_VARIABLE actual_stdout
+    ERROR_VARIABLE actual_stderr
+    RESULT_VARIABLE actual_result
+    )
+  set(msg "")
+  if(NOT "${actual_result}" STREQUAL "${expect_result}")
+    set(msg "${msg}Result is [${actual_result}], not [${expect_result}].\n")
+  endif()
+  foreach(o out err)
+    string(REGEX REPLACE "\n+$" "" actual_std${o} "${actual_std${o}}")
+    set(expect_${o} "")
+    if(DEFINED expect_std${o})
+      if(NOT "${actual_std${o}}" MATCHES "${expect_std${o}}")
+        string(REGEX REPLACE "\n" "\n expect-${o}> " expect_${o}
+          " expect-${o}> ${expect_std${o}}")
+        set(expect_${o} "Expected std${o} to match:\n${expect_${o}}\n")
+        set(msg "${msg}std${o} does not match that expected.\n")
+      endif()
+    endif()
+  endforeach()
+  if(msg)
+    string(REGEX REPLACE "\n" "\n actual-out> " actual_out " actual-out> ${actual_stdout}")
+    string(REGEX REPLACE "\n" "\n actual-err> " actual_err " actual-err> ${actual_stderr}")
+    message(SEND_ERROR "${test} - FAILED:\n"
+      "${msg}"
+      "${expect_out}"
+      "Actual stdout:\n${actual_out}\n"
+      "${expect_err}"
+      "Actual stderr:\n${actual_err}\n"
+      )
+  else()
+    message(STATUS "${test} - PASSED")
+  endif()
+endfunction()
+
+run_test(MissingNormal)
+run_test(MissingNormalRequired)
+run_test(MissingNormalVersion)
+run_test(MissingNormalWarnNoModuleOld)
+run_test(MissingNormalWarnNoModuleNew)
+run_test(MissingModule)
+run_test(MissingModuleRequired)
+run_test(MissingConfig)
+run_test(MissingConfigOneName)
+run_test(MissingConfigRequired)
+run_test(MissingConfigVersion)
+run_test(MixedModeOptions)