Use CMAKE_<LANG>_STANDARD instead of custom macros.

CMake 3.1 added CMAKE_<LANG>_STANDARD, which allows CMake to determine
what flags are needed to select a particular language version.

Set it to C17 and C++17. Previously, we were using C11 and C++11,
though gcc11 switched the default C++ version to C++17. The custom
macro handled this by not adding flags for C++, but it still added
the C11 flag, which prevented use of C17.

No code size differences were observed when compiling on gcc-13.2.0
with CMAKE_<LANG>_STANDARD.
This commit is contained in:
David Korth 2023-10-21 11:44:35 -04:00
parent 7b58c04bc9
commit 6ab2951d89
4 changed files with 23 additions and 173 deletions

View File

@ -52,6 +52,27 @@ SET(CMAKE_LINK_DEPENDS_NO_SHARED ON)
# enough tests are added.
ENABLE_TESTING()
# Set the standards versions: C11, C++17
# C17 was added in CMake 3.21; for older versions, use C11.
# C++17 was added in CMake 3.8; for older versions, use C++14.
# NOTE: These aren't set as hard requirements, though if the compiler
# doesn't support them, code will either be less optimal or will fail
# to compile.
SET(CMAKE_C_STANDARD_REQUIRED OFF)
SET(CMAKE_C_EXTENSIONS ON)
SET(CMAKE_CXX_STANDARD_REQUIRED OFF)
SET(CMAKE_CXX_EXTENSIONS ON)
IF(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
SET(CMAKE_C_STANDARD 17)
SET(CMAKE_CXX_STANDARD 17)
ELSEIF(CMAKE_VERSION VERSION_GREATER_EQUAL 3.8)
SET(CMAKE_C_STANDARD 11)
SET(CMAKE_CXX_STANDARD 17)
ELSE()
SET(CMAKE_C_STANDARD 11)
SET(CMAKE_CXX_STANDARD 14)
ENDIF()
# Set default build options.
INCLUDE(cmake/options.cmake)
# Check for platform-specific functionality.

View File

@ -1,95 +0,0 @@
# - Check what flag is needed to activate C11 or C99 mode.
# CHECK_C11_C99_COMPILER_FLAG(VARIABLE)
#
# VARIABLE - variable to store the result
#
# This actually calls the check_c_source_compiles macro.
# See help for CheckCSourceCompiles for a listing of variables
# that can modify the build.
# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
# Based on CHECK_C_COMPILER_FLAG(). (CheckCCompilerFlag.cmake)
INCLUDE(CheckCSourceCompiles)
FUNCTION(CHECK_C11_C99_COMPILER_FLAG _result)
# Flag listing borrowed from GNU autoconf's AC_PROG_CC_C99 macro.
UNSET(${_result} PARENT_SCOPE)
# MSVC doesn't allow setting the C standard.
IF(NOT DEFINED _SYS_C11_C99_CFLAG AND NOT MSVC)
# Check if C11 is present without any flags.
# gcc-5.1 uses C11 mode by default.
MESSAGE(STATUS "Checking if C11 is enabled by default:")
CHECK_C_SOURCE_COMPILES("
#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L
# error C11 is not enabled
#endif
int main() { return 0; }" CHECK_C11_ENABLED_DEFAULT)
IF (CHECK_C11_ENABLED_DEFAULT)
SET(_SYS_C11_C99_CFLAG "" CACHE INTERNAL "CFLAG required for C11 or C99 mode.")
MESSAGE(STATUS "Checking if C11 is enabled by default: yes")
ELSE(CHECK_C11_ENABLED_DEFAULT)
MESSAGE(STATUS "Checking if C11 is enabled by default: no")
MESSAGE(STATUS "Checking what CFLAG is required for C11:")
FOREACH(CHECK_C11_CFLAG "-std=gnu11" "-std=c11" "-c99" "-AC99" "-xc99=all" "-qlanglvl=extc1x" "-qlanglvl=stdc11")
SET(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
SET(CMAKE_REQUIRED_DEFINITIONS "${CHECK_C11_CFLAG}")
CHECK_C_SOURCE_COMPILES("int main() { return 0; }" CFLAG_${CHECK_C11_CFLAG})
SET(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
IF(CFLAG_${CHECK_C11_CFLAG})
SET(_SYS_C11_C99_CFLAG "${CHECK_C11_CFLAG}" CACHE INTERNAL "CFLAG required for C11 or C99 mode.")
BREAK()
ENDIF(CFLAG_${CHECK_C11_CFLAG})
ENDFOREACH()
IF(_SYS_C11_C99_CFLAG)
MESSAGE(STATUS "Checking what CFLAG is required for C11: ${_SYS_C11_C99_CFLAG}")
ELSE(_SYS_C11_C99_CFLAG)
MESSAGE(STATUS "Checking what CFLAG is required for C11: unavailable")
ENDIF(_SYS_C11_C99_CFLAG)
ENDIF(CHECK_C11_ENABLED_DEFAULT)
IF(NOT CHECK_C11_ENABLED_DEFAULT AND NOT _SYS_C11_C99_CFLAG)
# Could not enable C11. Try C99 instead.
MESSAGE(STATUS "Checking if C99 is enabled by default:")
CHECK_C_SOURCE_COMPILES("
#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
# error C99 is not enabled
#endif
int main() { return 0; }" CHECK_C99_ENABLED_DEFAULT)
IF (CHECK_C99_ENABLED_DEFAULT)
SET(_SYS_C11_C99_CFLAG "" CACHE INTERNAL "CFLAG required for C11 or C99 mode.")
MESSAGE(STATUS "Checking if C99 is enabled by default: yes")
ELSE(CHECK_C99_ENABLED_DEFAULT)
MESSAGE(STATUS "Checking if C99 is enabled by default: no")
MESSAGE(STATUS "Checking what CFLAG is required for C99:")
FOREACH(CHECK_C99_CFLAG "-std=gnu99" "-std=c99" "-c99" "-AC99" "-xc99=all" "-qlanglvl=extc99")
SET(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
SET(CMAKE_REQUIRED_DEFINITIONS "${CHECK_C99_CFLAG}")
CHECK_C_SOURCE_COMPILES("int main() { return 0; }" CFLAG_${CHECK_C99_CFLAG})
SET(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
IF(CFLAG_${CHECK_C99_CFLAG})
SET(_SYS_C11_C99_CFLAG "${CHECK_C99_CFLAG}" CACHE INTERNAL "CFLAG required for C11 or C99 mode.")
BREAK()
ENDIF(CFLAG_${CHECK_C99_CFLAG})
ENDFOREACH()
IF(_SYS_C11_C99_CFLAG)
MESSAGE(STATUS "Checking what CFLAG is required for C99: ${_SYS_C11_C99_CFLAG}")
ELSE(_SYS_C11_C99_CFLAG)
SET(${_SYS_C11_C99_CFLAG} "" CACHE INTERNAL "CFLAG required for C11 or C99 mode.")
MESSAGE(STATUS "Checking what CFLAG is required for C99: unavailable")
ENDIF(_SYS_C11_C99_CFLAG)
ENDIF(CHECK_C99_ENABLED_DEFAULT)
ENDIF(NOT CHECK_C11_ENABLED_DEFAULT AND NOT _SYS_C11_C99_CFLAG)
ENDIF(NOT DEFINED _SYS_C11_C99_CFLAG AND NOT MSVC)
SET(${_result} "${_SYS_C11_C99_CFLAG}" PARENT_SCOPE)
ENDFUNCTION(CHECK_C11_C99_COMPILER_FLAG)

View File

@ -1,65 +0,0 @@
# - Check what flag is needed to activate C++ 2011 mode.
# CHECK_CXX11_COMPILER_FLAG(VARIABLE)
#
# VARIABLE - variable to store the result
#
# This actually calls the check_c_source_compiles macro.
# See help for CheckCSourceCompiles for a listing of variables
# that can modify the build.
# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>
# C++ 2011 version Copyright (c) 2011 by David Korth.
#
# Redistribution and use is allowed according to the terms of the BSD license.
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
# Based on CHECK_C99_COMPILER_FLAG(). (CheckC99CompilerFlag.cmake)
INCLUDE(CheckCXXSourceCompiles)
FUNCTION(CHECK_CXX11_COMPILER_FLAG _result)
UNSET(${_result} PARENT_SCOPE)
# MSVC doesn't allow setting the C standard.
IF(NOT DEFINED _SYS_CXX11_CXXFLAG AND NOT MSVC)
# Check if C++ 2011 is present without any flags.
# g++-5.1 uses C++ 1998 by default, but this may change
# in future versions of gcc.
MESSAGE(STATUS "Checking if C++ 2011 is enabled by default:")
CHECK_CXX_SOURCE_COMPILES("
#if !defined(__cplusplus) || __cplusplus < 201103L
# error C++ 2011 is not enabled
#endif
int main() { return 0; }" CHECK_CXX11_ENABLED_DEFAULT)
IF (CHECK_CXX11_ENABLED_DEFAULT)
SET(_SYS_CXX11_CXXFLAG "" CACHE INTERNAL "CXXFLAG required for C++11 mode.")
MESSAGE(STATUS "Checking if C++ 2011 is enabled by default: yes")
ELSE(CHECK_CXX11_ENABLED_DEFAULT)
MESSAGE(STATUS "Checking if C++ 2011 is enabled by default: no")
MESSAGE(STATUS "Checking what CXXFLAG is required for C++ 2011:")
FOREACH(CHECK_CXX11_CXXFLAG "-std=gnu++11" "-std=gnu++0x" "-std=c++11" "-std=c++0x")
# CMake doesn't like "+" characters in variable names.
STRING(REPLACE "+" "_" CHECK_CXX11_CXXFLAG_VARNAME "CHECK_CXXFLAG_${CHECK_CXX11_CXXFLAG}")
SET(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
SET(CMAKE_REQUIRED_DEFINITIONS "${CHECK_CXX11_CXXFLAG}")
CHECK_CXX_SOURCE_COMPILES("int main() { static_assert(0 == 0, \"test assertion\"); return 0; }" ${CHECK_CXX11_CXXFLAG_VARNAME})
SET(CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
IF(${${CHECK_CXX11_CXXFLAG_VARNAME}})
SET(_SYS_CXX11_CXXFLAG ${CHECK_CXX11_CXXFLAG} CACHE INTERNAL "CXXFLAG required for C++11 mode.")
BREAK()
ENDIF(${${CHECK_CXX11_CXXFLAG_VARNAME}})
ENDFOREACH()
IF(_SYS_CXX11_CXXFLAG)
MESSAGE(STATUS "Checking what CXXFLAG is required for C++ 2011: ${_SYS_CXX11_CXXFLAG}")
ELSE(_SYS_CXX11_CXXFLAG)
SET(${_SYS_CXX11_CXXFLAG} "" CACHE INTERNAL "CXXFLAG required for C++11 mode.")
MESSAGE(STATUS "Checking what CXXFLAG is required for C++ 2011: unavailable")
ENDIF(_SYS_CXX11_CXXFLAG)
ENDIF(CHECK_CXX11_ENABLED_DEFAULT)
ENDIF(NOT DEFINED _SYS_CXX11_CXXFLAG AND NOT MSVC)
SET(${_result} "${_SYS_CXX11_CXXFLAG}" PARENT_SCOPE)
ENDFUNCTION(CHECK_CXX11_COMPILER_FLAG)

View File

@ -14,24 +14,13 @@ ENDIF()
INCLUDE(CheckCCompilerFlag)
INCLUDE(CheckCXXCompilerFlag)
# Check what flag is needed for C11 and/or C99 support.
INCLUDE(CheckC11C99CompilerFlag)
CHECK_C11_C99_COMPILER_FLAG(RP_C11_CFLAG)
# Check what flag is needed for C++ 2011 support.
INCLUDE(CheckCXX11CompilerFlag)
CHECK_CXX11_COMPILER_FLAG(RP_CXX11_CXXFLAG)
SET(RP_C_FLAGS_COMMON "${RP_C11_CFLAG}")
SET(RP_CXX_FLAGS_COMMON "${RP_CXX11_CXXFLAG}")
SET(RP_C_FLAGS_COMMON "")
SET(RP_CXX_FLAGS_COMMON "")
SET(RP_EXE_LINKER_FLAGS_COMMON "")
# _GNU_SOURCE is needed for memmem() and statx().
ADD_DEFINITIONS(-D_GNU_SOURCE=1)
UNSET(RP_C11_CFLAG)
UNSET(RP_CXX11_CXXFLAG)
# Test for common CFLAGS and CXXFLAGS.
# NOTE: Not adding -Werror=format-nonliteral because there are some
# legitimate uses of non-literal format strings.