summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/cmake_utils/use_cpp_11.cmake
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-03-09 13:19:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-03-09 13:20:02 +0000
commit58daab21cd043e1dc37024a7f99b396788372918 (patch)
tree96771e43bb69f7c1c2b0b4f7374cb74d7866d0cb /ml/dlib/dlib/cmake_utils/use_cpp_11.cmake
parentReleasing debian version 1.43.2-1. (diff)
downloadnetdata-58daab21cd043e1dc37024a7f99b396788372918.tar.xz
netdata-58daab21cd043e1dc37024a7f99b396788372918.zip
Merging upstream version 1.44.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ml/dlib/dlib/cmake_utils/use_cpp_11.cmake')
-rw-r--r--ml/dlib/dlib/cmake_utils/use_cpp_11.cmake113
1 files changed, 113 insertions, 0 deletions
diff --git a/ml/dlib/dlib/cmake_utils/use_cpp_11.cmake b/ml/dlib/dlib/cmake_utils/use_cpp_11.cmake
new file mode 100644
index 000000000..e49e30f2a
--- /dev/null
+++ b/ml/dlib/dlib/cmake_utils/use_cpp_11.cmake
@@ -0,0 +1,113 @@
+# This script creates a function, enable_cpp11_for_target(), which checks if your
+# compiler has C++11 support and enables it if it does.
+
+
+cmake_minimum_required(VERSION 2.8.12)
+
+if (POLICY CMP0054)
+ cmake_policy(SET CMP0054 NEW)
+endif()
+
+
+set(_where_is_cmake_utils_dir ${CMAKE_CURRENT_LIST_DIR})
+
+function(enable_cpp11_for_target target_name)
+
+
+# Set to false unless we find out otherwise in the code below.
+set(COMPILER_CAN_DO_CPP_11 0)
+
+
+
+macro(test_compiler_for_cpp11)
+ message(STATUS "Building a C++11 test project to see if your compiler supports C++11")
+ try_compile(test_for_cpp11_worked ${PROJECT_BINARY_DIR}/cpp11_test_build
+ ${_where_is_cmake_utils_dir}/test_for_cpp11 cpp11_test)
+ if (test_for_cpp11_worked)
+ message(STATUS "C++11 activated.")
+ set(COMPILER_CAN_DO_CPP_11 1)
+ else()
+ set(COMPILER_CAN_DO_CPP_11 0)
+ message(STATUS "********** Your compiler failed to build a C++11 project. C++11 is required to use all parts of dlib! **********")
+ endif()
+endmacro()
+
+# Now turn on the appropriate compiler switch to enable C++11 if you have a
+# C++11 compiler. In CMake 3.1 there is a simple flag you can set, but earlier
+# verions of CMake are not so convenient.
+if (CMAKE_VERSION VERSION_LESS "3.1.2")
+ if(CMAKE_COMPILER_IS_GNUCXX)
+ execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
+ if (GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
+ message(STATUS "C++11 activated.")
+ target_compile_options(${target_name} PUBLIC "-std=gnu++11")
+ set(COMPILER_CAN_DO_CPP_11 1)
+ endif()
+ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ execute_process( COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE clang_full_version_string )
+ string (REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1" CLANG_VERSION ${clang_full_version_string})
+ if (CLANG_VERSION VERSION_GREATER 3.3)
+ message(STATUS "C++11 activated.")
+ target_compile_options(${target_name} PUBLIC "-std=c++11")
+ set(COMPILER_CAN_DO_CPP_11 1)
+ endif()
+ else()
+ # Since we don't know what compiler this is just try to build a c++11 project and see if it compiles.
+ test_compiler_for_cpp11()
+ endif()
+else()
+
+ # Set a flag if the compiler you are using is capable of providing C++11 features.
+ get_property(cxx_features GLOBAL PROPERTY CMAKE_CXX_KNOWN_FEATURES)
+ if (";${cxx_features};" MATCHES ";cxx_rvalue_references;" AND
+ ";${cxx_features};" MATCHES ";cxx_variadic_templates;" AND
+ ";${cxx_features};" MATCHES ";cxx_lambdas;" AND
+ ";${cxx_features};" MATCHES ";cxx_defaulted_move_initializers;" AND
+ ";${cxx_features};" MATCHES ";cxx_delegating_constructors;" AND
+ ";${cxx_features};" MATCHES ";cxx_thread_local;" AND
+ ";${cxx_features};" MATCHES ";cxx_constexpr;" AND
+ ";${cxx_features};" MATCHES ";cxx_decltype_incomplete_return_types;" AND
+ ";${cxx_features};" MATCHES ";cxx_auto_type;")
+
+ set(COMPILER_CAN_DO_CPP_11 1)
+ # Tell cmake that we need C++11 for dlib
+ target_compile_features(${target_name}
+ PUBLIC
+ cxx_rvalue_references
+ cxx_variadic_templates
+ cxx_lambdas
+ cxx_defaulted_move_initializers
+ cxx_delegating_constructors
+ cxx_thread_local
+ cxx_constexpr
+ # cxx_decltype_incomplete_return_types # purposfully commented out because cmake errors out on this when using visual studio and cmake 3.8.0
+ cxx_auto_type
+ )
+
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ # Sometimes clang will lie and report that it supports C++11 when
+ # really it doesn't support thread_local. So check for that.
+ test_compiler_for_cpp11()
+ else()
+ message(STATUS "C++11 activated.")
+ endif()
+ endif()
+endif()
+
+# Always enable whatever partial C++11 support we have, even if it isn't full
+# support, and just hope for the best.
+if (NOT COMPILER_CAN_DO_CPP_11)
+ include(CheckCXXCompilerFlag)
+ CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
+ CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
+ if(COMPILER_SUPPORTS_CXX11)
+ message(STATUS "C++11 activated (compiler doesn't have full C++11 support).")
+ target_compile_options(${target_name} PUBLIC "-std=c++11")
+ elseif(COMPILER_SUPPORTS_CXX0X)
+ message(STATUS "C++0x activated (compiler doesn't have full C++11 support).")
+ target_compile_options(${target_name} PUBLIC "-std=c++0x")
+ endif()
+endif()
+
+endfunction()
+