VisibilityInlinesHidden: only apply -fvisibility-inlines-hidden to C++ sources

This commit is contained in:
Nils Gladitz 2014-01-31 16:09:06 +01:00
parent f35c01e2a5
commit efdcebddbd
6 changed files with 68 additions and 1 deletions

View File

@ -2187,7 +2187,11 @@ void cmLocalGenerator
return; return;
} }
AddVisibilityCompileOption(flags, target, this, lang); AddVisibilityCompileOption(flags, target, this, lang);
if(strcmp(lang, "CXX") == 0)
{
AddInlineVisibilityCompileOption(flags, target, this); AddInlineVisibilityCompileOption(flags, target, this);
}
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------

View File

@ -400,6 +400,29 @@ if(BUILD_TESTING)
ADD_TEST_MACRO(PositionIndependentTargets PositionIndependentTargets) ADD_TEST_MACRO(PositionIndependentTargets PositionIndependentTargets)
endif() endif()
if((CMAKE_CXX_COMPILER_ID MATCHES "GNU") AND
(NOT "${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 4.2) AND
(CMAKE_SYSTEM_NAME MATCHES "Linux"))
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag(
-fvisibility-inlines-hidden run_inlines_hidden_test)
endif()
if(run_inlines_hidden_test)
add_test(VisibilityInlinesHidden ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/VisibilityInlinesHidden"
"${CMake_BINARY_DIR}/Tests/VisibilityInlinesHidden"
${build_generator_args}
--build-project VisibilityInlinesHidden
--build-options ${build_options}
)
list(APPEND TEST_BUILD_DIRS
"${CMake_BINARY_DIR}/Tests/VisibilityInlinesHidden"
)
endif()
add_test(LinkFlags-prepare add_test(LinkFlags-prepare
${CMAKE_CTEST_COMMAND} -C \${CTEST_CONFIGURATION_TYPE} ${CMAKE_CTEST_COMMAND} -C \${CTEST_CONFIGURATION_TYPE}
--build-and-test --build-and-test

View File

@ -0,0 +1,14 @@
cmake_minimum_required(VERSION 2.8)
project(VisibilityInlinesHidden)
add_library(inlines_hidden SHARED foo.cpp bar.c)
set_property(TARGET inlines_hidden PROPERTY VISIBILITY_INLINES_HIDDEN ON)
target_compile_options(inlines_hidden PRIVATE -Werror)
add_custom_command(TARGET inlines_hidden POST_BUILD
COMMAND ${CMAKE_COMMAND}
-DCMAKE_NM=${CMAKE_NM}
-DTEST_LIBRARY_PATH=$<TARGET_FILE:inlines_hidden>
-P ${CMAKE_CURRENT_SOURCE_DIR}/verify.cmake
)

View File

@ -0,0 +1 @@
void bar() {}

View File

@ -0,0 +1,11 @@
class Foo
{
public:
void bar() {}
};
void baz()
{
Foo foo;
foo.bar();
}

View File

@ -0,0 +1,14 @@
execute_process(COMMAND ${CMAKE_NM} -D ${TEST_LIBRARY_PATH}
RESULT_VARIABLE RESULT
OUTPUT_VARIABLE OUTPUT
ERROR_VARIABLE ERROR
)
if(NOT "${RESULT}" STREQUAL "0")
message(FATAL_ERROR "nm failed [${RESULT}] [${OUTPUT}] [${ERROR}]")
endif()
if(${OUTPUT} MATCHES "Foo[^\\n]*bar")
message(FATAL_ERROR
"Found Foo::bar() which should have been hidden [${OUTPUT}]")
endif()