Browse Source

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.

Brad King 21 years ago
parent
commit
54c99dc5fd
2 changed files with 37 additions and 4 deletions
  1. 6 0
      Modules/Platform/Darwin-xlc.cmake
  2. 31 4
      Modules/Platform/Darwin.cmake

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

+ 31 - 4
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
-      "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
+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
-      "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
+  # 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
+      "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG> <TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
+    SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
+      "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG> <TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
+  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 <TARGET>.  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
+      "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG> \"`cd \\`dirname <TARGET>\\`\;pwd`/<TARGET_SONAME>\" <OBJECTS> <LINK_LIBRARIES>")
+    SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
+      "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG> \"`cd \\`dirname <TARGET>\\`\;pwd`/<TARGET_SONAME>\" <OBJECTS> <LINK_LIBRARIES>")
+  ENDIF(CMAKE_SKIP_RPATH)
+ELSE(CMAKE_GENERATOR_NEW)
+  SET(CMAKE_CXX_CREATE_SHARED_LIBRARY
+    "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
+  SET(CMAKE_C_CREATE_SHARED_LIBRARY
+    "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
+ENDIF(CMAKE_GENERATOR_NEW)
 
 SET(CMAKE_CXX_CREATE_SHARED_MODULE
       "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")