Browse Source

Merge topic 'self-c++17'

31d59ff3 Compile CMake as C++17 if supported by the compiler
31c6b9ad Generalize check for C++14 constructs
05af537e cmGlobalNinjaGenerator: Avoid using deprecated std::ptr_fun

Acked-by: Kitware Robot <[email protected]>
Acked-by: Pavel Solodovnikov <[email protected]>
Merge-request: !1614
Brad King 8 years ago
parent
commit
0d22a23fd2

+ 13 - 4
CMakeLists.txt

@@ -64,11 +64,20 @@ if(NOT DEFINED CMAKE_CXX_STANDARD AND NOT CMake_NO_CXX_STANDARD)
   if (CMAKE_CXX_COMPILER_ID STREQUAL SunPro AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.14)
     set(CMAKE_CXX_STANDARD 98)
   else()
-    include(${CMake_SOURCE_DIR}/Source/Checks/cm_cxx14_cstdio.cmake)
-    if(NOT CMake_CXX14_CSTDIO_BROKEN)
-      set(CMAKE_CXX_STANDARD 14)
+    if(NOT CMAKE_VERSION VERSION_LESS 3.8)
+      include(${CMake_SOURCE_DIR}/Source/Checks/cm_cxx17_check.cmake)
     else()
-      set(CMAKE_CXX_STANDARD 11)
+      set(CMake_CXX17_BROKEN 1)
+    endif()
+    if(NOT CMake_CXX17_BROKEN)
+      set(CMAKE_CXX_STANDARD 17)
+    else()
+      include(${CMake_SOURCE_DIR}/Source/Checks/cm_cxx14_check.cmake)
+      if(NOT CMake_CXX14_BROKEN)
+        set(CMAKE_CXX_STANDARD 14)
+      else()
+        set(CMAKE_CXX_STANDARD 11)
+      endif()
     endif()
   endif()
 endif()

+ 36 - 0
Source/Checks/cm_cxx14_check.cmake

@@ -0,0 +1,36 @@
+set(CMake_CXX14_BROKEN 0)
+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
+  if(NOT CMAKE_CXX14_STANDARD_COMPILE_OPTION)
+    set(CMake_CXX14_WORKS 0)
+  endif()
+  if(NOT DEFINED CMake_CXX14_WORKS)
+    message(STATUS "Checking if compiler supports needed C++14 constructs")
+    try_compile(CMake_CXX14_WORKS
+      ${CMAKE_CURRENT_BINARY_DIR}
+      ${CMAKE_CURRENT_LIST_DIR}/cm_cxx14_check.cpp
+      CMAKE_FLAGS -DCMAKE_CXX_STANDARD=14
+      OUTPUT_VARIABLE OUTPUT
+      )
+    if(CMake_CXX14_WORKS AND "${OUTPUT}" MATCHES "error: no member named.*gets.*in the global namespace")
+      set_property(CACHE CMake_CXX14_WORKS PROPERTY VALUE 0)
+    endif()
+    if(CMake_CXX14_WORKS)
+      message(STATUS "Checking if compiler supports needed C++14 constructs - yes")
+      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+        "Determining if compiler supports needed C++14 constructs passed with the following output:\n"
+        "${OUTPUT}\n"
+        "\n"
+        )
+    else()
+      message(STATUS "Checking if compiler supports needed C++14 constructs - no")
+      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+        "Determining if compiler supports needed C++14 constructs failed with the following output:\n"
+        "${OUTPUT}\n"
+        "\n"
+        )
+    endif()
+  endif()
+  if(NOT CMake_CXX14_WORKS)
+    set(CMake_CXX14_BROKEN 1)
+  endif()
+endif()

+ 0 - 0
Source/Checks/cm_cxx14_cstdio.cpp → Source/Checks/cm_cxx14_check.cpp


+ 0 - 33
Source/Checks/cm_cxx14_cstdio.cmake

@@ -1,33 +0,0 @@
-set(CMake_CXX14_CSTDIO_BROKEN 0)
-if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" AND CMAKE_CXX14_STANDARD_COMPILE_OPTION)
-  if(NOT DEFINED CMake_CXX14_CSTDIO_WORKS)
-    message(STATUS "Checking if compiler supports C++14 cstdio")
-    try_compile(CMake_CXX14_CSTDIO_WORKS
-      ${CMAKE_CURRENT_BINARY_DIR}
-      ${CMAKE_CURRENT_LIST_DIR}/cm_cxx14_cstdio.cpp
-      CMAKE_FLAGS -DCMAKE_CXX_STANDARD=14
-      OUTPUT_VARIABLE OUTPUT
-      )
-    if(CMake_CXX14_CSTDIO_WORKS AND "${OUTPUT}" MATCHES "error: no member named.*gets.*in the global namespace")
-      set_property(CACHE CMake_CXX14_CSTDIO_WORKS PROPERTY VALUE 0)
-    endif()
-    if(CMake_CXX14_CSTDIO_WORKS)
-      message(STATUS "Checking if compiler supports C++14 cstdio - yes")
-      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
-        "Determining if compiler supports C++14 cstdio passed with the following output:\n"
-        "${OUTPUT}\n"
-        "\n"
-        )
-    else()
-      message(STATUS "Checking if compiler supports C++14 cstdio - no")
-      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
-        "Determining if compiler supports C++14 cstdio failed with the following output:\n"
-        "${OUTPUT}\n"
-        "\n"
-        )
-    endif()
-  endif()
-  if(NOT CMake_CXX14_CSTDIO_WORKS)
-    set(CMake_CXX14_CSTDIO_BROKEN 1)
-  endif()
-endif()

+ 36 - 0
Source/Checks/cm_cxx17_check.cmake

@@ -0,0 +1,36 @@
+set(CMake_CXX17_BROKEN 0)
+if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
+  if(NOT CMAKE_CXX17_STANDARD_COMPILE_OPTION)
+    set(CMake_CXX17_WORKS 0)
+  endif()
+  if(NOT DEFINED CMake_CXX17_WORKS)
+    message(STATUS "Checking if compiler supports needed C++17 constructs")
+    try_compile(CMake_CXX17_WORKS
+      ${CMAKE_CURRENT_BINARY_DIR}
+      ${CMAKE_CURRENT_LIST_DIR}/cm_cxx17_check.cpp
+      CMAKE_FLAGS -DCMAKE_CXX_STANDARD=17
+      OUTPUT_VARIABLE OUTPUT
+      )
+    if(CMake_CXX17_WORKS AND "${OUTPUT}" MATCHES "error: no member named.*gets.*in the global namespace")
+      set_property(CACHE CMake_CXX17_WORKS PROPERTY VALUE 0)
+    endif()
+    if(CMake_CXX17_WORKS)
+      message(STATUS "Checking if compiler supports needed C++17 constructs - yes")
+      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+        "Determining if compiler supports needed C++17 constructs passed with the following output:\n"
+        "${OUTPUT}\n"
+        "\n"
+        )
+    else()
+      message(STATUS "Checking if compiler supports needed C++17 constructs - no")
+      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+        "Determining if compiler supports needed C++17 constructs failed with the following output:\n"
+        "${OUTPUT}\n"
+        "\n"
+        )
+    endif()
+  endif()
+  if(NOT CMake_CXX17_WORKS)
+    set(CMake_CXX17_BROKEN 1)
+  endif()
+endif()

+ 7 - 0
Source/Checks/cm_cxx17_check.cpp

@@ -0,0 +1,7 @@
+#include <cstdio>
+#include <unordered_map>
+
+int main()
+{
+  return 0;
+}

+ 1 - 2
Source/cmGlobalNinjaGenerator.cxx

@@ -8,7 +8,6 @@
 #include "cmsys/FStream.hxx"
 #include <algorithm>
 #include <ctype.h>
-#include <functional>
 #include <iterator>
 #include <memory> // IWYU pragma: keep
 #include <sstream>
@@ -114,7 +113,7 @@ std::string cmGlobalNinjaGenerator::EncodeIdent(const std::string& ident,
                                                 std::ostream& vars)
 {
   if (std::find_if(ident.begin(), ident.end(),
-                   std::not1(std::ptr_fun(IsIdentChar))) != ident.end()) {
+                   [](char c) { return !IsIdentChar(c); }) != ident.end()) {
     static unsigned VarNum = 0;
     std::ostringstream names;
     names << "ident" << VarNum++;