Browse Source

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.
Chuck Atkins 16 years ago
parent
commit
e750761857

+ 16 - 0
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)

+ 10 - 0
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);
+    }
 }
 
 //----------------------------------------------------------------------------

+ 3 - 0
Source/cmComputeLinkInformation.h

@@ -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;