summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNils Gladitz <nilsgladitz@gmail.com>2014-01-31 15:09:06 (GMT)
committerNils Gladitz <nilsgladitz@gmail.com>2014-02-01 08:55:24 (GMT)
commitefdcebddbdc47e91254461da40cec2be869a0940 (patch)
tree7af9af19107e401314c32e71ee28f413ef700c49
parentf35c01e2a5e3834094fbd98eccfc2a686872fceb (diff)
downloadCMake-efdcebddbdc47e91254461da40cec2be869a0940.zip
CMake-efdcebddbdc47e91254461da40cec2be869a0940.tar.gz
CMake-efdcebddbdc47e91254461da40cec2be869a0940.tar.bz2
VisibilityInlinesHidden: only apply -fvisibility-inlines-hidden to C++ sources
-rw-r--r--Source/cmLocalGenerator.cxx6
-rw-r--r--Tests/CMakeLists.txt23
-rw-r--r--Tests/VisibilityInlinesHidden/CMakeLists.txt14
-rw-r--r--Tests/VisibilityInlinesHidden/bar.c1
-rw-r--r--Tests/VisibilityInlinesHidden/foo.cpp11
-rw-r--r--Tests/VisibilityInlinesHidden/verify.cmake14
6 files changed, 68 insertions, 1 deletions
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index c13b8ee..a2a66ae 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -2187,7 +2187,11 @@ void cmLocalGenerator
return;
}
AddVisibilityCompileOption(flags, target, this, lang);
- AddInlineVisibilityCompileOption(flags, target, this);
+
+ if(strcmp(lang, "CXX") == 0)
+ {
+ AddInlineVisibilityCompileOption(flags, target, this);
+ }
}
//----------------------------------------------------------------------------
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index a79111a..2807f97 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -400,6 +400,29 @@ if(BUILD_TESTING)
ADD_TEST_MACRO(PositionIndependentTargets PositionIndependentTargets)
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
${CMAKE_CTEST_COMMAND} -C \${CTEST_CONFIGURATION_TYPE}
--build-and-test
diff --git a/Tests/VisibilityInlinesHidden/CMakeLists.txt b/Tests/VisibilityInlinesHidden/CMakeLists.txt
new file mode 100644
index 0000000..8ebc39c
--- /dev/null
+++ b/Tests/VisibilityInlinesHidden/CMakeLists.txt
@@ -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
+)
diff --git a/Tests/VisibilityInlinesHidden/bar.c b/Tests/VisibilityInlinesHidden/bar.c
new file mode 100644
index 0000000..e425999
--- /dev/null
+++ b/Tests/VisibilityInlinesHidden/bar.c
@@ -0,0 +1 @@
+void bar() {}
diff --git a/Tests/VisibilityInlinesHidden/foo.cpp b/Tests/VisibilityInlinesHidden/foo.cpp
new file mode 100644
index 0000000..2b66b69
--- /dev/null
+++ b/Tests/VisibilityInlinesHidden/foo.cpp
@@ -0,0 +1,11 @@
+class Foo
+{
+public:
+ void bar() {}
+};
+
+void baz()
+{
+ Foo foo;
+ foo.bar();
+}
diff --git a/Tests/VisibilityInlinesHidden/verify.cmake b/Tests/VisibilityInlinesHidden/verify.cmake
new file mode 100644
index 0000000..80dd13c
--- /dev/null
+++ b/Tests/VisibilityInlinesHidden/verify.cmake
@@ -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()