SFML shared libraries now use ELF visibility on Unixes with gcc >= 4

This commit is contained in:
Laurent Gomila 2011-10-16 19:30:37 +02:00
parent 512a7c63cb
commit eed112d9ea
2 changed files with 59 additions and 33 deletions

View File

@ -133,29 +133,37 @@ macro(sfml_add_library target)
endif() endif()
endif() endif()
# on Unix systems with gcc 4.x, we must hide public symbols by default
# (exported ones are explicitely marked)
if((LINUX OR MACOSX) AND COMPILER_GCC)
if(${GCC_VERSION} MATCHES "4\\..*")
set_target_properties(${target} PROPERTIES COMPILE_FLAGS -fvisibility=hidden)
endif()
endif()
# link the target to its SFML dependencies # link the target to its SFML dependencies
if(THIS_DEPENDS) if(THIS_DEPENDS)
target_link_libraries(${target} ${THIS_DEPENDS}) target_link_libraries(${target} ${THIS_DEPENDS})
endif() endif()
# build frameworks or dylibs # build frameworks or dylibs
if(MACOSX AND BUILD_SHARED_LIBS) if(MACOSX AND BUILD_SHARED_LIBS)
if(BUILD_FRAMEWORKS) if(BUILD_FRAMEWORKS)
# adapt target to build frameworks instead of dylibs # adapt target to build frameworks instead of dylibs
set_target_properties(${target} PROPERTIES set_target_properties(${target} PROPERTIES
FRAMEWORK TRUE FRAMEWORK TRUE
FRAMEWORK_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} FRAMEWORK_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
MACOSX_FRAMEWORK_IDENTIFIER org.sfml-dev.${target} MACOSX_FRAMEWORK_IDENTIFIER org.sfml-dev.${target}
MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}
MACOSX_FRAMEWORK_BUNDLE_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) MACOSX_FRAMEWORK_BUNDLE_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
endif() endif()
# adapt install directory to allow distributing dylibs/frameworks in users frameworks/application bundle # adapt install directory to allow distributing dylibs/frameworks in users frameworks/application bundle
set_target_properties(${target} PROPERTIES set_target_properties(${target} PROPERTIES
BUILD_WITH_INSTALL_RPATH 1 BUILD_WITH_INSTALL_RPATH 1
INSTALL_NAME_DIR "@executable_path/../Frameworks") INSTALL_NAME_DIR "@executable_path/../Frameworks")
endif() endif()
# link the target to its external dependencies # link the target to its external dependencies
if(THIS_EXTERNAL_LIBS) if(THIS_EXTERNAL_LIBS)
if(BUILD_SHARED_LIBS) if(BUILD_SHARED_LIBS)
@ -172,7 +180,7 @@ macro(sfml_add_library target)
install(TARGETS ${target} install(TARGETS ${target}
RUNTIME DESTINATION bin COMPONENT bin RUNTIME DESTINATION bin COMPONENT bin
LIBRARY DESTINATION lib${LIB_SUFFIX} COMPONENT bin LIBRARY DESTINATION lib${LIB_SUFFIX} COMPONENT bin
ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT devel ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT devel
FRAMEWORK DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX} COMPONENT bin) FRAMEWORK DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX} COMPONENT bin)
endmacro() endmacro()

View File

@ -97,32 +97,50 @@
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// Define portable import / export macros // Define portable import / export macros
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
#if defined(SFML_SYSTEM_WINDOWS) && !defined(SFML_STATIC) #if !defined(SFML_STATIC)
#ifdef SFML_EXPORTS #if defined(SFML_SYSTEM_WINDOWS)
// From DLL side, we must export #ifdef SFML_EXPORTS
#define SFML_API __declspec(dllexport)
#else // From DLL side, we must export
#define SFML_API __declspec(dllexport)
// From client application side, we must import #else
#define SFML_API __declspec(dllimport)
#endif // From client application side, we must import
#define SFML_API __declspec(dllimport)
// For Visual C++ compilers, we also need to turn off this annoying C4251 warning. #endif
// You can read lots ot different things about it, but the point is the code will
// just work fine, and so the simplest way to get rid of this warning is to disable it
#ifdef _MSC_VER
#pragma warning(disable : 4251) // For Visual C++ compilers, we also need to turn off this annoying C4251 warning.
// You can read lots ot different things about it, but the point is the code will
// just work fine, and so the simplest way to get rid of this warning is to disable it
#ifdef _MSC_VER
#pragma warning(disable : 4251)
#endif
#else // Linux, FreeBSD, Mac OS X
#if __GNUC__ >= 4
// gcc 4 has special keywords for showing/hidding symbols
#define SFML_API __attribute__ ((visibility ("default")))
#else
// gcc < 4 has no mechanism to explicitely hide symbols, everything's exported
#define SFML_API
#endif
#endif #endif
#else #else
// Other platforms and static build don't need these export macros // Static build doesn't need these export macros
#define SFML_API #define SFML_API
#endif #endif