From e750761857fa2e35ad9630b13606570c561ae829 Mon Sep 17 00:00:00 2001 From: Chuck Atkins Date: Mon, 15 Feb 2010 11:22:36 -0500 Subject: 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. --- Modules/Platform/OpenBSD.cmake | 16 ++++++++++++++++ Source/cmComputeLinkInformation.cxx | 10 ++++++++++ Source/cmComputeLinkInformation.h | 3 +++ 3 files changed, 29 insertions(+) diff --git a/Modules/Platform/OpenBSD.cmake b/Modules/Platform/OpenBSD.cmake index e7df46d..b4ed66f 100644 --- a/Modules/Platform/OpenBSD.cmake +++ b/Modules/Platform/OpenBSD.cmake @@ -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) diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index 69a4d22..d84da52 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -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); + } } //---------------------------------------------------------------------------- diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h index ad2026b..bbeed68 100644 --- a/Source/cmComputeLinkInformation.h +++ b/Source/cmComputeLinkInformation.h @@ -163,6 +163,9 @@ private: std::set ImplicitLinkDirs; std::set ImplicitLinkLibs; + // Additional paths configured by the runtime linker + std::vector RuntimeLinkDirs; + // Linker search path compatibility mode. std::set OldLinkDirMask; std::vector OldLinkDirItems; -- cgit v0.12