From 9cbc63e40caa1c3afd771d1e20c4c4c188953c00 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 6 Apr 2014 13:00:17 +0200 Subject: [PATCH] Features: Record for GNU 4.7. Update the CompileFeatures test to verify that unsupported features do not work. --- Modules/Compiler/GNU-CXX-FeatureTests.cmake | 5 ++--- Modules/Compiler/GNU-CXX.cmake | 2 +- Tests/CompileFeatures/CMakeLists.txt | 25 +++++++++++++++------ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Modules/Compiler/GNU-CXX-FeatureTests.cmake b/Modules/Compiler/GNU-CXX-FeatureTests.cmake index fe0ff0bec..b19ee496c 100644 --- a/Modules/Compiler/GNU-CXX-FeatureTests.cmake +++ b/Modules/Compiler/GNU-CXX-FeatureTests.cmake @@ -1,7 +1,7 @@ # Reference: http://gcc.gnu.org/projects/cxx0x.html -set(_oldestSupported "(__GNUC__ * 100 + __GNUC_MINOR__) >= 408") +set(_oldestSupported "(__GNUC__ * 100 + __GNUC_MINOR__) >= 407") # Introduced in GCC 4.8.1 set(GNU481_CXX11 "((__GNUC__ * 100 + __GNUC_MINOR__) > 408 || __GNUC_PATCHLEVEL__ >= 1) && __cplusplus >= 201103L") set(_cmake_feature_test_cxx_decltype_incomplete_return_types "${GNU481_CXX11}") @@ -12,8 +12,7 @@ set(_cmake_feature_test_cxx_alignof "${GNU48_CXX11}") set(_cmake_feature_test_cxx_attributes "${GNU48_CXX11}") set(_cmake_feature_test_cxx_inheriting_constructors "${GNU48_CXX11}") set(_cmake_feature_test_cxx_thread_local "${GNU48_CXX11}") -# TODO: Should be supported by GNU 4.7 -set(GNU47_CXX11 "${_oldestSupported} && __cplusplus >= 201103L") +set(GNU47_CXX11 "(__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L") set(_cmake_feature_test_cxx_alias_templates "${GNU47_CXX11}") set(_cmake_feature_test_cxx_delegating_constructors "${GNU47_CXX11}") set(_cmake_feature_test_cxx_extended_friend_declarations "${GNU47_CXX11}") diff --git a/Modules/Compiler/GNU-CXX.cmake b/Modules/Compiler/GNU-CXX.cmake index 6ec3958fc..d0de14c86 100644 --- a/Modules/Compiler/GNU-CXX.cmake +++ b/Modules/Compiler/GNU-CXX.cmake @@ -32,7 +32,7 @@ macro(cmake_record_cxx_compile_features) endif() endmacro() - if (UNIX AND NOT APPLE AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) + if (UNIX AND NOT APPLE AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7) _get_gcc_features(c++11 CMAKE_CXX11_COMPILE_FEATURES) _get_gcc_features(c++98 CMAKE_CXX98_COMPILE_FEATURES) else() diff --git a/Tests/CompileFeatures/CMakeLists.txt b/Tests/CompileFeatures/CMakeLists.txt index 501138df3..61160c5d6 100644 --- a/Tests/CompileFeatures/CMakeLists.txt +++ b/Tests/CompileFeatures/CMakeLists.txt @@ -11,22 +11,33 @@ if (NOT CMAKE_CXX_COMPILE_FEATURES) return() endif() -macro(run_test feature) - if (";${CMAKE_CXX_COMPILE_FEATURES};" MATCHES ${feature}) - add_library(test_${feature} OBJECT ${feature}.cpp) +macro(run_test feature lang) + if (";${CMAKE_${lang}_COMPILE_FEATURES};" MATCHES ${feature}) + add_library(test_${feature} OBJECT ${feature}) set_property(TARGET test_${feature} PROPERTY COMPILE_FEATURES "${feature}" ) else() - message("Not supported: ${feature}") + list(APPEND ${lang}_non_features ${feature}) endif() endmacro() -get_property(features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES) -foreach(feature ${features}) - run_test(${feature}) +get_property(cxx_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES) +foreach(feature ${cxx_features}) + run_test(${feature} CXX) endforeach() +if (CMAKE_CXX_COMPILE_FEATURES) + include(CheckCXXSourceCompiles) + foreach(feature ${CXX_non_features}) + check_cxx_source_compiles("#include \"${CMAKE_CURRENT_SOURCE_DIR}/${feature}.cpp\"\nint main() { return 0; }\n" ${feature}_works) + if (${feature}_works) + message(SEND_ERROR + "Feature ${feature} expected not to work for ${CMAKE_CXX_COMPILER_ID}-${CMAKE_CXX_COMPILER_VERSION}. Update the supported features or blacklist it.") + endif() + endforeach() +endif() + add_executable(CompileFeatures main.cpp) set_property(TARGET CompileFeatures PROPERTY COMPILE_FEATURES "cxx_auto_type"