OpenBSD: Work-around static/runtime linker inconsistency

Detect the runtime linker's search path and add to the compile time
linker's search path.  This is needed because OpenBSD's static linker
does not search for shared library dependencies in the same places as
the runtime linker.
This commit is contained in:
Chuck Atkins 2010-02-15 11:22:36 -05:00 committed by Brad King
parent a8abb30c38
commit e750761857
3 changed files with 29 additions and 0 deletions

View File

@ -1,2 +1,18 @@
INCLUDE(Platform/NetBSD)
# On OpenBSD, the compile time linker does not share it's configuration with
# the runtime linker. This will extract the library search paths from the
# system's ld.so.hints file which will allow CMake to set the appropriate
# -rpath-link flags
IF(NOT CMAKE_PLATFORM_RUNTIME_PATH)
EXECUTE_PROCESS(COMMAND /sbin/ldconfig -r
OUTPUT_VARIABLE LDCONFIG_HINTS
ERROR_QUIET)
STRING(REGEX REPLACE ".*search\\ directories:\\ ([^\n]*).*" "\\1"
LDCONFIG_HINTS "${LDCONFIG_HINTS}")
STRING(REGEX REPLACE ":" ";"
CMAKE_PLATFORM_RUNTIME_PATH
"${LDCONFIG_HINTS}")
ENDIF()
SET_PROPERTY(GLOBAL PROPERTY FIND_LIBRARY_USE_OPENBSD_VERSIONING 1)

View File

@ -376,6 +376,8 @@ cmComputeLinkInformation
{
this->OrderDependentRPath
->SetImplicitDirectories(this->ImplicitLinkDirs);
this->OrderDependentRPath
->AddLanguageDirectories(this->RuntimeLinkDirs);
}
// Decide whether to enable compatible library search path mode.
@ -1642,6 +1644,14 @@ void cmComputeLinkInformation::LoadImplicitLinkInfo()
this->ImplicitLinkLibs.insert(item);
}
}
// Get platform specific rpath link directories
if(const char *rpathDirs =
(this->Makefile->GetDefinition
("CMAKE_PLATFORM_RUNTIME_PATH")))
{
cmSystemTools::ExpandListArgument(rpathDirs, this->RuntimeLinkDirs);
}
}
//----------------------------------------------------------------------------

View File

@ -163,6 +163,9 @@ private:
std::set<cmStdString> ImplicitLinkDirs;
std::set<cmStdString> ImplicitLinkLibs;
// Additional paths configured by the runtime linker
std::vector<std::string> RuntimeLinkDirs;
// Linker search path compatibility mode.
std::set<cmStdString> OldLinkDirMask;
std::vector<std::string> OldLinkDirItems;