]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
CMake: Don't assume that -fvisibility=hidden is supported outside Windows.
authorLasse Collin <lasse.collin@tukaani.org>
Mon, 19 Feb 2024 11:38:42 +0000 (13:38 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Mon, 19 Feb 2024 14:28:49 +0000 (16:28 +0200)
The original code was good enough for supporting GNU/Linux
and a few others but it wasn't very portable.

CMake doesn't support Solaris Studio's -xldscope=hidden.
If it ever does, things should still work with this commit
as Solaris Studio supports not only its own __global but also
the GNU C __attribute__((visibility("default"))). Support for the
attribute was added in 2007 to Sun Studio 12 compiler version 5.9.

CMakeLists.txt

index ac89b2e643a27e8bcce1e95bbe99c24d355b1a96..3a3ec41dc8464b922c8d05072473f0c48b755274 100644 (file)
@@ -1144,10 +1144,28 @@ if(ALLOW_ARM64_CRC32)
 endif()
 
 
-# Support -fvisiblity=hidden when building shared liblzma.
-# These lines do nothing on Windows (even under Cygwin).
-# HAVE_VISIBILITY should always be defined to 0 or 1.
-if(BUILD_SHARED_LIBS)
+# Symbol visibility support:
+#
+# The C_VISIBILITY_PRESET property takes care of adding the compiler
+# option -fvisibility=hidden (or equivalent) if and only if it is supported.
+#
+# HAVE_VISIBILITY should always be defined to 0 or 1. It tells liblzma
+# if __attribute__((__visibility__("default")))
+# and __attribute__((__visibility__("hidden"))) are supported.
+# Those are useful only when the compiler supports -fvisibility=hidden
+# or such option so HAVE_VISIBILITY should be 1 only when both option and
+# the attribute support are present. HAVE_VISIBILITY is ignored on Windows
+# and Cygwin by the liblzma C code; __declspec(dllexport) is used instead.
+#
+# CMake's GenerateExportHeader module is too fancy since liblzma already
+# has the necessary macros. Instead, check CMake's internal variable
+# CMAKE_C_COMPILE_OPTIONS_VISIBILITY (it's the C-specific variant of
+# CMAKE_<LANG>_COMPILE_OPTIONS_VISIBILITY) which contains the compiler
+# command line option for visibility support. It's empty or unset when
+# visibility isn't supported. (It was added to CMake 2.8.12 in the commit
+# 0e9f4bc00c6b26f254e74063e4026ac33b786513 in 2013.) This way we don't
+# set HAVE_VISIBILITY to 1 when visibility isn't actually supported.
+if(BUILD_SHARED_LIBS AND CMAKE_C_COMPILE_OPTIONS_VISIBILITY)
     set_target_properties(liblzma PROPERTIES C_VISIBILITY_PRESET hidden)
     target_compile_definitions(liblzma PRIVATE HAVE_VISIBILITY=1)
 else()