Find_library(): allow searching for versioned shared objects

This did not work because find_library() did only treat the given name as
complete filename if is matched "PREFIX.*SUFFIX":

find_library(MYLIB libfoo.so.2)

Now it is also taken as a whole if the name matches "PREFIX.*SUFFIX\..*".
This commit is contained in:
Rolf Eike Beer 2012-02-15 19:55:57 +01:00
parent a8b5714935
commit 70f362305f
2 changed files with 45 additions and 5 deletions

View File

@ -354,13 +354,23 @@ void cmFindLibraryHelper::RegexFromList(std::string& out,
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool cmFindLibraryHelper::HasValidSuffix(std::string const& name) bool cmFindLibraryHelper::HasValidSuffix(std::string const& name)
{ {
// Check if the given name ends in a valid library suffix.
for(std::vector<std::string>::const_iterator si = this->Suffixes.begin(); for(std::vector<std::string>::const_iterator si = this->Suffixes.begin();
si != this->Suffixes.end(); ++si) si != this->Suffixes.end(); ++si)
{ {
std::string const& suffix = *si; std::string suffix = *si;
if(name.length() > suffix.length() && if(name.length() <= suffix.length())
name.substr(name.size()-suffix.length()) == suffix) {
continue;
}
// Check if the given name ends in a valid library suffix.
if(name.substr(name.size()-suffix.length()) == suffix)
{
return true;
}
// Check if a valid library suffix is somewhere in the name,
// this may happen e.g. for versioned shared libraries: libfoo.so.2
suffix += ".";
if(name.find(suffix) != name.npos)
{ {
return true; return true;
} }

View File

@ -199,7 +199,9 @@ CONFIGURE_FILE(
${Complex_SOURCE_DIR}/Library/dummy ${Complex_SOURCE_DIR}/Library/dummy
${Complex_BINARY_DIR}/Library/dummylib.lib ${Complex_BINARY_DIR}/Library/dummylib.lib
COPYONLY IMMEDIATE) COPYONLY IMMEDIATE)
FOREACH (ext ${CMAKE_SHLIB_SUFFIX};.so;.a;.sl) FOREACH (ext ${CMAKE_SHLIB_SUFFIX};.so;.a;.sl
${CMAKE_SHARED_LIBRARY_SUFFIX}.2
${CMAKE_STATIC_LIBRARY_SUFFIX}.2)
CONFIGURE_FILE( CONFIGURE_FILE(
${Complex_SOURCE_DIR}/Library/dummy ${Complex_SOURCE_DIR}/Library/dummy
${Complex_BINARY_DIR}/Library/libdummylib${ext} ${Complex_BINARY_DIR}/Library/libdummylib${ext}
@ -216,6 +218,34 @@ FIND_LIBRARY(FIND_DUMMY_LIB
PATHS PATHS
${Complex_BINARY_DIR}/Library DOC "find dummy lib") ${Complex_BINARY_DIR}/Library DOC "find dummy lib")
# This doesn't work for platforms that have a shared library and an import
# library, like Windows with .dll and .lib. Limit is to ".so" now because it's
# known to work there.
IF(CMAKE_SHARED_LIBRARY_SUFFIX STREQUAL ".so")
FIND_LIBRARY(FIND_DUMMY_SHLIB_VERSIONED
NAMES libdummylib${CMAKE_SHARED_LIBRARY_SUFFIX}.2
PATHS ${Complex_BINARY_DIR}/Library
DOC "find versioned dummy shared lib"
NO_DEFAULT_PATH)
IF(NOT FIND_DUMMY_SHLIB_VERSIONED MATCHES "/libdummylib${CMAKE_SHARED_LIBRARY_SUFFIX}.2")
MESSAGE(SEND_ERROR "FIND_DUMMY_SHLIB_VERSIONED is not set correctly: "
"${FIND_DUMMY_SHLIB_VERSIONED}")
ENDIF()
ENDIF()
# Static library, should work everywhere
FIND_LIBRARY(FIND_DUMMY_STLIB_VERSIONED
NAMES libdummylib${CMAKE_STATIC_LIBRARY_SUFFIX}.2
PATHS ${Complex_BINARY_DIR}/Library
DOC "find versioned dummy static lib"
NO_DEFAULT_PATH)
IF(NOT FIND_DUMMY_STLIB_VERSIONED MATCHES "/libdummylib${CMAKE_STATIC_LIBRARY_SUFFIX}.2")
MESSAGE(SEND_ERROR "FIND_DUMMY_STLIB_VERSIONED is not set correctly: "
"${FIND_DUMMY_STLIB_VERSIONED}")
ENDIF()
# #
# Test SET_SOURCE_FILES_PROPERTIES # Test SET_SOURCE_FILES_PROPERTIES
# #