summaryrefslogtreecommitdiffstats
path: root/Source/cmSystemTools.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2008-02-21 18:58:41 (GMT)
committerBrad King <brad.king@kitware.com>2008-02-21 18:58:41 (GMT)
commit782e9f7ffe722fc7dac1353cd95a31e7140e5c6f (patch)
treeb4acc56525e8c006fd2da48e28d5f28c41a8e3e0 /Source/cmSystemTools.cxx
parentfd37a6ec3d31e65eed2dfa88246e86b8d0ab66ab (diff)
downloadCMake-782e9f7ffe722fc7dac1353cd95a31e7140e5c6f.zip
CMake-782e9f7ffe722fc7dac1353cd95a31e7140e5c6f.tar.gz
CMake-782e9f7ffe722fc7dac1353cd95a31e7140e5c6f.tar.bz2
ENH: Improve linking to third-party shared libraries on soname platforms
- Reduce false positives in cases of unknown soname - Make library extension regular expressions match only at end of string - When linking to libraries in implicit dirs convert to the -l option only if the file name is one that can be found by the linker (ex. /usr/lib/libfoo.so.1 should be linked by full path) - Add cmSystemTools::GuessLibrarySOName to guess the soname of a library based on presence of a symlink - In cmComputeLinkInformation try to guess an soname before assuming that a third-party library is built without an soname - In cmOrderDirectories guess the soname of shared libraries in cases it is otherwise unknown
Diffstat (limited to 'Source/cmSystemTools.cxx')
-rw-r--r--Source/cmSystemTools.cxx31
1 files changed, 31 insertions, 0 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 002dc0b..8d13e11 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -2150,3 +2150,34 @@ void cmSystemTools::MakefileColorEcho(int color, const char* message,
}
}
#endif
+
+//----------------------------------------------------------------------------
+bool cmSystemTools::GuessLibrarySOName(std::string const& fullPath,
+ std::string& soname)
+{
+ // If the file is not a symlink we have no guess for its soname.
+ if(!cmSystemTools::FileIsSymlink(fullPath.c_str()))
+ {
+ return false;
+ }
+ if(!cmSystemTools::ReadSymlink(fullPath.c_str(), soname))
+ {
+ return false;
+ }
+
+ // If the symlink has a path component we have no guess for the soname.
+ if(!cmSystemTools::GetFilenamePath(soname).empty())
+ {
+ return false;
+ }
+
+ // If the symlink points at an extended version of the same name
+ // assume it is the soname.
+ std::string name = cmSystemTools::GetFilenameName(fullPath);
+ if(soname.length() > name.length() &&
+ soname.substr(0, name.length()) == name)
+ {
+ return true;
+ }
+ return false;
+}