]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
CMake: Make symbol versioning configurable.
authorLasse Collin <lasse.collin@tukaani.org>
Wed, 13 Mar 2024 18:32:46 +0000 (20:32 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Fri, 15 Mar 2024 15:30:50 +0000 (17:30 +0200)
CMakeLists.txt

index a346dd0215af01f1a7f59ac2f50acee4929839f1..4da57773c17d35d8c7e69c8efaf5b1c3f9384643 100644 (file)
@@ -333,6 +333,46 @@ endif()
 
 option(BUILD_SHARED_LIBS "Build liblzma as a shared library instead of static")
 
+if(NOT WIN32)
+    # Symbol versioning only affects ELF shared libraries. The option is
+    # ignored for static libraries.
+    #
+    # Determine the default value so that it's always set with
+    # shared libraries in mind which helps if the build dir is reconfigured
+    # from static to shared libs without resetting the cache variables.
+    set(SYMBOL_VERSIONING_DEFAULT OFF)
+
+    if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND
+            CMAKE_SYSTEM_PROCESSOR MATCHES "[Mm]icro[Bb]laze")
+        # As a special case, GNU/Linux on MicroBlaze gets the generic
+        # symbol versioning because GCC 12 doesn't support the __symver__
+        # attribute on MicroBlaze. On Linux, CMAKE_SYSTEM_PROCESSOR comes
+        # from "uname -m" for native builds (should be "microblaze") or from
+        # the CMake toolchain file (not perfectly standardized but it very
+        # likely has "microblaze" in lower case or mixed case somewhere in
+        # the string).
+        set(SYMBOL_VERSIONING_DEFAULT "generic")
+
+    elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+        # GNU/Linux-specific symbol versioning for shared liblzma.
+        # This includes a few extra compatibility symbols for RHEL/CentOS 7
+        # which are pointless on non-glibc non-Linux systems.
+        #
+        # FIXME? Avoid symvers on Linux with non-glibc like musl?
+        set(SYMBOL_VERSIONING_DEFAULT "linux")
+
+    elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+        set(SYMBOL_VERSIONING_DEFAULT "generic")
+    endif()
+
+    set(SYMBOL_VERSIONING "${SYMBOL_VERSIONING_DEFAULT}" CACHE STRING
+        "Enable ELF shared library symbol versioning (OFF, generic, linux)")
+
+    # Show a dropdown menu in CMake GUI:
+    set_property(CACHE SYMBOL_VERSIONING PROPERTY STRINGS "OFF;generic;linux")
+endif()
+
+
 add_library(liblzma
     src/common/mythread.h
     src/common/sysdefs.h
@@ -1276,22 +1316,7 @@ if(WIN32)
         # Disable __declspec(dllimport) when linking against static liblzma.
         target_compile_definitions(liblzma INTERFACE LZMA_API_STATIC)
     endif()
-elseif(BUILD_SHARED_LIBS AND CMAKE_SYSTEM_NAME STREQUAL "Linux" AND
-       NOT CMAKE_SYSTEM_PROCESSOR MATCHES "[Mm]icro[Bb]laze")
-    # GNU/Linux-specific symbol versioning for shared liblzma.
-    # This includes a few extra compatibility symbols for RHEL/CentOS 7
-    # which are pointless on non-glibc non-Linux systems.
-    #
-    # As a special case, GNU/Linux on MicroBlaze gets the generic
-    # symbol versioning because GCC 12 doesn't support the __symver__
-    # attribute on MicroBlaze. On Linux, CMAKE_SYSTEM_PROCESSOR comes
-    # from "uname -m" for native builds (should be "microblaze") or from
-    # the CMake toolchain file (not perfectly standardized but it very
-    # likely has "microblaze" in lower case or mixed case somewhere in
-    # the string).
-    #
-    # FIXME? Avoid symvers on Linux with non-glibc like musl?
-    #
+elseif(BUILD_SHARED_LIBS AND SYMBOL_VERSIONING STREQUAL "linux")
     # Note that adding link options doesn't affect static builds
     # but HAVE_SYMBOL_VERSIONS_LINUX must not be used with static builds
     # because it would put symbol versions into the static library which
@@ -1307,10 +1332,7 @@ elseif(BUILD_SHARED_LIBS AND CMAKE_SYSTEM_NAME STREQUAL "Linux" AND
     set_target_properties(liblzma PROPERTIES
         LINK_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/liblzma/liblzma_linux.map"
     )
-elseif(BUILD_SHARED_LIBS AND (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR
-                              CMAKE_SYSTEM_NAME STREQUAL "Linux"))
-    # Generic symbol versioning for shared liblzma is used on FreeBSD and
-    # also on GNU/Linux on MicroBlaze.
+elseif(BUILD_SHARED_LIBS AND SYMBOL_VERSIONING STREQUAL "generic")
     target_link_options(liblzma PRIVATE
         "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/src/liblzma/liblzma_generic.map"
     )