[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