mirror of
https://github.com/Kitware/CMake.git
synced 2026-11-06 05:16:58 +00:00
Add experimental support for SYCL under an experimental gate. The IntelLLVM and Adaptivecpp compilers are recognized, as well as upstream Clang with libsycl support. Fixes: #27219, #27905
93 lines
3.9 KiB
CMake
93 lines
3.9 KiB
CMake
set(CMAKE_EXPERIMENTAL_SYCL "c0d1fb10-2ece-420e-9d29-7d7f2b300f25")
|
|
enable_language(CXX SYCL)
|
|
|
|
set(cxx_constexpr_standard "")
|
|
set(sycl_constexpr_standard "")
|
|
foreach(level IN ITEMS 11 14 17 20 23 26)
|
|
set(level_features "${CMAKE_CXX${level}_COMPILE_FEATURES}")
|
|
list(FIND level_features cxx_constexpr feature_index)
|
|
if(feature_index GREATER_EQUAL 0 AND NOT cxx_constexpr_standard)
|
|
set(cxx_constexpr_standard "${level}")
|
|
endif()
|
|
|
|
set(level_features "${CMAKE_SYCL${level}_COMPILE_FEATURES}")
|
|
list(FIND level_features cxx_constexpr feature_index)
|
|
if(feature_index GREATER_EQUAL 0 AND NOT sycl_constexpr_standard)
|
|
set(sycl_constexpr_standard "${level}")
|
|
endif()
|
|
endforeach()
|
|
if(NOT cxx_constexpr_standard OR NOT sycl_constexpr_standard)
|
|
message(FATAL_ERROR "cxx_constexpr is not available for both CXX and SYCL")
|
|
endif()
|
|
|
|
add_library(cxx_feature STATIC feature.cxx)
|
|
set_property(TARGET cxx_feature PROPERTY CXX_STANDARD 98)
|
|
target_compile_features(cxx_feature PRIVATE cxx_constexpr)
|
|
get_property(cxx_standard TARGET cxx_feature PROPERTY CXX_STANDARD)
|
|
get_property(cxx_sycl_standard TARGET cxx_feature PROPERTY SYCL_CXX_STANDARD)
|
|
if(NOT cxx_standard STREQUAL cxx_constexpr_standard)
|
|
message(FATAL_ERROR
|
|
"CXX target selected CXX_STANDARD '${cxx_standard}', expected "
|
|
"'${cxx_constexpr_standard}'")
|
|
endif()
|
|
if(cxx_sycl_standard)
|
|
message(FATAL_ERROR
|
|
"CXX target unexpectedly selected SYCL_CXX_STANDARD '${cxx_sycl_standard}'")
|
|
endif()
|
|
|
|
add_library(sycl_feature STATIC feature.sycl)
|
|
set_property(TARGET sycl_feature PROPERTY SYCL_CXX_STANDARD 98)
|
|
target_compile_features(sycl_feature PRIVATE cxx_constexpr)
|
|
get_property(sycl_standard TARGET sycl_feature PROPERTY SYCL_CXX_STANDARD)
|
|
get_property(sycl_cxx_standard TARGET sycl_feature PROPERTY CXX_STANDARD)
|
|
if(NOT sycl_standard STREQUAL sycl_constexpr_standard)
|
|
message(FATAL_ERROR
|
|
"SYCL target selected SYCL_CXX_STANDARD '${sycl_standard}', expected "
|
|
"'${sycl_constexpr_standard}'")
|
|
endif()
|
|
if(sycl_cxx_standard)
|
|
message(FATAL_ERROR
|
|
"SYCL target unexpectedly selected CXX_STANDARD '${sycl_cxx_standard}'")
|
|
endif()
|
|
|
|
add_library(mixed_file_set_feature STATIC)
|
|
target_sources(mixed_file_set_feature PRIVATE
|
|
FILE_SET cxx_sources TYPE SOURCES FILES feature.cxx
|
|
FILE_SET sycl_sources TYPE SYCL FILES feature.sycl)
|
|
set_property(TARGET mixed_file_set_feature PROPERTY CXX_STANDARD 98)
|
|
set_property(TARGET mixed_file_set_feature PROPERTY SYCL_CXX_STANDARD 98)
|
|
target_compile_features(mixed_file_set_feature PRIVATE cxx_constexpr)
|
|
get_property(mixed_cxx_standard TARGET mixed_file_set_feature
|
|
PROPERTY CXX_STANDARD)
|
|
get_property(mixed_sycl_standard TARGET mixed_file_set_feature
|
|
PROPERTY SYCL_CXX_STANDARD)
|
|
if(NOT mixed_cxx_standard STREQUAL cxx_constexpr_standard)
|
|
message(FATAL_ERROR
|
|
"Mixed file-set target selected CXX_STANDARD '${mixed_cxx_standard}', "
|
|
"expected '${cxx_constexpr_standard}'")
|
|
endif()
|
|
if(NOT mixed_sycl_standard STREQUAL "98")
|
|
message(FATAL_ERROR
|
|
"Mixed file-set target changed SYCL_CXX_STANDARD to '${mixed_sycl_standard}'")
|
|
endif()
|
|
|
|
add_library(sycl_headers_feature STATIC feature.cxx)
|
|
target_sources(sycl_headers_feature PRIVATE
|
|
FILE_SET SYCL_HEADERS FILES sycl_header.h)
|
|
set_property(TARGET sycl_headers_feature PROPERTY CXX_STANDARD 98)
|
|
set_property(TARGET sycl_headers_feature PROPERTY SYCL_CXX_STANDARD 98)
|
|
target_compile_features(sycl_headers_feature PRIVATE cxx_constexpr)
|
|
get_property(headers_cxx_standard TARGET sycl_headers_feature
|
|
PROPERTY CXX_STANDARD)
|
|
get_property(headers_sycl_standard TARGET sycl_headers_feature
|
|
PROPERTY SYCL_CXX_STANDARD)
|
|
if(NOT headers_cxx_standard STREQUAL "98")
|
|
message(FATAL_ERROR
|
|
"SYCL headers target changed CXX_STANDARD to '${headers_cxx_standard}'")
|
|
endif()
|
|
if(NOT headers_sycl_standard STREQUAL sycl_constexpr_standard)
|
|
message(FATAL_ERROR
|
|
"SYCL headers target selected SYCL_CXX_STANDARD '${headers_sycl_standard}', "
|
|
"expected '${sycl_constexpr_standard}'")
|
|
endif()
|