Browse Source

find_library: Check that library files are readable

Refactoring in commit 6b85166920 (ENH: Refactor find_library search
logic, 2008-09-22, v2.8.0~1665) dropped a call to `FileExists` on the
path under the assumption that the presence of a file in a directory
listing means it exists.  However, dropping that also dropped a check
that verifies the file is readable.  Restore the `FileExists` call to
ensure that we only find readable libraries.
Brad King 5 years ago
parent
commit
f2c903fb9a

+ 2 - 1
Source/cmFindLibraryCommand.cxx

@@ -433,7 +433,8 @@ bool cmFindLibraryHelper::CheckDirectoryForName(std::string const& path,
 #endif
     if (name.Regex.find(testName)) {
       this->TestPath = cmStrCat(path, origName);
-      if (!cmSystemTools::FileIsDirectory(this->TestPath)) {
+      // Make sure the path is readable and is not a directory.
+      if (cmSystemTools::FileExists(this->TestPath, true)) {
         this->DebugLibraryFound(name.Raw, dir);
 
         // This is a matching file.  Check if it is better than the

+ 1 - 1
Tests/RunCMake/CMakeLists.txt

@@ -317,7 +317,7 @@ add_RunCMake_test(ctest_upload)
 add_RunCMake_test(ctest_fixtures)
 add_RunCMake_test(file)
 add_RunCMake_test(find_file)
-add_RunCMake_test(find_library)
+add_RunCMake_test(find_library -DCYGWIN=${CYGWIN})
 add_RunCMake_test(find_package)
 add_RunCMake_test(find_path)
 add_RunCMake_test(find_program -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME})

+ 2 - 0
Tests/RunCMake/find_library/LibSymLink-stderr.txt

@@ -0,0 +1,2 @@
+^SYMLINK_LIBRARY='SYMLINK_LIBRARY-NOTFOUND'
+SYMLINK_LIBRARY='[^']*/Tests/RunCMake/find_library/LibSymLink-build/lib/libsymlink.a'$

+ 17 - 0
Tests/RunCMake/find_library/LibSymLink.cmake

@@ -0,0 +1,17 @@
+list(APPEND CMAKE_FIND_LIBRARY_PREFIXES lib)
+list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES .a)
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib)
+file(CREATE_LINK "libsymlinked.a" "${CMAKE_CURRENT_BINARY_DIR}/lib/libsymlink.a" SYMBOLIC)
+find_library(SYMLINK_LIBRARY
+  NAMES symlink
+  PATHS ${CMAKE_CURRENT_BINARY_DIR}/lib
+  NO_DEFAULT_PATH
+  )
+message("SYMLINK_LIBRARY='${SYMLINK_LIBRARY}'")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib/libsymlinked.a" "symlinked")
+find_library(SYMLINK_LIBRARY
+  NAMES symlink
+  PATHS ${CMAKE_CURRENT_BINARY_DIR}/lib
+  NO_DEFAULT_PATH
+  )
+message("SYMLINK_LIBRARY='${SYMLINK_LIBRARY}'")

+ 2 - 1
Tests/RunCMake/find_library/RunCMakeTest.cmake

@@ -3,8 +3,9 @@ include(RunCMake)
 run_cmake(Created)
 run_cmake(FromPrefixPath)
 run_cmake(FromPATHEnv)
-if(CMAKE_HOST_UNIX)
+if(UNIX AND NOT CYGWIN)
   run_cmake(LibArchLink)
+  run_cmake(LibSymLink)
 endif()
 run_cmake(PrefixInPATH)
 run_cmake(Required)