]> git.lyx.org Git - features.git/commitdiff
Adapt cmake build to use c++11 features also for clang compiler
authorKornel Benko <kornel@lyx.org>
Sun, 15 Dec 2013 10:41:28 +0000 (11:41 +0100)
committerKornel Benko <kornel@lyx.org>
Sun, 15 Dec 2013 10:41:28 +0000 (11:41 +0100)
CMakeLists.txt
development/cmake/modules/FindCXX11Compiler.cmake [new file with mode: 0644]

index fa16d1074d90ea89b0ba327a0d32c5d82dff5e29..09f94625c33c3251c571ca79a410c6e8ad3285f3 100644 (file)
@@ -213,11 +213,11 @@ if(UNIX OR MINGW)
                set(LYX_USE_TR1_REGEX 0)
        endif()
        if (LYX_ENABLE_CXX11)
-               if(GCC_VERSION VERSION_GREATER 4.7)
-                       set(LYX_GCC11_MODE "-std=gnu++11")
-               elseif(GCC_VERSION VERSION_GREATER 4.2)
-                       set(LYX_GCC11_MODE "-std=gnu++0x")
+               find_package(CXX11Compiler)
+               if(NOT CXX11COMPILER_FOUND)
+                       message(FATAL_ERROR "A C++11 compatible compiler is required.")
                endif()
+               set(LYX_GCC11_MODE "${CXX11_FLAG}")
        endif()
 else()
        if(MSVC10)
diff --git a/development/cmake/modules/FindCXX11Compiler.cmake b/development/cmake/modules/FindCXX11Compiler.cmake
new file mode 100644 (file)
index 0000000..e43e449
--- /dev/null
@@ -0,0 +1,95 @@
+# This file is part of lyx.\r
+#\r
+# The module comes from the enblend project, slightly modified.\r
+#\r
+# Check if compiler supports C++11 features \r
+# and which compiler switches are necessary\r
+# CXX11_FLAG : contains the necessary compiler flag\r
+\r
+#\r
+# Copyright (c) 2013 Thomas Modes <tmodes@@users.sourceforge.net>\r
+#\r
+#  Redistribution and use in source and binary forms, with or without\r
+#  modification, are permitted provided that the following conditions\r
+#  are met:\r
+#\r
+#  1. Redistributions of source code must retain the copyright\r
+#         notice, this list of conditions and the following disclaimer.\r
+#  2. Redistributions in binary form must reproduce the copyright\r
+#         notice, this list of conditions and the following disclaimer in the\r
+#         documentation and/or other materials provided with the distribution.\r
+#  3. The name of the author may not be used to endorse or promote products\r
+#         derived from this software without specific prior written permission.\r
+#\r
+# This file is distributed in the hope that it will be useful,\r
+# but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+# GNU General Public License for more details.\r
+#\r
+# You should have received a copy of the GNU General Public License\r
+# along with lyx; if not, write to the Free Software\r
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+#\r
+\r
+INCLUDE(CheckCXXSourceCompiles)\r
+INCLUDE(FindPackageHandleStandardArgs)\r
+\r
+if (CMAKE_CXX_COMPILER MATCHES "clang")\r
+  set(CXX11_FLAG_CANDIDATES "--std=c++11")\r
+else()\r
+  set(CXX11_FLAG_CANDIDATES\r
+    "--std=gnu++11"\r
+    "--std=c++11"\r
+    "--std=gnu++0x"\r
+  )\r
+endif()\r
+\r
+# sample openmp source code to test\r
+SET(CXX11_TEST_SOURCE \r
+"\r
+template <typename T>\r
+struct check\r
+{\r
+    static_assert(sizeof(int) <= sizeof(T), \"not big enough\");\r
+};\r
+\r
+typedef check<check<bool>> right_angle_brackets;\r
+\r
+class TestDeleted\r
+{\r
+public:\r
+    TestDeleted() = delete;\r
+};\r
+\r
+\r
+int a;\r
+decltype(a) b;\r
+\r
+typedef check<int> check_type;\r
+check_type c;\r
+check_type&& cr = static_cast<check_type&&>(c);\r
+\r
+auto d = a;\r
+\r
+int main() {\r
+  return 0;\r
+};\r
+")\r
+\r
+# check c compiler\r
+FOREACH(FLAG ${CXX11_FLAG_CANDIDATES})\r
+  SET(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")\r
+  SET(CMAKE_REQUIRED_FLAGS "${FLAG}")\r
+  UNSET(CXX11_FLAG_DETECTED CACHE)\r
+  CHECK_CXX_SOURCE_COMPILES("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED)\r
+  SET(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")\r
+  IF(CXX11_FLAG_DETECTED)\r
+    SET(CXX11_FLAG "${FLAG}")\r
+    BREAK()\r
+  ENDIF()\r
+ENDFOREACH()\r
+\r
+# handle the standard arguments for find_package\r
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(CXX11Compiler DEFAULT_MSG CXX11_FLAG)\r
+\r
+MARK_AS_ADVANCED(CXX11_FLAG)\r