You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

87 lines
2.9 KiB

# Copyright (C) 2013-2018 Daniel Scharrer
#
# This software is provided 'as-is', without any express or implied
# warranty. In no event will the author(s) be held liable for any damages
# arising from the use of this software.
#
# Permission is granted to anyone to use this software for any purpose,
# including commercial applications, and to alter it and redistribute it
# freely, subject to the following restrictions:
#
# 1. The origin of this software must not be misrepresented; you must not
# claim that you wrote the original software. If you use this software
# in a product, an acknowledgment in the product documentation would be
# appreciated but is not required.
# 2. Altered source versions must be plainly marked as such, and must not be
# misrepresented as being the original software.
# 3. This notice may not be removed or altered from any source distribution.
include(CheckCXXSourceCompiles)
include(CompileCheck)
set(_HAS_CXX11 0)
set(CXX11_CHECK_DIR "${CMAKE_CURRENT_LIST_DIR}/check")
function(enable_cxx_version version)
if(MSVC)
if(NOT version LESS 2011 AND MSVC_VERSION LESS 1600)
if(NOT version LESS 2017 AND NOT MSVC_VERSION LESS 1911)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17")
elseif(NOT version LESS 2014 AND NOT MSVC_VERSION LESS 1910)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++14")
elseif(NOT version LESS 2014 AND NOT MSVC_VERSION LESS 1900)
# Only introduced with update 3 of MSVC 2015
add_cxxflag("/std:c++14")
endif()
set(_HAS_CXX11 1 PARENT_SCOPE)
endif()
else()
set(FLAG_FOUND 0)
if(NOT version LESS 2017)
add_cxxflag("-std=c++17")
endif()
if(NOT version LESS 2014 AND NOT FLAG_FOUND)
add_cxxflag("-std=c++14")
endif()
if(NOT version LESS 2011 AND NOT FLAG_FOUND)
add_cxxflag("-std=c++11")
endif()
if(NOT version LESS 2011 AND FLAG_FOUND OR NOT CMAKE_COMPILER_IS_GNUCXX)
if(SET_WARNING_FLAGS)
add_cxxflag("-pedantic")
endif()
set(_HAS_CXX11 1 PARENT_SCOPE)
endif()
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE)
endfunction(enable_cxx_version)
function(check_cxx11 CHECK RESULTVAR)
if(_HAS_CXX11)
if(MSVC AND ARGC GREATER 2)
if(MSVC_VERSION LESS ARGV2)
set(result)
else()
set(result 1)
endif()
else()
string(REGEX REPLACE "[^a-zA-Z0-9_][^a-zA-Z0-9_]*" "-" check "${CHECK}")
set(file "${CXX11_CHECK_DIR}/cxx11-${check}.cpp")
set(old_CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(old_CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
strip_warning_flags(CMAKE_CXX_FLAGS)
strip_warning_flags(CMAKE_EXE_LINKER_FLAGS)
check_compile(result "${file}" "${CHECK}" "C++11 feature")
set(CMAKE_CXX_FLAGS "${old_CMAKE_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${old_CMAKE_EXE_LINKER_FLAGS}")
endif()
if(NOT DEFINED result OR result STREQUAL "")
set(${RESULTVAR} OFF PARENT_SCOPE)
else()
set(${RESULTVAR} ON PARENT_SCOPE)
endif()
else()
set(${RESULTVAR} OFF PARENT_SCOPE)
endif()
endfunction()