Просмотр исходного кода

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

Nils Gladitz 12 лет назад
Родитель
Сommit
efdcebddbd

+ 5 - 1
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);
+    }
 }
 
 //----------------------------------------------------------------------------

+ 23 - 0
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

+ 14 - 0
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
+)

+ 1 - 0
Tests/VisibilityInlinesHidden/bar.c

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

+ 11 - 0
Tests/VisibilityInlinesHidden/foo.cpp

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

+ 14 - 0
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()