[CMake] Function for visibility definitions
Hilton Medeiros
medeiros.hilton at gmail.com
Wed Feb 10 13:46:57 EST 2010
Hello,
I made a simple cmake module that defines a function to create the
visibility definitions discussed in an earlier post about DEFINE_SYMBOL
that some users (including me) get confused over.
In case someone come here looking for it, I pushed it here:
http://gitorious.org/ferric-cmake-stuff/mainline/blobs/master/VisibilityDefinitions.cmake
But I still think this could be supported in CMake.
I will post it here since it on public domain, just keep in mind
I did not test it on different platforms:
####################################################################
# VisibilityDefinitions
#
# check_gcc_visibility()
# GCC_SUPPORTS_VISIBILITY = true if gcc supports visibility
#
# add_visibility_definitions([PREFIX prefix]
# [SHARED | STATIC]
# [EXPORT_SUFFIX suffix]
# [PRIVATE_SUFFIX suffix])
#
# Adds the visibility definitions for the COMPILE_DEFINITIONS
# property for the current directory. If neither SHARED nor STATIC
# are given, BUILD_SHARED_LIBS will be used.
#
# GCC_SUPPORTS_VISIBILITY = true if gcc supports visibility
macro (check_gcc_visibility)
include (CheckCXXCompilerFlag)
check_cxx_compiler_flag(-fvisibility=hidden GCC_SUPPORTS_VISIBILITY)
endmacro()
function (add_visibility_definitions)
set (GCC_EXPORT __attribute__\(\(visibility\(\"default\"\)\)\))
set (GCC_PRIVATE __attribute__\(\(visibility\(\"hidden\"\)\)\))
set (WIN_EXPORT __declspec\(dllexport\))
set (WIN_PRIVATE __declspec\(dllimport\))
foreach(ARG ${ARGV})
if (LAST_ARG STREQUAL "PREFIX")
set (PREFIX ${ARG})
unset (LAST_ARG)
elseif(LAST_ARG STREQUAL "EXPORT_SUFFIX")
set (EXPORT_SUFFIX ${ARG})
unset (LAST_ARG)
elseif(LAST_ARG STREQUAL "PRIVATE_SUFFIX")
set (PRIVATE_SUFFIX ${ARG})
unset (LAST_ARG)
else()
if (ARG STREQUAL "SHARED")
set (SHARED TRUE)
elseif(ARG STREQUAL "STATIC")
set (SHARED FALSE)
else()
set (LAST_ARG ${ARG})
endif()
endif()
endforeach()
if (NOT DEFINED SHARED)
set (SHARED ${BUILD_SHARED_LIBS})
endif()
if (NOT EXPORT_SUFFIX)
set (EXPORT_SUFFIX _EXPORTS)
endif()
if (NOT PRIVATE_SUFFIX)
set (PRIVATE_SUFFIX _PRIVATE)
endif()
if (UNIX)
check_gcc_visibility()
if (GCC_SUPPORTS_VISIBILITY)
add_definitions (-D${PREFIX}${EXPORT_SUFFIX}=${GCC_EXPORT}
-D${PREFIX}${PRIVATE_SUFFIX}=${GCC_PRIVATE})
else()
add_definitions (-D${PREFIX}${EXPORT_SUFFIX}
-D${PREFIX}${PRIVATE_SUFFIX})
endif()
elseif (WIN32)
if (SHARED)
add_definitions (-D${PREFIX}${EXPORT_SUFFIX}=${WIN_EXPORT}
-D${PREFIX}${PRIVATE_SUFFIX}=${WIN_PRIVATE})
else()
add_definitions (-D${PREFIX}${EXPORT_SUFFIX}
-D${PREFIX}${PRIVATE_SUFFIX})
endif()
endif()
endfunction()
####################################################################
Kind regards,
Hilton
More information about the CMake
mailing list