From 05d2ccf26c3809dfa0cd01e6d8e8a7307af7de71 Mon Sep 17 00:00:00 2001 From: Roman Tsisyk <roman@tsisyk.com> Date: Wed, 10 Jul 2013 12:58:22 +0400 Subject: [PATCH] Check for supported standards instead of compiler versions --- CMakeLists.txt | 2 ++ cmake/compiler.cmake | 56 ++++++++++++++++++++++++++------------------ 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 43931e8d3e..2ce45baaf2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,8 @@ include(CheckCCompilerFlag) include(CheckSymbolExists) include(CheckCSourceRuns) include(CheckCXXSourceRuns) +include(CheckCSourceCompiles) +include(CheckCXXSourceCompiles) include(TestBigEndian) include(CheckFunctionExists) diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake index 3732a3a06d..e1ca97b279 100644 --- a/cmake/compiler.cmake +++ b/cmake/compiler.cmake @@ -16,22 +16,28 @@ if (CMAKE_C_COMPILER_ID STREQUAL Clang) set(CMAKE_COMPILER_IS_GNUCXX OFF) endif() -if(CMAKE_COMPILER_IS_GNUCC) - # gcc and g++ >= 4.5 are supported - execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion - OUTPUT_VARIABLE CC_VERSION) - if (CC_VERSION VERSION_LESS 4.5) - message (FATAL_ERROR - "${CMAKE_C_COMPILER} version should be >= 4.5 -- ${CC_VERSION}") - endif() - execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion - OUTPUT_VARIABLE CXX_VERSION) - if (CXX_VERSION VERSION_LESS 4.5) - message (FATAL_ERROR - "${CMAKE_CXX_COMPILER} version should be >= 4.5 -- ${CXX_VERSION}") - endif() +# +# Check supported standards +# +if((NOT HAVE_STD_C11 AND NOT HAVE_STD_GNU99) OR + (NOT HAVE_STD_CXX11 AND NOT HAVE_STD_GNUXX0X)) + set(CMAKE_REQUIRED_FLAGS "-std=c11") + check_c_source_compiles("int main(void) { return 0; }" HAVE_STD_C11) + set(CMAKE_REQUIRED_FLAGS "-std=gnu99") + check_c_source_compiles("int main(void) { return 0; }" HAVE_STD_GNU99) + set(CMAKE_REQUIRED_FLAGS "-std=c++11") + check_cxx_source_compiles("int main(void) { return 0; }" HAVE_STD_CXX11) + set(CMAKE_REQUIRED_FLAGS "-std=gnu++0x") + check_cxx_source_compiles("int main(void) { return 0; }" HAVE_STD_GNUXX0X) + set(CMAKE_REQUIRED_FLAGS "") +endif() +if((NOT HAVE_STD_C11 AND NOT HAVE_STD_GNU99) OR + (NOT HAVE_STD_CXX11 AND NOT HAVE_STD_GNUXX0X)) + message (FATAL_ERROR + "${CMAKE_C_COMPILER} should support -std=c11 or -std=gnu99. " + "${CMAKE_CXX_COMPILER} should support -std=c++11 or -std=gnu++0x. " + "Please consider upgrade to gcc 4.5+ or clang 3.2+.") endif() - # # Perform build type specific configuration. @@ -82,12 +88,15 @@ macro(enable_tnt_compile_flags) # of the code. # Set standard - if (CMAKE_COMPILER_IS_CLANG OR CC_VERSION VERSION_GREATER 4.7 OR - CC_VERSION VERSION_EQUAL 4.7) + if (HAVE_STD_C11) add_compile_flags("C" "-std=c11") - add_compile_flags("CXX" "-std=c++11") else() add_compile_flags("C" "-std=gnu99") + endif() + + if (HAVE_STD_CXX11) + add_compile_flags("CXX" "-std=c++11") + else() add_compile_flags("CXX" "-std=gnu++0x") endif() @@ -112,11 +121,12 @@ macro(enable_tnt_compile_flags) add_definitions("-D__STDC_LIMIT_MACROS=1") add_definitions("-D__STDC_CONSTANT_MACROS=1") - # Only add -Werror if it's a debug build, done by developers using GCC. - # Community builds should not cause extra trouble. - if (${CMAKE_BUILD_TYPE} STREQUAL "Debug" AND CMAKE_COMPILER_IS_GNUCC) - add_compile_flags("C;CXX" "-Werror") - endif() + # Only add -Werror if it's a debug build, done by developers. + # Release builds should not cause extra trouble. + if ((${CMAKE_BUILD_TYPE} STREQUAL "Debug") + AND HAVE_STD_C11 AND HAVE_STD_CXX11) + add_compile_flags("C;CXX" "-Werror") + endif() endmacro(enable_tnt_compile_flags) # -- GitLab