From 978d89b99db233f2fbe5a9cfa4c7acdca93e6442 Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Fri, 17 Feb 2012 21:31:08 +0100 Subject: find_package: rename NoModule to UseFindModules ...positive logic is easier to handle Alex --- Source/cmFindPackageCommand.cxx | 28 ++++++++++++++-------------- Source/cmFindPackageCommand.h | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index b0a7607..5254de8 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -57,7 +57,7 @@ cmFindPackageCommand::cmFindPackageCommand() this->NoUserRegistry = false; this->NoSystemRegistry = false; this->NoBuilds = false; - this->NoModule = false; + this->UseFindModules = true; this->DebugMode = false; this->UseLib64Paths = false; this->PolicyScope = true; @@ -425,7 +425,7 @@ bool cmFindPackageCommand } else if(args[i] == "NO_MODULE") { - this->NoModule = true; + this->UseFindModules = false; doing = DoingNone; } else if(args[i] == "REQUIRED") @@ -440,31 +440,31 @@ bool cmFindPackageCommand } else if(args[i] == "NAMES") { - this->NoModule = true; + this->UseFindModules = false; this->Compatibility_1_6 = false; doing = DoingNames; } else if(args[i] == "PATHS") { - this->NoModule = true; + this->UseFindModules = false; this->Compatibility_1_6 = false; doing = DoingPaths; } else if(args[i] == "HINTS") { - this->NoModule = true; + this->UseFindModules = false; this->Compatibility_1_6 = false; doing = DoingHints; } else if(args[i] == "PATH_SUFFIXES") { - this->NoModule = true; + this->UseFindModules = false; this->Compatibility_1_6 = false; doing = DoingPathSuffixes; } else if(args[i] == "CONFIGS") { - this->NoModule = true; + this->UseFindModules = false; this->Compatibility_1_6 = false; doing = DoingConfigs; } @@ -477,27 +477,27 @@ bool cmFindPackageCommand else if(args[i] == "NO_CMAKE_PACKAGE_REGISTRY") { this->NoUserRegistry = true; - this->NoModule = true; + this->UseFindModules = false; this->Compatibility_1_6 = false; doing = DoingNone; } else if(args[i] == "NO_CMAKE_SYSTEM_PACKAGE_REGISTRY") { this->NoSystemRegistry = true; - this->NoModule = true; + this->UseFindModules = false; this->Compatibility_1_6 = false; doing = DoingNone; } else if(args[i] == "NO_CMAKE_BUILDS_PATH") { this->NoBuilds = true; - this->NoModule = true; + this->UseFindModules = false; this->Compatibility_1_6 = false; doing = DoingNone; } else if(this->CheckCommonArgument(args[i])) { - this->NoModule = true; + this->UseFindModules = false; this->Compatibility_1_6 = false; doing = DoingNone; } @@ -636,7 +636,7 @@ bool cmFindPackageCommand this->SetModuleVariables(components); // See if there is a Find.cmake module. - if(!this->NoModule) + if(this->UseFindModules) { bool foundModule = false; if(!this->FindModule(foundModule)) @@ -913,12 +913,12 @@ bool cmFindPackageCommand::HandlePackageMode() else { e << "Could not find "; - if(!this->NoModule) + if(this->UseFindModules) { e << "module Find" << this->Name << ".cmake or "; } e << "a configuration file for package " << this->Name << ".\n"; - if(!this->NoModule) + if(this->UseFindModules) { e << "Adjust CMAKE_MODULE_PATH to find Find" << this->Name << ".cmake or set "; diff --git a/Source/cmFindPackageCommand.h b/Source/cmFindPackageCommand.h index e736352..513c49c 100644 --- a/Source/cmFindPackageCommand.h +++ b/Source/cmFindPackageCommand.h @@ -133,7 +133,7 @@ private: bool Quiet; bool Required; bool Compatibility_1_6; - bool NoModule; + bool UseFindModules; bool NoUserRegistry; bool NoSystemRegistry; bool NoBuilds; -- cgit v0.12 From 7d67dcf52bddcd8863f00d7bb6e6e7e22a966951 Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Fri, 24 Feb 2012 20:33:21 +0100 Subject: find_package: improve error message when no Find module is present Explain exactly why CMake is looking for a package configuration file and who is expected to provide what: CMake Error at CMakeLists.txt:7 (find_package): By not providing "Find.cmake" in CMAKE_MODULE_PATH the caller has asked CMake to find a package configuration file provided by "", but CMake did not find one. Could not find a package configuration file provided by "" with any of the names: Config.cmake -config.cmake Add the installation prefix of "" to CMAKE_PREFIX_PATH or set "_DIR" to a directory containing one of the above files. If "" provides separate development package or SDK be sure it has been installed. The first paragraph explains how CMake is interpreting the intention of the caller. This puts the blame or credit at the call site in the project code where it belongs both when it is a bug and when it is intentional. It can be dropped in NO_MODULE mode. Suggested-by: Brad King --- Source/cmFindPackageCommand.cxx | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 5254de8..c02d385 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -912,38 +912,37 @@ bool cmFindPackageCommand::HandlePackageMode() } else { - e << "Could not find "; if(this->UseFindModules) { - e << "module Find" << this->Name << ".cmake or "; + 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 \""<Name<< "\", " + "but CMake did not find one.\n"; } - e << "a configuration file for package " << this->Name << ".\n"; - if(this->UseFindModules) - { - e << "Adjust CMAKE_MODULE_PATH to find Find" - << this->Name << ".cmake or set "; - } - else - { - e << "Set "; - } - 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]; + e << "Could not find a package configuration file named \"" + << this->Configs[0] << "\" provided by package \"" << this->Name << "\".\n"; } else { - e << "The file will have one of the following names:\n"; - for(std::vector::const_iterator ci=this->Configs.begin(); + e << "Could not find a package configuration file provided by \"" + << this->Name << "\" with any of the following names:\n"; + for(std::vector::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."; + } this->Makefile->IssueMessage( this->Required? cmake::FATAL_ERROR : cmake::WARNING, e.str()); -- cgit v0.12 From f310f6729149551ca73a853789413f9a36f86ced Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Mon, 20 Feb 2012 22:09:10 +0100 Subject: find_package: add MODULE mode to use only Find-modules The new mode differ from default mode in that that it doesn't fallback to config mode. The default mode stays unchanged. --- Source/cmFindPackageCommand.cxx | 172 +++++++++++++++++++++++++++------------- Source/cmFindPackageCommand.h | 1 + 2 files changed, 117 insertions(+), 56 deletions(-) diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index c02d385..c3c037c 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -57,6 +57,7 @@ cmFindPackageCommand::cmFindPackageCommand() this->NoUserRegistry = false; this->NoSystemRegistry = false; this->NoBuilds = false; + this->UseConfigFiles = true; this->UseFindModules = true; this->DebugMode = false; this->UseLib64Paths = false; @@ -86,7 +87,7 @@ void cmFindPackageCommand::GenerateDocumentation() cmSystemTools::ReplaceString(this->GenericDocumentationPathsOrder, "FIND_XXX", "find_package"); this->CommandDocumentation = - " find_package( [version] [EXACT] [QUIET]\n" + " find_package( [version] [EXACT] [QUIET] [MODULE]\n" " [[REQUIRED|COMPONENTS] [components...]]\n" " [NO_POLICY_SCOPE])\n" "Finds and loads settings from an external project. " @@ -94,6 +95,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,7 +126,8 @@ 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( [version] [EXACT] [QUIET]\n" " [[REQUIRED|COMPONENTS] [components...]] [NO_MODULE]\n" @@ -410,6 +413,7 @@ bool cmFindPackageCommand Doing doing = DoingNone; cmsys::RegularExpression version("^[0-9.]+$"); bool haveVersion = false; + std::string haveModeString = ""; for(unsigned int i=1; i < args.size(); ++i) { if(args[i] == "QUIET") @@ -423,10 +427,35 @@ bool cmFindPackageCommand this->Compatibility_1_6 = false; doing = DoingNone; } + else if(args[i] == "MODULE") + { + if(!haveModeString.empty()) + { + cmOStringStream e; + e << "given " << args[i] << ", but mode is already set to " + << haveModeString << "."; + this->SetError(e.str().c_str()); + return false; + } + + this->UseConfigFiles = false; + doing = DoingNone; + haveModeString = args[i]; + } else if(args[i] == "NO_MODULE") { + if(!haveModeString.empty()) + { + cmOStringStream e; + e << "given " << args[i] << ", but mode is already set to " + << haveModeString << "."; + this->SetError(e.str().c_str()); + return false; + } + this->UseFindModules = false; doing = DoingNone; + haveModeString = args[i]; } else if(args[i] == "REQUIRED") { @@ -831,41 +860,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 +925,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,40 +945,67 @@ bool cmFindPackageCommand::HandlePackageMode() } else { - if(this->UseFindModules) + if (this->UseConfigFiles) { - 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 \""<Name<< "\", " - "but CMake did not find one.\n"; - } + if(this->UseFindModules) + { + 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 \""<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 << "\".\n"; - } - else - { - e << "Could not find a package configuration file provided by \"" - << this->Name << "\" with any of the following names:\n"; - for(std::vector::const_iterator ci = - this->Configs.begin(); - ci != this->Configs.end(); ++ci) + if(this->Configs.size() == 1) { - e << " " << *ci << "\n"; + e << "Could not find a package configuration file named \"" + << this->Configs[0] << "\" provided by package \"" + << this->Name << "\".\n"; + } + else + { + e << "Could not find a package configuration file provided by \"" + << this->Name << "\" with any of the following names:\n"; + for(std::vector::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."; + 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. diff --git a/Source/cmFindPackageCommand.h b/Source/cmFindPackageCommand.h index 513c49c..560df9b 100644 --- a/Source/cmFindPackageCommand.h +++ b/Source/cmFindPackageCommand.h @@ -133,6 +133,7 @@ private: bool Quiet; bool Required; bool Compatibility_1_6; + bool UseConfigFiles; bool UseFindModules; bool NoUserRegistry; bool NoSystemRegistry; -- cgit v0.12 From 9c39bbd47420a74d50fab2b421baf630f13343ec Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Mon, 20 Feb 2012 22:09:10 +0100 Subject: find_package: add CONFIG mode keyword alias for NO_MODULE --- Source/cmFindPackageCommand.cxx | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index c3c037c..8e6debb 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -130,7 +130,8 @@ void cmFindPackageCommand::GenerateDocumentation() "proceeds to Config mode.\n" "The complete Config mode command signature is:\n" " find_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" @@ -148,9 +149,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 _DIR is created to " @@ -442,6 +444,21 @@ bool cmFindPackageCommand doing = DoingNone; haveModeString = args[i]; } + else if(args[i] == "CONFIG") + { + if(!haveModeString.empty()) + { + cmOStringStream e; + e << "given " << args[i] << ", but mode is already set to " + << haveModeString << "."; + this->SetError(e.str().c_str()); + return false; + } + + this->UseFindModules = false; + doing = DoingNone; + haveModeString = args[i]; + } else if(args[i] == "NO_MODULE") { if(!haveModeString.empty()) -- cgit v0.12 From 6d8308314adbc3ff504b836b3989db9939de1e0b Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Fri, 17 Feb 2012 11:37:29 +0100 Subject: find_package: mention requested version number in error message When neither a Find-module or a config file can be found print the required version so the user knows which version of the package to install. --- Source/cmFindPackageCommand.cxx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 8e6debb..86eb2c8 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -962,6 +962,14 @@ bool cmFindPackageCommand::HandlePackageMode() } else { + std::string requestedVersionString; + if(!this->Version.empty()) + { + requestedVersionString = " (requested version "; + requestedVersionString += this->Version; + requestedVersionString += ")"; + } + if (this->UseConfigFiles) { if(this->UseFindModules) @@ -976,12 +984,13 @@ bool cmFindPackageCommand::HandlePackageMode() { e << "Could not find a package configuration file named \"" << this->Configs[0] << "\" provided by package \"" - << this->Name << "\".\n"; + << this->Name << "\"" << requestedVersionString <<".\n"; } else { e << "Could not find a package configuration file provided by \"" - << this->Name << "\" with any of the following names:\n"; + << this->Name << "\"" << requestedVersionString + << " with any of the following names:\n"; for(std::vector::const_iterator ci = this->Configs.begin(); ci != this->Configs.end(); ++ci) -- cgit v0.12 From 31ead5f695182dbb96196f9795b6437e013c6567 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 28 Feb 2012 08:56:50 -0500 Subject: find_package: Reject mixed use of MODULE- and CONFIG-only options Many options imply exclusive Config mode. The new MODULE option implies exclusive Module mode. Do not allow mixed combinations. --- Source/cmFindPackageCommand.cxx | 80 +++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 86eb2c8..437f47a 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -415,7 +415,8 @@ bool cmFindPackageCommand Doing doing = DoingNone; cmsys::RegularExpression version("^[0-9.]+$"); bool haveVersion = false; - std::string haveModeString = ""; + std::set configArgs; + std::set moduleArgs; for(unsigned int i=1; i < args.size(); ++i) { if(args[i] == "QUIET") @@ -431,48 +432,18 @@ bool cmFindPackageCommand } else if(args[i] == "MODULE") { - if(!haveModeString.empty()) - { - cmOStringStream e; - e << "given " << args[i] << ", but mode is already set to " - << haveModeString << "."; - this->SetError(e.str().c_str()); - return false; - } - - this->UseConfigFiles = false; + moduleArgs.insert(i); doing = DoingNone; - haveModeString = args[i]; } else if(args[i] == "CONFIG") { - if(!haveModeString.empty()) - { - cmOStringStream e; - e << "given " << args[i] << ", but mode is already set to " - << haveModeString << "."; - this->SetError(e.str().c_str()); - return false; - } - - this->UseFindModules = false; + configArgs.insert(i); doing = DoingNone; - haveModeString = args[i]; } else if(args[i] == "NO_MODULE") { - if(!haveModeString.empty()) - { - cmOStringStream e; - e << "given " << args[i] << ", but mode is already set to " - << haveModeString << "."; - this->SetError(e.str().c_str()); - return false; - } - - this->UseFindModules = false; + configArgs.insert(i); doing = DoingNone; - haveModeString = args[i]; } else if(args[i] == "REQUIRED") { @@ -486,31 +457,31 @@ bool cmFindPackageCommand } else if(args[i] == "NAMES") { - this->UseFindModules = false; + configArgs.insert(i); this->Compatibility_1_6 = false; doing = DoingNames; } else if(args[i] == "PATHS") { - this->UseFindModules = false; + configArgs.insert(i); this->Compatibility_1_6 = false; doing = DoingPaths; } else if(args[i] == "HINTS") { - this->UseFindModules = false; + configArgs.insert(i); this->Compatibility_1_6 = false; doing = DoingHints; } else if(args[i] == "PATH_SUFFIXES") { - this->UseFindModules = false; + configArgs.insert(i); this->Compatibility_1_6 = false; doing = DoingPathSuffixes; } else if(args[i] == "CONFIGS") { - this->UseFindModules = false; + configArgs.insert(i); this->Compatibility_1_6 = false; doing = DoingConfigs; } @@ -523,27 +494,27 @@ bool cmFindPackageCommand else if(args[i] == "NO_CMAKE_PACKAGE_REGISTRY") { this->NoUserRegistry = true; - this->UseFindModules = false; + configArgs.insert(i); this->Compatibility_1_6 = false; doing = DoingNone; } else if(args[i] == "NO_CMAKE_SYSTEM_PACKAGE_REGISTRY") { this->NoSystemRegistry = true; - this->UseFindModules = false; + configArgs.insert(i); this->Compatibility_1_6 = false; doing = DoingNone; } else if(args[i] == "NO_CMAKE_BUILDS_PATH") { this->NoBuilds = true; - this->UseFindModules = false; + configArgs.insert(i); this->Compatibility_1_6 = false; doing = DoingNone; } else if(this->CheckCommonArgument(args[i])) { - this->UseFindModules = false; + configArgs.insert(i); this->Compatibility_1_6 = false; doing = DoingNone; } @@ -603,6 +574,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::const_iterator si = moduleArgs.begin(); + si != moduleArgs.end(); ++si) + { + e << " " << args[*si] << "\n"; + } + e << "and options exclusive to Config mode:\n"; + for(std::set::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) { -- cgit v0.12 From d3651041e9f16876d227c757254256039d62d85b Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 28 Feb 2012 09:51:10 -0500 Subject: find_package: Optionally warn when implicitly using Config mode Define variable CMAKE_FIND_PACKAGE_WARN_NO_MODULE for use by a project that wants to use an explicit mode in every call to find_package in order to generate more specific failure messages. Word the warning using the new CONFIG and MODULE mode keywords when the minimum required version of CMake is new enough to have them. Otherwise word the warning using the old NO_MODULE mode keyword. Inspired-by: Alex Neundorf --- Source/cmDocumentVariables.cxx | 20 ++++++++++++++++++++ Source/cmFindPackageCommand.cxx | 41 +++++++++++++++++++++++++++++++++++++++++ Source/cmFindPackageCommand.h | 1 + 3 files changed, 62 insertions(+) diff --git a/Source/cmDocumentVariables.cxx b/Source/cmDocumentVariables.cxx index 1cab2b5..f3125ce 100644 --- a/Source/cmDocumentVariables.cxx +++ b/Source/cmDocumentVariables.cxx @@ -746,6 +746,26 @@ void cmDocumentVariables::DefineVariables(cmake* cm) "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.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.", "CMake loads the specified file while enabling support for each " diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 437f47a..d632570 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -73,6 +73,7 @@ cmFindPackageCommand::cmFindPackageCommand() this->VersionFoundPatch = 0; this->VersionFoundTweak = 0; this->VersionFoundCount = 0; + this->RequiredCMakeVersion = 0; } //---------------------------------------------------------------------------- @@ -372,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"); @@ -691,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 _DIR cache variable to locate it. this->Variable = this->Name; diff --git a/Source/cmFindPackageCommand.h b/Source/cmFindPackageCommand.h index 560df9b..7269749 100644 --- a/Source/cmFindPackageCommand.h +++ b/Source/cmFindPackageCommand.h @@ -130,6 +130,7 @@ private: unsigned int VersionFoundPatch; unsigned int VersionFoundTweak; unsigned int VersionFoundCount; + unsigned int RequiredCMakeVersion; bool Quiet; bool Required; bool Compatibility_1_6; -- cgit v0.12 From eeaaffcb2f68254ccd5cc6fbf4d13fed41d40774 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 28 Feb 2012 13:34:53 -0500 Subject: find_package: Test error and warning messages in failure cases Add a "CMakeCommands.find_package" test to run CMake on a bunch of cases in which find_package fails. Check that the process return code and warning/error messages are as expected. Record expected test output in corresponding files for reference by the check. These files will also serve as a reference for the message text in each case. --- Tests/CMakeCommands/CMakeLists.txt | 1 + Tests/CMakeCommands/find_package/CMakeLists.txt | 3 + .../find_package/MissingConfig-stderr.txt | 13 ++++ .../CMakeCommands/find_package/MissingConfig.cmake | 1 + .../find_package/MissingConfigOneName-stderr.txt | 10 +++ .../find_package/MissingConfigOneName.cmake | 1 + .../find_package/MissingConfigRequired-result.txt | 1 + .../find_package/MissingConfigRequired-stderr.txt | 13 ++++ .../find_package/MissingConfigRequired.cmake | 1 + .../find_package/MissingConfigVersion-stderr.txt | 13 ++++ .../find_package/MissingConfigVersion.cmake | 1 + .../find_package/MissingModule-stderr.txt | 21 ++++++ .../CMakeCommands/find_package/MissingModule.cmake | 1 + .../find_package/MissingModuleRequired-result.txt | 1 + .../find_package/MissingModuleRequired-stderr.txt | 21 ++++++ .../find_package/MissingModuleRequired.cmake | 1 + .../find_package/MissingNormal-stderr.txt | 17 +++++ .../CMakeCommands/find_package/MissingNormal.cmake | 1 + .../find_package/MissingNormalRequired-result.txt | 1 + .../find_package/MissingNormalRequired-stderr.txt | 17 +++++ .../find_package/MissingNormalRequired.cmake | 1 + .../find_package/MissingNormalVersion-stderr.txt | 17 +++++ .../find_package/MissingNormalVersion.cmake | 1 + .../MissingNormalWarnNoModuleNew-stderr.txt | 30 ++++++++ .../MissingNormalWarnNoModuleNew.cmake | 3 + .../MissingNormalWarnNoModuleOld-stderr.txt | 29 ++++++++ .../MissingNormalWarnNoModuleOld.cmake | 2 + .../find_package/MixedModeOptions-result.txt | 1 + .../find_package/MixedModeOptions-stderr.txt | 14 ++++ .../find_package/MixedModeOptions.cmake | 1 + Tests/CMakeCommands/find_package/test.cmake | 80 ++++++++++++++++++++++ 31 files changed, 318 insertions(+) create mode 100644 Tests/CMakeCommands/find_package/CMakeLists.txt create mode 100644 Tests/CMakeCommands/find_package/MissingConfig-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingConfig.cmake create mode 100644 Tests/CMakeCommands/find_package/MissingConfigOneName-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingConfigOneName.cmake create mode 100644 Tests/CMakeCommands/find_package/MissingConfigRequired-result.txt create mode 100644 Tests/CMakeCommands/find_package/MissingConfigRequired-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingConfigRequired.cmake create mode 100644 Tests/CMakeCommands/find_package/MissingConfigVersion-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingConfigVersion.cmake create mode 100644 Tests/CMakeCommands/find_package/MissingModule-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingModule.cmake create mode 100644 Tests/CMakeCommands/find_package/MissingModuleRequired-result.txt create mode 100644 Tests/CMakeCommands/find_package/MissingModuleRequired-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingModuleRequired.cmake create mode 100644 Tests/CMakeCommands/find_package/MissingNormal-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingNormal.cmake create mode 100644 Tests/CMakeCommands/find_package/MissingNormalRequired-result.txt create mode 100644 Tests/CMakeCommands/find_package/MissingNormalRequired-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingNormalRequired.cmake create mode 100644 Tests/CMakeCommands/find_package/MissingNormalVersion-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingNormalVersion.cmake create mode 100644 Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleNew-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleNew.cmake create mode 100644 Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld.cmake create mode 100644 Tests/CMakeCommands/find_package/MixedModeOptions-result.txt create mode 100644 Tests/CMakeCommands/find_package/MixedModeOptions-stderr.txt create mode 100644 Tests/CMakeCommands/find_package/MixedModeOptions.cmake create mode 100644 Tests/CMakeCommands/find_package/test.cmake diff --git a/Tests/CMakeCommands/CMakeLists.txt b/Tests/CMakeCommands/CMakeLists.txt index e9e4020..aa400d0 100644 --- a/Tests/CMakeCommands/CMakeLists.txt +++ b/Tests/CMakeCommands/CMakeLists.txt @@ -8,3 +8,4 @@ macro(add_CMakeCommands_test test) endmacro() add_CMakeCommands_test(build_command) +add_CMakeCommands_test(find_package) diff --git a/Tests/CMakeCommands/find_package/CMakeLists.txt b/Tests/CMakeCommands/find_package/CMakeLists.txt new file mode 100644 index 0000000..c2deed0 --- /dev/null +++ b/Tests/CMakeCommands/find_package/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8) +project(${TEST} NONE) +include(${TEST}.cmake) diff --git a/Tests/CMakeCommands/find_package/MissingConfig-stderr.txt b/Tests/CMakeCommands/find_package/MissingConfig-stderr.txt new file mode 100644 index 0000000..0d14dcb --- /dev/null +++ b/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\) diff --git a/Tests/CMakeCommands/find_package/MissingConfig.cmake b/Tests/CMakeCommands/find_package/MissingConfig.cmake new file mode 100644 index 0000000..3cebef1 --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingConfig.cmake @@ -0,0 +1 @@ +find_package(NotHere CONFIG) diff --git a/Tests/CMakeCommands/find_package/MissingConfigOneName-stderr.txt b/Tests/CMakeCommands/find_package/MissingConfigOneName-stderr.txt new file mode 100644 index 0000000..10e71fa --- /dev/null +++ b/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\) diff --git a/Tests/CMakeCommands/find_package/MissingConfigOneName.cmake b/Tests/CMakeCommands/find_package/MissingConfigOneName.cmake new file mode 100644 index 0000000..11676a9 --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingConfigOneName.cmake @@ -0,0 +1 @@ +find_package(NotHere CONFIGS NotHereConfig.cmake) diff --git a/Tests/CMakeCommands/find_package/MissingConfigRequired-result.txt b/Tests/CMakeCommands/find_package/MissingConfigRequired-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingConfigRequired-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/CMakeCommands/find_package/MissingConfigRequired-stderr.txt b/Tests/CMakeCommands/find_package/MissingConfigRequired-stderr.txt new file mode 100644 index 0000000..56325d8 --- /dev/null +++ b/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\) diff --git a/Tests/CMakeCommands/find_package/MissingConfigRequired.cmake b/Tests/CMakeCommands/find_package/MissingConfigRequired.cmake new file mode 100644 index 0000000..3c28552 --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingConfigRequired.cmake @@ -0,0 +1 @@ +find_package(NotHere CONFIG REQUIRED) diff --git a/Tests/CMakeCommands/find_package/MissingConfigVersion-stderr.txt b/Tests/CMakeCommands/find_package/MissingConfigVersion-stderr.txt new file mode 100644 index 0000000..2f5086e --- /dev/null +++ b/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\) diff --git a/Tests/CMakeCommands/find_package/MissingConfigVersion.cmake b/Tests/CMakeCommands/find_package/MissingConfigVersion.cmake new file mode 100644 index 0000000..ac35a79 --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingConfigVersion.cmake @@ -0,0 +1 @@ +find_package(NotHere 1.2 CONFIG) diff --git a/Tests/CMakeCommands/find_package/MissingModule-stderr.txt b/Tests/CMakeCommands/find_package/MissingModule-stderr.txt new file mode 100644 index 0000000..71b5eae --- /dev/null +++ b/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. diff --git a/Tests/CMakeCommands/find_package/MissingModule.cmake b/Tests/CMakeCommands/find_package/MissingModule.cmake new file mode 100644 index 0000000..420539f --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingModule.cmake @@ -0,0 +1 @@ +find_package(NotHere MODULE) diff --git a/Tests/CMakeCommands/find_package/MissingModuleRequired-result.txt b/Tests/CMakeCommands/find_package/MissingModuleRequired-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingModuleRequired-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/CMakeCommands/find_package/MissingModuleRequired-stderr.txt b/Tests/CMakeCommands/find_package/MissingModuleRequired-stderr.txt new file mode 100644 index 0000000..c3cd350 --- /dev/null +++ b/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. diff --git a/Tests/CMakeCommands/find_package/MissingModuleRequired.cmake b/Tests/CMakeCommands/find_package/MissingModuleRequired.cmake new file mode 100644 index 0000000..07f36c5 --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingModuleRequired.cmake @@ -0,0 +1 @@ +find_package(NotHere MODULE REQUIRED) diff --git a/Tests/CMakeCommands/find_package/MissingNormal-stderr.txt b/Tests/CMakeCommands/find_package/MissingNormal-stderr.txt new file mode 100644 index 0000000..e5cbd97 --- /dev/null +++ b/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\) diff --git a/Tests/CMakeCommands/find_package/MissingNormal.cmake b/Tests/CMakeCommands/find_package/MissingNormal.cmake new file mode 100644 index 0000000..778cd38 --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingNormal.cmake @@ -0,0 +1 @@ +find_package(NotHere) diff --git a/Tests/CMakeCommands/find_package/MissingNormalRequired-result.txt b/Tests/CMakeCommands/find_package/MissingNormalRequired-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingNormalRequired-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/CMakeCommands/find_package/MissingNormalRequired-stderr.txt b/Tests/CMakeCommands/find_package/MissingNormalRequired-stderr.txt new file mode 100644 index 0000000..ac52aec --- /dev/null +++ b/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\) diff --git a/Tests/CMakeCommands/find_package/MissingNormalRequired.cmake b/Tests/CMakeCommands/find_package/MissingNormalRequired.cmake new file mode 100644 index 0000000..5c33fca --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingNormalRequired.cmake @@ -0,0 +1 @@ +find_package(NotHere REQUIRED) diff --git a/Tests/CMakeCommands/find_package/MissingNormalVersion-stderr.txt b/Tests/CMakeCommands/find_package/MissingNormalVersion-stderr.txt new file mode 100644 index 0000000..36de800 --- /dev/null +++ b/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\) diff --git a/Tests/CMakeCommands/find_package/MissingNormalVersion.cmake b/Tests/CMakeCommands/find_package/MissingNormalVersion.cmake new file mode 100644 index 0000000..2d9ce4e --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingNormalVersion.cmake @@ -0,0 +1 @@ +find_package(NotHere 1.2) diff --git a/Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleNew-stderr.txt b/Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleNew-stderr.txt new file mode 100644 index 0000000..d34f23c --- /dev/null +++ b/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\) diff --git a/Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleNew.cmake b/Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleNew.cmake new file mode 100644 index 0000000..0211249 --- /dev/null +++ b/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) diff --git a/Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld-stderr.txt b/Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld-stderr.txt new file mode 100644 index 0000000..b336b56 --- /dev/null +++ b/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\) diff --git a/Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld.cmake b/Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld.cmake new file mode 100644 index 0000000..1c4a775 --- /dev/null +++ b/Tests/CMakeCommands/find_package/MissingNormalWarnNoModuleOld.cmake @@ -0,0 +1,2 @@ +set(CMAKE_FIND_PACKAGE_WARN_NO_MODULE 1) +find_package(NotHere) diff --git a/Tests/CMakeCommands/find_package/MixedModeOptions-result.txt b/Tests/CMakeCommands/find_package/MixedModeOptions-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/CMakeCommands/find_package/MixedModeOptions-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/CMakeCommands/find_package/MixedModeOptions-stderr.txt b/Tests/CMakeCommands/find_package/MixedModeOptions-stderr.txt new file mode 100644 index 0000000..b867022 --- /dev/null +++ b/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\) diff --git a/Tests/CMakeCommands/find_package/MixedModeOptions.cmake b/Tests/CMakeCommands/find_package/MixedModeOptions.cmake new file mode 100644 index 0000000..7f78ee0 --- /dev/null +++ b/Tests/CMakeCommands/find_package/MixedModeOptions.cmake @@ -0,0 +1 @@ +find_package(NotHere MODULE CONFIG CONFIGS NotHereConfig.cmake NO_DEFAULT_PATH) diff --git a/Tests/CMakeCommands/find_package/test.cmake b/Tests/CMakeCommands/find_package/test.cmake new file mode 100644 index 0000000..dd1072e --- /dev/null +++ b/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) -- cgit v0.12