diff options
author | Brad King <brad.king@kitware.com> | 2008-01-21 13:48:33 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2008-01-21 13:48:33 (GMT) |
commit | f41b1e8e9148c62e186e0729c5a5144c51e944e9 (patch) | |
tree | 4c0b4a7d6829a94e2248e6fe583279f906317c3f /Source | |
parent | 9198a92af9e9f05a90d544c76ffeb65aa1a5281e (diff) | |
download | CMake-f41b1e8e9148c62e186e0729c5a5144c51e944e9.zip CMake-f41b1e8e9148c62e186e0729c5a5144c51e944e9.tar.gz CMake-f41b1e8e9148c62e186e0729c5a5144c51e944e9.tar.bz2 |
ENH: Implement version support in the find_package command module mode. Version numbers provided to the command are converted to variable settings to tell the FindXXX.cmake module what version is requested. This addresses issue #1645.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmFindPackageCommand.cxx | 63 | ||||
-rw-r--r-- | Source/cmFindPackageCommand.h | 5 |
2 files changed, 64 insertions, 4 deletions
diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index a4b7e6a..c4d7b87 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -63,8 +63,12 @@ cmFindPackageCommand::cmFindPackageCommand() this->NoBuilds = false; this->NoModule = false; this->DebugMode = false; + this->VersionMajor = 0; + this->VersionMinor = 0; + this->VersionPatch = 0; + this->VersionCount = 0; this->CommandDocumentation = - " find_package(<package> [major.minor] [QUIET] [NO_MODULE]\n" + " find_package(<package> [major[.minor[.patch]]] [QUIET] [NO_MODULE]\n" " [[REQUIRED|COMPONENTS] [components...]]\n" " [NAMES name1 [name2 ...]]\n" " [CONFIGS config1 [config2 ...]]\n" @@ -84,13 +88,15 @@ cmFindPackageCommand::cmFindPackageCommand() "can be used when <package>_FOUND is true are package-specific. " "A package-specific list of components may be listed after the " "REQUIRED option, or after the COMPONENTS option if no REQUIRED " - "option is given. The \"major.minor\" version argument is currently " - "a placeholder for future use and is ignored. " + "option is given. The \"[major[.minor[.patch]]]\" version argument " + "specifies a desired version with which the package found should be " + "compatible. Version support is currently provided only on a " + "package-by-package basis and is not enforced by the command. " "The command has two modes by which it searches for packages: " "\"Module\" mode and \"Config\" mode." "\n" "Module mode has a reduced signature:\n" - " find_package(<package> [major.minor] [QUIET]\n" + " find_package(<package> [major[.minor[.patch]]] [QUIET]\n" " [[REQUIRED|COMPONENTS] [components...]])\n" "CMake searches for a file called \"Find<package>.cmake\" in " "the CMAKE_MODULE_PATH followed by the CMake installation. " @@ -104,6 +110,7 @@ cmFindPackageCommand::cmFindPackageCommand() "Config mode attempts to locate a configuration file provided by the " "package to be found. A cache entry called <package>_DIR is created to " "hold the directory containing the file. " + "Currently versioning is not implemented by Config mode. " "By default the command searches for a package with the name <package>. " "If the NAMES option is given the names following it are used instead " "of <package>. " @@ -338,6 +345,7 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args) else if(!haveVersion && version.find(args[i].c_str())) { haveVersion = true; + this->Version = args[i]; } else { @@ -348,6 +356,24 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args) } } + if(!this->Version.empty()) + { + // Try to parse the version number and store the results that were + // successfully parsed. + unsigned int parsed_major; + unsigned int parsed_minor; + unsigned int parsed_patch; + this->VersionCount = sscanf(this->Version.c_str(), "%u.%u.%u", + &parsed_major, &parsed_minor, &parsed_patch); + switch(this->VersionCount) + { + case 3: this->VersionPatch = parsed_patch; // no break! + case 2: this->VersionMinor = parsed_minor; // no break! + case 1: this->VersionMajor = parsed_major; // no break! + default: break; + } + } + // Store the list of components. std::string components_var = Name + "_FIND_COMPONENTS"; this->Makefile->AddDefinition(components_var.c_str(), components.c_str()); @@ -428,6 +454,35 @@ bool cmFindPackageCommand::FindModule(bool& found) this->Makefile->AddDefinition(req.c_str(), "1"); } + if(!this->Version.empty()) + { + // Tell the module that is about to be read what version of the + // package has been requested. + std::string ver = this->Name; + ver += "_FIND_VERSION"; + this->Makefile->AddDefinition(ver.c_str(), this->Version.c_str()); + char buf[64]; + switch(this->VersionCount) + { + case 3: + { + snprintf(buf, 64, "%u", this->VersionPatch); + this->Makefile->AddDefinition((ver+"_PATCH").c_str(), buf); + } // no break + case 2: + { + snprintf(buf, 64, "%u", this->VersionMinor); + this->Makefile->AddDefinition((ver+"_MINOR").c_str(), buf); + } // no break + case 1: + { + snprintf(buf, 64, "%u", this->VersionMajor); + this->Makefile->AddDefinition((ver+"_MAJOR").c_str(), buf); + } // no break + default: break; + } + } + // Load the module we found. found = true; return this->ReadListFile(mfile.c_str()); diff --git a/Source/cmFindPackageCommand.h b/Source/cmFindPackageCommand.h index af41048..7090eee 100644 --- a/Source/cmFindPackageCommand.h +++ b/Source/cmFindPackageCommand.h @@ -94,6 +94,11 @@ private: std::string CommandDocumentation; cmStdString Name; cmStdString Variable; + cmStdString Version; + unsigned int VersionMajor; + unsigned int VersionMinor; + unsigned int VersionPatch; + unsigned int VersionCount; cmStdString FileFound; bool Quiet; bool Required; |