From 4d27ef55bdb3f74370df9b0ec573869d0d43c398 Mon Sep 17 00:00:00 2001 From: Tyler Date: Wed, 20 Mar 2024 15:42:15 -0600 Subject: Modules: Factor out helpers for GNU language standard flags Add the following macros to `${CMAKE_ROOT}\Modules\Compiler\GNU.cmake`: * `__compiler_gnu_c_standards()` * `__compiler_gnu_cxx_standards()` These macros are used to define the `CMAKE__STANDARD_COMPILE_OPTION` and `CMAKE__EXTENSION_COMPILE_OPTION` variables for C- and C++-based languages for GCC. The macros are similar to the existing `__compiler_clang_cxx_standards()` macro found in `${CMAKE_ROOT}\Modules\Compiler\Clang.cmake`. --- Modules/Compiler/GNU-C.cmake | 35 +---------------- Modules/Compiler/GNU-CXX.cmake | 50 +----------------------- Modules/Compiler/GNU.cmake | 87 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 83 deletions(-) diff --git a/Modules/Compiler/GNU-C.cmake b/Modules/Compiler/GNU-C.cmake index 03e8d2b..0ac4d8c 100644 --- a/Modules/Compiler/GNU-C.cmake +++ b/Modules/Compiler/GNU-C.cmake @@ -1,5 +1,6 @@ include(Compiler/GNU) __compiler_gnu(C) +__compiler_gnu_c_standards(C) if((NOT DEFINED CMAKE_DEPENDS_USE_COMPILER OR CMAKE_DEPENDS_USE_COMPILER) @@ -12,38 +13,4 @@ endif() set(CMAKE_C_COMPILE_OPTIONS_EXPLICIT_LANGUAGE -x c) -if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.5) - set(CMAKE_C90_STANDARD_COMPILE_OPTION "-std=c90") - set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu90") -elseif (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4) - set(CMAKE_C90_STANDARD_COMPILE_OPTION "-std=c89") - set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu89") -endif() - -if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.4) - set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON) - set(CMAKE_C99_STANDARD_COMPILE_OPTION "-std=c99") - set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99") - set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON) -endif() - -if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.7) - set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11") - set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11") - set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON) -elseif (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.6) - set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c1x") - set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu1x") -endif() - -if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1) - set(CMAKE_C17_STANDARD_COMPILE_OPTION "-std=c17") - set(CMAKE_C17_EXTENSION_COMPILE_OPTION "-std=gnu17") -endif() - -if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 9.1) - set(CMAKE_C23_STANDARD_COMPILE_OPTION "-std=c2x") - set(CMAKE_C23_EXTENSION_COMPILE_OPTION "-std=gnu2x") -endif() - __compiler_check_default_language_standard(C 3.4 90 5.0 11 8.1 17) diff --git a/Modules/Compiler/GNU-CXX.cmake b/Modules/Compiler/GNU-CXX.cmake index 2e1b4ad..e98909b 100644 --- a/Modules/Compiler/GNU-CXX.cmake +++ b/Modules/Compiler/GNU-CXX.cmake @@ -1,5 +1,6 @@ include(Compiler/GNU) __compiler_gnu(CXX) +__compiler_gnu_cxx_standards(CXX) if((NOT DEFINED CMAKE_DEPENDS_USE_COMPILER OR CMAKE_DEPENDS_USE_COMPILER) @@ -22,55 +23,6 @@ else() endif() endif() -if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4) - set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-std=c++98") - set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-std=gnu++98") -endif() - -if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7) - set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON) - set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++11") - set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11") -elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4) - # 4.3 supports 0x variants - set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++0x") - set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++0x") -endif() - -if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8.1) - set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON) -endif() - -if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) - set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14") - set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14") -elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) - set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++1y") - set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y") -endif() - -if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) - set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON) -endif() - -if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) - set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17") - set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17") -elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) - set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++1z") - set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++1z") -endif() - -if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 11.1) - set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++20") - set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++20") - set(CMAKE_CXX23_STANDARD_COMPILE_OPTION "-std=c++23") - set(CMAKE_CXX23_EXTENSION_COMPILE_OPTION "-std=gnu++23") -elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.0) - set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++2a") - set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++2a") -endif() - __compiler_check_default_language_standard(CXX 3.4 98 6.0 14 11.1 17) if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 14.0) diff --git a/Modules/Compiler/GNU.cmake b/Modules/Compiler/GNU.cmake index 138bb4b..fa199b4 100644 --- a/Modules/Compiler/GNU.cmake +++ b/Modules/Compiler/GNU.cmake @@ -207,3 +207,90 @@ macro(__compiler_gnu lang) set(CMAKE_${lang}_COMPILE_OPTIONS_COLOR_DIAGNOSTICS_OFF "-fno-diagnostics-color") endif() endmacro() + +macro(__compiler_gnu_c_standards lang) + if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.5) + set(CMAKE_${lang}90_STANDARD_COMPILE_OPTION "-std=c90") + set(CMAKE_${lang}90_EXTENSION_COMPILE_OPTION "-std=gnu90") + elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.4) + set(CMAKE_${lang}90_STANDARD_COMPILE_OPTION "-std=c89") + set(CMAKE_${lang}90_EXTENSION_COMPILE_OPTION "-std=gnu89") + endif() + + if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.4) + set(CMAKE_${lang}90_STANDARD__HAS_FULL_SUPPORT ON) + set(CMAKE_${lang}99_STANDARD_COMPILE_OPTION "-std=c99") + set(CMAKE_${lang}99_EXTENSION_COMPILE_OPTION "-std=gnu99") + set(CMAKE_${lang}99_STANDARD__HAS_FULL_SUPPORT ON) + endif() + + if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.7) + set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c11") + set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu11") + set(CMAKE_${lang}11_STANDARD__HAS_FULL_SUPPORT ON) + elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.6) + set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c1x") + set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu1x") + endif() + + if(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1) + set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c17") + set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=gnu17") + endif() + + if(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 9.1) + set(CMAKE_${lang}23_STANDARD_COMPILE_OPTION "-std=c2x") + set(CMAKE_${lang}23_EXTENSION_COMPILE_OPTION "-std=gnu2x") + endif() +endmacro() + +macro(__compiler_gnu_cxx_standards lang) + if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.4) + set(CMAKE_${lang}98_STANDARD_COMPILE_OPTION "-std=c++98") + set(CMAKE_${lang}98_EXTENSION_COMPILE_OPTION "-std=gnu++98") + endif() + + if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.7) + set(CMAKE_${lang}98_STANDARD__HAS_FULL_SUPPORT ON) + set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c++11") + set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu++11") + elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.4) + # 4.3 supports 0x variants + set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c++0x") + set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu++0x") + endif() + + if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.8.1) + set(CMAKE_${lang}11_STANDARD__HAS_FULL_SUPPORT ON) + endif() + + if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.9) + set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std=c++14") + set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "-std=gnu++14") + elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.8) + set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std=c++1y") + set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "-std=gnu++1y") + endif() + + if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 5.0) + set(CMAKE_${lang}14_STANDARD__HAS_FULL_SUPPORT ON) + endif() + + if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 8.0) + set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c++17") + set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=gnu++17") + elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 5.1) + set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c++1z") + set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=gnu++1z") + endif() + + if(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 11.1) + set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std=c++20") + set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std=gnu++20") + set(CMAKE_${lang}23_STANDARD_COMPILE_OPTION "-std=c++23") + set(CMAKE_${lang}23_EXTENSION_COMPILE_OPTION "-std=gnu++23") + elseif(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 8.0) + set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std=c++2a") + set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std=gnu++2a") + endif() +endmacro() -- cgit v0.12