From 1de7084501aa094858d344f92dd2c9fe744a4e9a Mon Sep 17 00:00:00 2001 From: Chuck Atkins Date: Mon, 1 May 2017 09:06:58 -0400 Subject: Compilers: Add common macros to be used by various compilers With numerous compilers now supporting multiple language standards in CMake, some common design patterns have begun to emerge. This is intended to be a collection of macros implementing many of those common design patterns that can be factored out and leveraged by many compilers. Currently this only contains the code to set the default language standard of not preset. More functionality will be added in the future as appropriate. --- Modules/Compiler/CMakeCommonCompilerMacros.cmake | 62 ++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Modules/Compiler/CMakeCommonCompilerMacros.cmake diff --git a/Modules/Compiler/CMakeCommonCompilerMacros.cmake b/Modules/Compiler/CMakeCommonCompilerMacros.cmake new file mode 100644 index 0000000..cb365d6 --- /dev/null +++ b/Modules/Compiler/CMakeCommonCompilerMacros.cmake @@ -0,0 +1,62 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# This module is shared by multiple languages and compilers; use include guard +if (__COMPILER_CMAKE_COMMON_COMPILER_MACROS) + return() +endif () +set(__COMPILER_CMAKE_COMMON_COMPILER_MACROS 1) + + +# Check that a compiler's language standard is properly detected +# Parameters: +# lang - Language to check +# stdver1 - Minimum version to set a given default for +# std1 - Default to use for compiler ver >= stdver1 +# stdverN - Minimum version to set a given default for +# stdN - Default to use for compiler ver >= stdverN +# +# The order of stdverN stdN pairs passed as arguments is expected to be in +# monotonically increasing version order. +# +# Note: +# This macro can be called with multiple version / std pairs to convey that +# newer compiler versions may use a newer standard default. +# +# Example: +# To specify that compiler version 6.1 and newer defaults to C++11 while +# 4.8 <= ver < 6.1 default to C++98, you would call: +# +# __compiler_check_default_language_standard(CXX 4.8 98 6.1 11) +# +macro(__compiler_check_default_language_standard lang stdver1 std1) + set(__std_ver_pairs "${stdver1};${std1};${ARGN}") + string(REGEX REPLACE " *; *" " " __std_ver_pairs "${__std_ver_pairs}") + string(REGEX MATCHALL "[^ ]+ [^ ]+" __std_ver_pairs "${__std_ver_pairs}") + + # If the compiler version is below the threshold of even having CMake + # support for language standards, then don't bother. + if (CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL "${stdver1}") + if (NOT CMAKE_${lang}_COMPILER_FORCED) + if (NOT CMAKE_${lang}_STANDARD_COMPUTED_DEFAULT) + message(FATAL_ERROR "CMAKE_${lang}_STANDARD_COMPUTED_DEFAULT should be set for ${CMAKE_${lang}_COMPILER_ID} (${CMAKE_${lang}_COMPILER}) version ${CMAKE_${lang}_COMPILER_VERSION}") + endif () + set(CMAKE_${lang}_STANDARD_DEFAULT ${CMAKE_${lang}_STANDARD_COMPUTED_DEFAULT}) + else () + list(REVERSE __std_ver_pairs) + foreach (__std_ver_pair IN LISTS __std_ver_pairs) + string(REGEX MATCH "([^ ]+) (.+)" __std_ver_pair "${__std_ver_pair}") + set(__stdver ${CMAKE_MATCH_1}) + set(__std ${CMAKE_MATCH_2}) + if (CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL __stdver AND + NOT DEFINED CMAKE_${lang}_STANDARD_DEFAULT) + # Compiler id was forced so just guess the default standard level. + set(CMAKE_${lang}_STANDARD_DEFAULT ${__std}) + endif () + unset(__std) + unset(__stdver) + endforeach () + endif () + endif () + unset(__std_ver_pairs) +endmacro() -- cgit v0.12 From 25e83ce580d7e6821a07198ce13338a82b966c0b Mon Sep 17 00:00:00 2001 From: Chuck Atkins Date: Wed, 5 Oct 2016 14:54:54 -0400 Subject: CompileFeatures: Let STD compile options be a list --- Source/cmLocalGenerator.cxx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 33e32d1..b9448b3 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1464,7 +1464,11 @@ void cmLocalGenerator::AddCompilerRequirementFlag( "does not know the compile flags to use to enable it."; this->IssueMessage(cmake::FATAL_ERROR, e.str()); } else { - this->AppendFlagEscape(flags, opt); + std::vector optVec; + cmSystemTools::ExpandListArgument(opt, optVec); + for (size_t i = 0; i < optVec.size(); ++i) { + this->AppendFlagEscape(flags, optVec[i]); + } } return; } -- cgit v0.12 From daae564d87044950edece389f09bde423e6ad867 Mon Sep 17 00:00:00 2001 From: Chuck Atkins Date: Mon, 1 May 2017 09:10:14 -0400 Subject: Cray: Add language standards for the Cray compiler --- Modules/Compiler/Cray-C.cmake | 21 +++++++++++++++++++++ Modules/Compiler/Cray-CXX.cmake | 19 +++++++++++++++++++ Modules/Compiler/Cray.cmake | 10 ++++++++++ 3 files changed, 50 insertions(+) create mode 100644 Modules/Compiler/Cray.cmake diff --git a/Modules/Compiler/Cray-C.cmake b/Modules/Compiler/Cray-C.cmake index 675560c..87ce20f 100644 --- a/Modules/Compiler/Cray-C.cmake +++ b/Modules/Compiler/Cray-C.cmake @@ -1 +1,22 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +include(Compiler/Cray) + set(CMAKE_C_VERBOSE_FLAG "-v") + +string(APPEND CMAKE_C_FLAGS_MINSIZEREL_INIT " -DNDEBUG") +string(APPEND CMAKE_C_FLAGS_RELEASE_INIT " -DNDEBUG") + +if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1) + set(CMAKE_C90_STANDARD_COMPILE_OPTION -h noc99,conform) + set(CMAKE_C90_EXTENSION_COMPILE_OPTION -h noc99,gnu) + set(CMAKE_C99_STANDARD_COMPILE_OPTION -h c99,conform) + set(CMAKE_C99_EXTENSION_COMPILE_OPTION -h c99,gnu) + if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.5) + set(CMAKE_C11_STANDARD_COMPILE_OPTION -h std=c11,conform) + set(CMAKE_C11_EXTENSION_COMPILE_OPTION -h std=c11,gnu) + endif () +endif () + +__compiler_check_default_language_standard(C 8.1 99) diff --git a/Modules/Compiler/Cray-CXX.cmake b/Modules/Compiler/Cray-CXX.cmake index 9fb191c..8506c094 100644 --- a/Modules/Compiler/Cray-CXX.cmake +++ b/Modules/Compiler/Cray-CXX.cmake @@ -1 +1,20 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +include(Compiler/Cray) + set(CMAKE_CXX_VERBOSE_FLAG "-v") + +string(APPEND CMAKE_CXX_FLAGS_MINSIZEREL_INIT " -DNDEBUG") +string(APPEND CMAKE_CXX_FLAGS_RELEASE_INIT " -DNDEBUG") + +if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1) + set(CMAKE_CXX98_STANDARD_COMPILE_OPTION -h conform) + set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION -h gnu) + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.4) + set(CMAKE_CXX11_STANDARD_COMPILE_OPTION -h std=c++11) + set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION -h std=c++11,gnu) + endif () +endif () + +__compiler_check_default_language_standard(CXX 8.1 98) diff --git a/Modules/Compiler/Cray.cmake b/Modules/Compiler/Cray.cmake new file mode 100644 index 0000000..8fe8eeb --- /dev/null +++ b/Modules/Compiler/Cray.cmake @@ -0,0 +1,10 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# This module is shared by multiple languages; use include blocker. +if(__COMPILER_CRAY) + return() +endif() +set(__COMPILER_CRAY 1) + +include(Compiler/CMakeCommonCompilerMacros) -- cgit v0.12 From 9b97cb5562317ecb6fe65e6185eb6fda2b0ad7d7 Mon Sep 17 00:00:00 2001 From: Chuck Atkins Date: Mon, 1 May 2017 09:20:22 -0400 Subject: PGI: Add language standards for PGI --- Modules/Compiler/PGI-C.cmake | 13 +++++++++++++ Modules/Compiler/PGI-CXX.cmake | 19 +++++++++++++++++++ Modules/Compiler/PGI.cmake | 2 ++ 3 files changed, 34 insertions(+) diff --git a/Modules/Compiler/PGI-C.cmake b/Modules/Compiler/PGI-C.cmake index 85d6e7e..a24e554 100644 --- a/Modules/Compiler/PGI-C.cmake +++ b/Modules/Compiler/PGI-C.cmake @@ -2,3 +2,16 @@ include(Compiler/PGI) __compiler_pgi(C) string(APPEND CMAKE_C_FLAGS_MINSIZEREL_INIT " -DNDEBUG") string(APPEND CMAKE_C_FLAGS_RELEASE_INIT " -DNDEBUG") + +if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.10) + set(CMAKE_C90_STANDARD_COMPILE_OPTION -c89) + set(CMAKE_C90_EXTENSION_COMPILE_OPTION -c89) + set(CMAKE_C99_STANDARD_COMPILE_OPTION -c99) + set(CMAKE_C99_EXTENSION_COMPILE_OPTION -c99) + if (CMAKE_C_COMPILER_VERSION VERSION_CREATER_EQUAL 15.3) + set(CMAKE_C11_STANDARD_COMPILE_OPTION -c11) + set(CMAKE_C11_EXTENSION_COMPILE_OPTION -c11) + endif () +endif () + +__compiler_check_default_language_standard(C 12.10 90) diff --git a/Modules/Compiler/PGI-CXX.cmake b/Modules/Compiler/PGI-CXX.cmake index 896e298..abc7349 100644 --- a/Modules/Compiler/PGI-CXX.cmake +++ b/Modules/Compiler/PGI-CXX.cmake @@ -2,3 +2,22 @@ include(Compiler/PGI) __compiler_pgi(CXX) string(APPEND CMAKE_CXX_FLAGS_MINSIZEREL_INIT " -DNDEBUG") string(APPEND CMAKE_CXX_FLAGS_RELEASE_INIT " -DNDEBUG") + +if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.10) + set(CMAKE_CXX98_STANDARD_COMPILE_OPTION -A) + set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION --gnu_extensions) + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.10) + set(CMAKE_CXX11_STANDARD_COMPILE_OPTION --c++11 -A) + set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION --c++11 --gnu_extensions) + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 15.7) + set(CMAKE_CXX14_STANDARD_COMPILE_OPTION --c++14 -A) + set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION --c++14 --gnu_extensions) + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 17.1) + set(CMAKE_CXX17_STANDARD_COMPILE_OPTION --c++17 -A) + set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION --c++17 --gnu_extensions) + endif() + endif() + endif() +endif() + +__compiler_check_default_language_standard(CXX 12.10 98) diff --git a/Modules/Compiler/PGI.cmake b/Modules/Compiler/PGI.cmake index cc76deb..bdabeba 100644 --- a/Modules/Compiler/PGI.cmake +++ b/Modules/Compiler/PGI.cmake @@ -8,6 +8,8 @@ if(__COMPILER_PGI) endif() set(__COMPILER_PGI 1) +include(Compiler/CMakeCommonCompilerMacros) + macro(__compiler_pgi lang) # Feature flags. set(CMAKE_${lang}_VERBOSE_FLAG "-v") -- cgit v0.12