summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2008-01-21 13:48:33 (GMT)
committerBrad King <brad.king@kitware.com>2008-01-21 13:48:33 (GMT)
commitf41b1e8e9148c62e186e0729c5a5144c51e944e9 (patch)
tree4c0b4a7d6829a94e2248e6fe583279f906317c3f /Source
parent9198a92af9e9f05a90d544c76ffeb65aa1a5281e (diff)
downloadCMake-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.cxx63
-rw-r--r--Source/cmFindPackageCommand.h5
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;