Ver Fonte

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\..*".
Rolf Eike Beer há 13 anos atrás
pai
commit
70f362305f
2 ficheiros alterados com 45 adições e 5 exclusões
  1. 14 4
      Source/cmFindLibraryCommand.cxx
  2. 31 1
      Tests/Complex/CMakeLists.txt

+ 14 - 4
Source/cmFindLibraryCommand.cxx

@@ -354,13 +354,23 @@ void cmFindLibraryHelper::RegexFromList(std::string& out,
 //----------------------------------------------------------------------------
 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();
       si != this->Suffixes.end(); ++si)
     {
-    std::string const& suffix = *si;
-    if(name.length() > suffix.length() &&
-       name.substr(name.size()-suffix.length()) == suffix)
+    std::string suffix = *si;
+    if(name.length() <= suffix.length())
+      {
+      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;
       }

+ 31 - 1
Tests/Complex/CMakeLists.txt

@@ -199,7 +199,9 @@ CONFIGURE_FILE(
   ${Complex_SOURCE_DIR}/Library/dummy
   ${Complex_BINARY_DIR}/Library/dummylib.lib
   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(
     ${Complex_SOURCE_DIR}/Library/dummy
     ${Complex_BINARY_DIR}/Library/libdummylib${ext}
@@ -216,6 +218,34 @@ FIND_LIBRARY(FIND_DUMMY_LIB
              PATHS
              ${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 
 #