diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 86eb2c8da..437f47a19 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) {