|
@@ -0,0 +1,62 @@
|
|
|
+
|
|
|
+
|
|
|
+#!
|
|
|
+#! \brief Helper macro which appends gcc compatible visibility flags to the
|
|
|
+#! variable given by RESULT_VAR.
|
|
|
+#!
|
|
|
+#! If supported, the flags -fvisibility=hidden and -fvisibility-inlines-hidden
|
|
|
+#! will be added. This applies to gcc >= 4.5 and Clang.
|
|
|
+#!
|
|
|
+#! Usage:
|
|
|
+#! ctkFunctionGetCompilerVisibilityFlags(RESULT_VAR)
|
|
|
+#!
|
|
|
+#! Example:
|
|
|
+#!
|
|
|
+#! \code
|
|
|
+#! set(myflags "-Werror")
|
|
|
+#! ctkFunctionGetCompilerVisibilityFlags(myflags)
|
|
|
+#! \endcode
|
|
|
+#!
|
|
|
+#! The variable \emph myflags will contain the string "-Werror -fvisibility -fvisibility-inlines-hidden"
|
|
|
+#! if for example gcc 4.6 is used.
|
|
|
+#!
|
|
|
+#! \ingroup CMakeUtilities
|
|
|
+function(ctkFunctionGetCompilerVisibilityFlags RESULT_VAR)
|
|
|
+
|
|
|
+ # We only support hidden visibility for gcc for now. Clang 3.0 still has troubles with
|
|
|
+ # correctly marking template declarations and explicit template instantiations as exported.
|
|
|
+ # See http://comments.gmane.org/gmane.comp.compilers.clang.scm/50028
|
|
|
+ # and http://llvm.org/bugs/show_bug.cgi?id=10113
|
|
|
+ set(use_visibility_flags 0)
|
|
|
+
|
|
|
+ if(CMAKE_COMPILER_IS_GNUCXX)
|
|
|
+
|
|
|
+ set(use_visibility_flags 1)
|
|
|
+ ctkFunctionGetGccVersion(${CMAKE_CXX_COMPILER} GCC_VERSION)
|
|
|
+
|
|
|
+ # MinGW does not export all symbols automatically, so no need to set flags.
|
|
|
+ #
|
|
|
+ # With gcc < 4.5, RTTI symbols from classes declared in third-party libraries
|
|
|
+ # which are not "gcc visibility aware" are marked with hidden visibility in
|
|
|
+ # DSOs which include the class declaration and which are compiled with
|
|
|
+ # hidden visibility. This leads to dynamic_cast and exception handling problems.
|
|
|
+ # While this problem could be worked around by sandwiching the include
|
|
|
+ # directives for the third-party headers between "#pragma visibility push/pop"
|
|
|
+ # statements, it is generally safer to just use default visibility with
|
|
|
+ # gcc < 4.5.
|
|
|
+
|
|
|
+ if(${GCC_VERSION} VERSION_LESS "4.5" OR MINGW)
|
|
|
+ set(use_visibility_flags 0)
|
|
|
+ endif()
|
|
|
+
|
|
|
+ endif()
|
|
|
+
|
|
|
+ if(use_visibility_flags)
|
|
|
+ set(visibility_flags "")
|
|
|
+ ctkFunctionCheckCompilerFlags("-fvisibility=hidden" visibility_flags)
|
|
|
+ ctkFunctionCheckCompilerFlags("-fvisibility-inlines-hidden" visibility_flags)
|
|
|
+ set(${RESULT_VAR} "${${RESULT_VAR}} ${visibility_flags}" PARENT_SCOPE)
|
|
|
+ endif()
|
|
|
+
|
|
|
+endfunction()
|
|
|
+
|