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