From 54c99dc5fdfb845a3ae5076f5daa812adda36ad1 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 1 Mar 2005 12:26:25 -0500 Subject: [PATCH] ENH: Adding support for shared library versioning using the -install_name option on the OSX linker. This is actually needed to support relative -o paths which are used by cmLocalUnixMakefileGenerator2. --- Modules/Platform/Darwin-xlc.cmake | 6 ++++++ Modules/Platform/Darwin.cmake | 35 +++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Modules/Platform/Darwin-xlc.cmake b/Modules/Platform/Darwin-xlc.cmake index 8b4f9ffa2..ebe099b82 100644 --- a/Modules/Platform/Darwin-xlc.cmake +++ b/Modules/Platform/Darwin-xlc.cmake @@ -1,2 +1,8 @@ SET(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-qmkshrobj") SET(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle") + +IF(CMAKE_GENERATOR_NEW) + # Enable shared library versioning. + SET(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-Wl,-install_name") + SET(CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG "-Wl,-install_name") +ENDIF(CMAKE_GENERATOR_NEW) diff --git a/Modules/Platform/Darwin.cmake b/Modules/Platform/Darwin.cmake index 3bf460742..e3b8890b0 100644 --- a/Modules/Platform/Darwin.cmake +++ b/Modules/Platform/Darwin.cmake @@ -12,11 +12,38 @@ IF("${CMAKE_BACKWARDS_COMPATIBILITY}" MATCHES "^1\\.[0-6]$") "${CMAKE_SHARED_MODULE_CREATE_C_FLAGS} -flat_namespace -undefined suppress") ENDIF("${CMAKE_BACKWARDS_COMPATIBILITY}" MATCHES "^1\\.[0-6]$") -SET(CMAKE_CXX_CREATE_SHARED_LIBRARY - " -o ") +IF(CMAKE_GENERATOR_NEW) + # Enable shared library versioning. + SET(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-install_name") + SET(CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG "-install_name") -SET(CMAKE_C_CREATE_SHARED_LIBRARY - " -o ") + # OSX does not really implement an rpath, but it does allow a path to + # be specified in the soname field of a dylib. + IF(CMAKE_SKIP_RPATH) + # No rpath requested. Just use the soname directly. + SET(CMAKE_C_CREATE_SHARED_LIBRARY + " -o ") + SET(CMAKE_CXX_CREATE_SHARED_LIBRARY + " -o ") + ELSE(CMAKE_SKIP_RPATH) + # Support for rpath is requested. Approximate it by putting the + # full path to the library in the soname field. Then when executables + # link the library they will copy this full path as the name to use + # to find the library. We can get the directory containing the library + # by using the dirname of the . It may be a relative path + # so we use a "cd ...;pwd" trick to convert it to a full path at + # build time. + SET(CMAKE_C_CREATE_SHARED_LIBRARY + " -o \"`cd \\`dirname \\`\;pwd`/\" ") + SET(CMAKE_CXX_CREATE_SHARED_LIBRARY + " -o \"`cd \\`dirname \\`\;pwd`/\" ") + ENDIF(CMAKE_SKIP_RPATH) +ELSE(CMAKE_GENERATOR_NEW) + SET(CMAKE_CXX_CREATE_SHARED_LIBRARY + " -o ") + SET(CMAKE_C_CREATE_SHARED_LIBRARY + " -o ") +ENDIF(CMAKE_GENERATOR_NEW) SET(CMAKE_CXX_CREATE_SHARED_MODULE " -o ")