From ce975dce7ae8950b6e7b9a2d0c00ead9d45f73ff Mon Sep 17 00:00:00 2001 From: Nikolaus Waxweiler Date: Wed, 14 Mar 2018 00:50:32 +0000 Subject: [PATCH 1/2] CMake: hide symbols by default on non-MSVC, define export attribute This change makes sure that non-MSVC builds using CMake properly hide non-exported functions. --- CMakeLists.txt | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 53e89740d..3de853992 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -131,14 +131,6 @@ if (MSVC) add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS) endif () -if (BUILD_SHARED_LIBS) - if (WIN32 AND NOT MINGW) - add_definitions("-DHB_EXTERN=__declspec(dllexport) extern") - else () - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden") - endif () -endif () - ## Detect if we are running inside a distribution or regular repository folder # if (EXISTS "${PROJECT_SOURCE_DIR}/ChangeLog") @@ -534,6 +526,18 @@ endif () add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers}) target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS}) +if (BUILD_SHARED_LIBS) + if (WIN32 AND NOT MINGW) + add_definitions("-DHB_EXTERN=__declspec(dllexport) extern") + else () + add_definitions("-DHB_EXTERN=__attribute__(( visibility( \"default\" ) )) extern") + set_target_properties(harfbuzz PROPERTIES + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN TRUE) + endif () +endif () + ## Define harfbuzz-subset library add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers}) add_dependencies(harfbuzz-subset harfbuzz) From 22de9bf56d80dbf6a13a06beafd21711bdab78af Mon Sep 17 00:00:00 2001 From: Nikolaus Waxweiler Date: Wed, 14 Mar 2018 10:29:24 +0000 Subject: [PATCH 2/2] Enable implicit symbol hiding for all libraries, static and shared This covers all built libraries now and both static and shared builds. --- CMakeLists.txt | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3de853992..b9796ebfa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,7 @@ cmake_minimum_required(VERSION 2.8.0) +# Allow symbol hiding for both static and shared libs. +cmake_policy(SET CMP0063 NEW) + project(harfbuzz) enable_testing() @@ -524,23 +527,19 @@ endif () ## Define harfbuzz library add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers}) +set_target_properties(harfbuzz PROPERTIES + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN TRUE) target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS}) -if (BUILD_SHARED_LIBS) - if (WIN32 AND NOT MINGW) - add_definitions("-DHB_EXTERN=__declspec(dllexport) extern") - else () - add_definitions("-DHB_EXTERN=__attribute__(( visibility( \"default\" ) )) extern") - set_target_properties(harfbuzz PROPERTIES - C_VISIBILITY_PRESET hidden - CXX_VISIBILITY_PRESET hidden - VISIBILITY_INLINES_HIDDEN TRUE) - endif () -endif () - ## Define harfbuzz-subset library add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers}) add_dependencies(harfbuzz-subset harfbuzz) +set_target_properties(harfbuzz-subset PROPERTIES + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN TRUE) target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS}) if (UNIX OR MINGW) @@ -568,11 +567,23 @@ if (HB_HAVE_GOBJECT) ${hb_gobject_headers} ${hb_gobject_gen_headers} ) + set_target_properties(harfbuzz-gobject PROPERTIES + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN TRUE) include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/src) add_dependencies(harfbuzz-gobject harfbuzz) target_link_libraries(harfbuzz-gobject harfbuzz ${GOBJECT_LIBRARIES} ${THIRD_PARTY_LIBS}) endif () +if (BUILD_SHARED_LIBS) + if (WIN32 AND NOT MINGW) + add_definitions("-DHB_EXTERN=__declspec(dllexport) extern") + else () + add_definitions("-DHB_EXTERN=__attribute__(( visibility( \"default\" ) )) extern") + endif () +endif () + # On Windows, g-ir-scanner requires a DLL build in order for it to work if (WIN32) if (NOT BUILD_SHARED_LIBS)