2020-03-26 04:08:39 +08:00
KOKKOS_CFG_DEPENDS ( CXX_STD COMPILER_ID )
FUNCTION ( kokkos_set_cxx_standard_feature standard )
SET ( EXTENSION_NAME CMAKE_CXX ${ standard } _EXTENSION_COMPILE_OPTION )
SET ( STANDARD_NAME CMAKE_CXX ${ standard } _STANDARD_COMPILE_OPTION )
SET ( FEATURE_NAME cxx_std_ ${ standard } )
#CMake's way of telling us that the standard (or extension)
#flags are supported is the extension/standard variables
IF ( NOT DEFINED CMAKE_CXX_EXTENSIONS )
IF ( KOKKOS_DONT_ALLOW_EXTENSIONS )
GLOBAL_SET ( KOKKOS_USE_CXX_EXTENSIONS OFF )
ELSE ( )
GLOBAL_SET ( KOKKOS_USE_CXX_EXTENSIONS ON )
ENDIF ( )
ELSEIF ( CMAKE_CXX_EXTENSIONS )
IF ( KOKKOS_DONT_ALLOW_EXTENSIONS )
2020-04-16 23:06:08 +08:00
MESSAGE ( FATAL_ERROR "The chosen configuration does not support CXX extensions flags: ${KOKKOS_DONT_ALLOW_EXTENSIONS}. Must set CMAKE_CXX_EXTENSIONS=OFF to continue" )
2020-03-26 04:08:39 +08:00
ELSE ( )
GLOBAL_SET ( KOKKOS_USE_CXX_EXTENSIONS ON )
ENDIF ( )
ELSE ( )
2020-04-16 23:06:08 +08:00
#For trilinos, we need to make sure downstream projects
2020-03-26 04:08:39 +08:00
GLOBAL_SET ( KOKKOS_USE_CXX_EXTENSIONS OFF )
ENDIF ( )
IF ( KOKKOS_USE_CXX_EXTENSIONS AND ${ EXTENSION_NAME } )
MESSAGE ( STATUS "Using ${${EXTENSION_NAME}} for C++${standard} extensions as feature" )
GLOBAL_SET ( KOKKOS_CXX_STANDARD_FEATURE ${ FEATURE_NAME } )
ELSEIF ( NOT KOKKOS_USE_CXX_EXTENSIONS AND ${ STANDARD_NAME } )
MESSAGE ( STATUS "Using ${${STANDARD_NAME}} for C++${standard} standard as feature" )
2020-08-26 10:21:48 +08:00
IF ( KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA AND ( KOKKOS_CXX_HOST_COMPILER_ID STREQUAL GNU OR KOKKOS_CXX_HOST_COMPILER_ID STREQUAL Clang ) )
2023-06-06 05:03:28 +08:00
IF ( ${ KOKKOS_CXX_COMPILER_VERSION } VERSION_LESS 12.0.0 )
SET ( SUPPORTED_NVCC_FLAGS "-std=c++17" )
ELSE ( )
SET ( SUPPORTED_NVCC_FLAGS "-std=c++17" "-std=c++20" )
ENDIF ( )
2020-08-26 10:21:48 +08:00
IF ( NOT ${ ${STANDARD_NAME } } IN_LIST SUPPORTED_NVCC_FLAGS )
MESSAGE ( FATAL_ERROR "CMake wants to use ${${STANDARD_NAME}} which is not supported by NVCC. Using a more recent host compiler or a more recent CMake version might help." )
ENDIF ( )
ENDIF ( )
2020-03-26 04:08:39 +08:00
GLOBAL_SET ( KOKKOS_CXX_STANDARD_FEATURE ${ FEATURE_NAME } )
2020-08-26 10:21:48 +08:00
ELSEIF ( CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC" )
2020-04-16 23:06:08 +08:00
#MSVC doesn't need a command line flag, that doesn't mean it has no support
MESSAGE ( STATUS "Using no flag for C++${standard} standard as feature" )
GLOBAL_SET ( KOKKOS_CXX_STANDARD_FEATURE ${ FEATURE_NAME } )
2020-08-26 10:21:48 +08:00
ELSEIF ( ( KOKKOS_CXX_COMPILER_ID STREQUAL "NVIDIA" ) AND WIN32 )
MESSAGE ( STATUS "Using no flag for C++${standard} standard as feature" )
GLOBAL_SET ( KOKKOS_CXX_STANDARD_FEATURE "" )
2020-12-22 23:52:37 +08:00
ELSEIF ( ( KOKKOS_CXX_COMPILER_ID STREQUAL "Fujitsu" ) )
MESSAGE ( STATUS "Using no flag for C++${standard} standard as feature" )
GLOBAL_SET ( KOKKOS_CXX_STANDARD_FEATURE "" )
2020-03-26 04:08:39 +08:00
ELSE ( )
#nope, we can't do anything here
2020-12-22 23:52:37 +08:00
MESSAGE ( WARNING "C++${standard} is not supported as a compiler feature. We will choose custom flags for now, but this behavior has been deprecated. Please open an issue at https://github.com/kokkos/kokkos/issues reporting that ${KOKKOS_CXX_COMPILER_ID} ${KOKKOS_CXX_COMPILER_VERSION} failed for ${KOKKOS_CXX_STANDARD}, preferably including your CMake command." )
2020-03-26 04:08:39 +08:00
GLOBAL_SET ( KOKKOS_CXX_STANDARD_FEATURE "" )
ENDIF ( )
2020-12-22 23:52:37 +08:00
IF ( ( NOT WIN32 ) AND ( NOT ( "${KOKKOS_CXX_COMPILER_ID}" STREQUAL "Fujitsu" ) ) )
2020-08-26 10:21:48 +08:00
IF ( NOT ${ FEATURE_NAME } IN_LIST CMAKE_CXX_COMPILE_FEATURES )
MESSAGE ( FATAL_ERROR "Compiler ${KOKKOS_CXX_COMPILER_ID} should support ${FEATURE_NAME}, but CMake reports feature not supported" )
ENDIF ( )
2020-03-26 04:08:39 +08:00
ENDIF ( )
ENDFUNCTION ( )
2023-03-04 00:22:33 +08:00
IF ( KOKKOS_CXX_STANDARD STREQUAL "17" )
2020-03-26 04:08:39 +08:00
kokkos_set_cxx_standard_feature ( 17 )
SET ( KOKKOS_CXX_INTERMEDIATE_STANDARD "1Z" )
SET ( KOKKOS_ENABLE_CXX17 ON )
ELSEIF ( KOKKOS_CXX_STANDARD STREQUAL "20" )
kokkos_set_cxx_standard_feature ( 20 )
SET ( KOKKOS_CXX_INTERMEDIATE_STANDARD "2A" )
SET ( KOKKOS_ENABLE_CXX20 ON )
2023-03-04 00:22:33 +08:00
ELSEIF ( KOKKOS_CXX_STANDARD STREQUAL "23" )
kokkos_set_cxx_standard_feature ( 23 )
SET ( KOKKOS_CXX_INTERMEDIATE_STANDARD "2B" )
SET ( KOKKOS_ENABLE_CXX23 ON )
2024-04-05 22:20:57 +08:00
ELSEIF ( KOKKOS_CXX_STANDARD STREQUAL "26" )
kokkos_set_cxx_standard_feature ( 26 )
SET ( KOKKOS_CXX_INTERMEDIATE_STANDARD "2C" )
SET ( KOKKOS_ENABLE_CXX26 ON )
2020-03-26 04:08:39 +08:00
ELSE ( )
2023-03-04 00:22:33 +08:00
MESSAGE ( FATAL_ERROR "Kokkos requires C++17 or newer but requested ${KOKKOS_CXX_STANDARD}!" )
2020-03-26 04:08:39 +08:00
ENDIF ( )
2023-03-04 00:22:33 +08:00
# Enforce that we can compile a simple C++17 program
2021-04-27 06:28:19 +08:00
2023-03-04 00:22:33 +08:00
TRY_COMPILE ( CAN_COMPILE_CPP17
2021-04-27 06:28:19 +08:00
$ { K O K K O S _ T O P _ B U I L D _ D I R } / c o r n e r _ c a s e s
2023-03-04 00:22:33 +08:00
$ { K O K K O S _ S O U R C E _ D I R } / c m a k e / c o m p i l e _ t e s t s / c p l u s p l u s 1 7 . c p p
2021-04-27 06:28:19 +08:00
O U T P U T _ V A R I A B L E E R R O R _ M E S S A G E
2023-03-04 00:22:33 +08:00
C X X _ S T A N D A R D 1 7
2021-04-27 06:28:19 +08:00
)
2023-03-04 00:22:33 +08:00
if ( NOT CAN_COMPILE_CPP17 )
UNSET ( CAN_COMPILE_CPP17 CACHE ) #make sure CMake always re-runs this
MESSAGE ( FATAL_ERROR "C++${KOKKOS_CXX_STANDARD}-compliant compiler detected, but unable to compile C++17 or later program. Verify that ${CMAKE_CXX_COMPILER_ID}:${CMAKE_CXX_COMPILER_VERSION} is set up correctly (e.g., check that correct library headers are being used).\nFailing output:\n ${ERROR_MESSAGE}" )
2021-04-27 06:28:19 +08:00
ENDIF ( )
2023-03-04 00:22:33 +08:00
UNSET ( CAN_COMPILE_CPP17 CACHE ) #make sure CMake always re-runs this
2020-03-26 04:08:39 +08:00
# Enforce that extensions are turned off for nvcc_wrapper.
# For compiling CUDA code using nvcc_wrapper, we will use the host compiler's
2023-03-04 00:22:33 +08:00
# flags for turning on C++17. Since for compiler ID and versioning purposes
2020-03-26 04:08:39 +08:00
# CMake recognizes the host compiler when calling nvcc_wrapper, this just
2023-03-04 00:22:33 +08:00
# works. Both NVCC and nvcc_wrapper only recognize '-std=c++17' which means
2020-03-26 04:08:39 +08:00
# that we can only use host compilers for CUDA builds that use those flags.
2023-03-04 00:22:33 +08:00
# It also means that extensions (gnu++17) can't be turned on for CUDA builds.
2020-03-26 04:08:39 +08:00
IF ( KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA )
IF ( NOT DEFINED CMAKE_CXX_EXTENSIONS )
SET ( CMAKE_CXX_EXTENSIONS OFF )
ELSEIF ( CMAKE_CXX_EXTENSIONS )
MESSAGE ( FATAL_ERROR "NVCC doesn't support C++ extensions. Set -DCMAKE_CXX_EXTENSIONS=OFF" )
ENDIF ( )
ENDIF ( )
IF ( KOKKOS_ENABLE_CUDA )
# ENFORCE that the compiler can compile CUDA code.
IF ( KOKKOS_CXX_COMPILER_ID STREQUAL Clang )
IF ( KOKKOS_CXX_COMPILER_VERSION VERSION_LESS 4.0.0 )
MESSAGE ( FATAL_ERROR "Compiling CUDA code directly with Clang requires version 4.0.0 or higher." )
ENDIF ( )
IF ( NOT DEFINED CMAKE_CXX_EXTENSIONS )
SET ( CMAKE_CXX_EXTENSIONS OFF )
ELSEIF ( CMAKE_CXX_EXTENSIONS )
MESSAGE ( FATAL_ERROR "Compiling CUDA code with clang doesn't support C++ extensions. Set -DCMAKE_CXX_EXTENSIONS=OFF" )
ENDIF ( )
2023-11-22 06:02:12 +08:00
ELSEIF ( NOT KOKKOS_CXX_COMPILER_ID STREQUAL NVIDIA AND NOT ( Kokkos_ENABLE_IMPL_NVHPC_AS_DEVICE_COMPILER AND KOKKOS_CXX_COMPILER_ID STREQUAL NVHPC ) )
IF ( KOKKOS_CXX_COMPILER_ID STREQUAL NVHPC )
MESSAGE ( FATAL_ERROR "Invalid compiler for CUDA. To allow nvc++ as Cuda compiler, Kokkos_ENABLE_IMPL_NVHPC_AS_DEVICE_COMPILER=ON must be set!" )
ELSE ( )
MESSAGE ( FATAL_ERROR "Invalid compiler for CUDA. The compiler must be nvcc_wrapper or Clang or NVC++ or use kokkos_launch_compiler, but compiler ID was ${KOKKOS_CXX_COMPILER_ID}" )
ENDIF ( )
2020-03-26 04:08:39 +08:00
ENDIF ( )
ENDIF ( )
IF ( NOT KOKKOS_CXX_STANDARD_FEATURE )
#we need to pick the C++ flags ourselves
UNSET ( CMAKE_CXX_STANDARD )
UNSET ( CMAKE_CXX_STANDARD CACHE )
IF ( KOKKOS_CXX_COMPILER_ID STREQUAL Cray )
INCLUDE ( ${ KOKKOS_SRC_PATH } /cmake/cray.cmake )
kokkos_set_cray_flags ( ${ KOKKOS_CXX_STANDARD } ${ KOKKOS_CXX_INTERMEDIATE_STANDARD } )
2021-11-05 02:45:59 +08:00
ELSEIF ( KOKKOS_CXX_COMPILER_ID STREQUAL NVHPC )
2020-03-26 04:08:39 +08:00
INCLUDE ( ${ KOKKOS_SRC_PATH } /cmake/pgi.cmake )
kokkos_set_pgi_flags ( ${ KOKKOS_CXX_STANDARD } ${ KOKKOS_CXX_INTERMEDIATE_STANDARD } )
ELSEIF ( KOKKOS_CXX_COMPILER_ID STREQUAL Intel )
INCLUDE ( ${ KOKKOS_SRC_PATH } /cmake/intel.cmake )
kokkos_set_intel_flags ( ${ KOKKOS_CXX_STANDARD } ${ KOKKOS_CXX_INTERMEDIATE_STANDARD } )
2020-08-26 10:21:48 +08:00
ELSEIF ( ( KOKKOS_CXX_COMPILER_ID STREQUAL "MSVC" ) OR ( ( KOKKOS_CXX_COMPILER_ID STREQUAL "NVIDIA" ) AND WIN32 ) )
2020-04-16 23:06:08 +08:00
INCLUDE ( ${ KOKKOS_SRC_PATH } /cmake/msvc.cmake )
kokkos_set_msvc_flags ( ${ KOKKOS_CXX_STANDARD } ${ KOKKOS_CXX_INTERMEDIATE_STANDARD } )
2020-03-26 04:08:39 +08:00
ELSE ( )
INCLUDE ( ${ KOKKOS_SRC_PATH } /cmake/gnu.cmake )
kokkos_set_gnu_flags ( ${ KOKKOS_CXX_STANDARD } ${ KOKKOS_CXX_INTERMEDIATE_STANDARD } )
ENDIF ( )
#check that the compiler accepts the C++ standard flag
INCLUDE ( CheckCXXCompilerFlag )
IF ( DEFINED CXX_STD_FLAGS_ACCEPTED )
UNSET ( CXX_STD_FLAGS_ACCEPTED CACHE )
ENDIF ( )
2020-04-16 23:06:08 +08:00
CHECK_CXX_COMPILER_FLAG ( "${KOKKOS_CXX_STANDARD_FLAG}" CXX_STD_FLAGS_ACCEPTED )
2020-03-26 04:08:39 +08:00
IF ( NOT CXX_STD_FLAGS_ACCEPTED )
2020-04-16 23:06:08 +08:00
CHECK_CXX_COMPILER_FLAG ( "${KOKKOS_CXX_INTERMEDIATE_STANDARD_FLAG}" CXX_INT_STD_FLAGS_ACCEPTED )
2020-03-26 04:08:39 +08:00
IF ( NOT CXX_INT_STD_FLAGS_ACCEPTED )
MESSAGE ( FATAL_ERROR "${KOKKOS_CXX_COMPILER_ID} did not accept ${KOKKOS_CXX_STANDARD_FLAG} or ${KOKKOS_CXX_INTERMEDIATE_STANDARD_FLAG}. You likely need to reduce the level of the C++ standard from ${KOKKOS_CXX_STANDARD}" )
ENDIF ( )
SET ( KOKKOS_CXX_STANDARD_FLAG ${ KOKKOS_CXX_INTERMEDIATE_STANDARD_FLAG } )
ENDIF ( )
MESSAGE ( STATUS "Compiler features not supported, but ${KOKKOS_CXX_COMPILER_ID} accepts ${KOKKOS_CXX_STANDARD_FLAG}" )
ENDIF ( )