diff --git a/CMakeLists.txt b/CMakeLists.txt index c725399b..a0668401 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,63 +25,6 @@ option(MDSPAN_USE_SYSTEM_GTEST "Use system-installed GoogleTest library for test option(MDSPAN_USE_SYSTEM_BENCHMARK "Use system-installed Google Benchmark library for benchmarks." On) option(MDSPAN_INSTALL_STDMODE_HEADERS "Whether to install headers to emulate standard library headers and namespaces" Off) -# Option to override which C++ standard to use -set(MDSPAN_CXX_STANDARD DETECT CACHE STRING "Override the default CXX_STANDARD to compile with.") -set_property(CACHE MDSPAN_CXX_STANDARD PROPERTY STRINGS DETECT 14 17 20 23) - -option(MDSPAN_ENABLE_CONCEPTS "Try to enable concepts support by giving extra flags." On) - -################################################################################ - -# Decide on the standard to use -if(MDSPAN_CXX_STANDARD STREQUAL "17") - if("cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES) - message(STATUS "Using C++17 standard") - set(CMAKE_CXX_STANDARD 17) - else() - message(FATAL_ERROR "Requested MDSPAN_CXX_STANDARD \"17\" not supported by provided C++ compiler") - endif() -elseif(MDSPAN_CXX_STANDARD STREQUAL "14") - if("cxx_std_14" IN_LIST CMAKE_CXX_COMPILE_FEATURES) - message(STATUS "Using C++14 standard") - set(CMAKE_CXX_STANDARD 14) - else() - message(FATAL_ERROR "Requested MDSPAN_CXX_STANDARD \"14\" not supported by provided C++ compiler") - endif() -elseif(MDSPAN_CXX_STANDARD STREQUAL "20") - if("cxx_std_20" IN_LIST CMAKE_CXX_COMPILE_FEATURES) - message(STATUS "Using C++20 standard") - set(CMAKE_CXX_STANDARD 20) - else() - message(FATAL_ERROR "Requested MDSPAN_CXX_STANDARD \"20\" not supported by provided C++ compiler") - endif() -elseif(MDSPAN_CXX_STANDARD STREQUAL "23") - if("cxx_std_23" IN_LIST CMAKE_CXX_COMPILE_FEATURES) - message(STATUS "Using C++23 standard") - set(CMAKE_CXX_STANDARD 23) - else() - message(FATAL_ERROR "Requested MDSPAN_CXX_STANDARD \"23\" not supported by provided C++ compiler") - endif() -else() - if("cxx_std_23" IN_LIST CMAKE_CXX_COMPILE_FEATURES) - set(CMAKE_CXX_STANDARD 23) - message(STATUS "Detected support for C++23 standard") - elseif("cxx_std_20" IN_LIST CMAKE_CXX_COMPILE_FEATURES) - set(CMAKE_CXX_STANDARD 20) - message(STATUS "Detected support for C++20 standard") - elseif("cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES) - set(CMAKE_CXX_STANDARD 17) - message(STATUS "Detected support for C++17 standard") - elseif("cxx_std_14" IN_LIST CMAKE_CXX_COMPILE_FEATURES) - set(CMAKE_CXX_STANDARD 14) - message(STATUS "Detected support for C++14 standard") - else() - message(FATAL_ERROR "Cannot detect CXX_STANDARD of C++14 or newer.") - endif() -endif() - -################################################################################ - if(MDSPAN_ENABLE_CUDA) include(CheckLanguage) check_language(CUDA) @@ -119,6 +62,9 @@ endif() add_library(mdspan INTERFACE) add_library(std::mdspan ALIAS mdspan) +# Require a minimum of C++14 +target_compile_features(mdspan INTERFACE cxx_std_14) + if(MDSPAN_ENABLE_SYCL) target_compile_options(mdspan INTERFACE "-fsycl") target_link_options(mdspan INTERFACE "-fsycl") @@ -181,7 +127,7 @@ if(MDSPAN_ENABLE_EXAMPLES) endif() if(MDSPAN_ENABLE_BENCHMARKS) - if(NOT MDSPAN_CXX_STANDARD STREQUAL "14" AND NOT MDSPAN_CXX_STANDARD STREQUAL "23") + if("cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES) add_subdirectory(benchmarks) else() MESSAGE(FATAL_ERROR "Benchmarks are not available in C++14 or C++23 mode. Turn MDSPAN_ENABLE_BENCHMARKS OFF or use C++17 or C++20.") diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index e2c477c1..53a484ac 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -7,6 +7,7 @@ function(mdspan_add_benchmark EXENAME) ) # Set flag to build with parenthesis enabled target_compile_definitions(${EXENAME} PRIVATE MDSPAN_USE_PAREN_OPERATOR=1) + target_compile_features(${EXENAME} PRIVATE cxx_std_17) endfunction() if(MDSPAN_USE_SYSTEM_BENCHMARK) @@ -81,6 +82,7 @@ function(mdspan_add_openmp_benchmark EXENAME) $ ) target_compile_definitions(${EXENAME} PRIVATE MDSPAN_USE_PAREN_OPERATOR=1) + target_compile_features(${EXENAME} PRIVATE cxx_std_17) else() message(WARNING "Not adding target ${EXENAME} because OpenMP was not found") endif() diff --git a/compilation_tests/CMakeLists.txt b/compilation_tests/CMakeLists.txt index c50e15e3..ad4041bf 100644 --- a/compilation_tests/CMakeLists.txt +++ b/compilation_tests/CMakeLists.txt @@ -21,8 +21,9 @@ if(NOT MDSPAN_ENABLE_CUDA) add_compilation_test(ctest_compressed_pair_layout) endif() add_compilation_test(ctest_constexpr_dereference) -if(NOT CMAKE_CXX_STANDARD STREQUAL "14") -add_compilation_test(ctest_constexpr_submdspan) +if("cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES) + add_compilation_test(ctest_constexpr_submdspan) + target_compile_features(ctest_constexpr_submdspan PRIVATE cxx_std_17) endif() add_compilation_test(ctest_constexpr_layouts) add_compilation_test(ctest_namespace_std) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b038ebcc..30e5b6f1 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -8,7 +8,7 @@ endif() function(mdspan_add_test name) set(options ENABLE_PRECONDITIONS) - set(one_value SOURCE) + set(one_value SOURCE COMPILE_FEATURES) set(multi_value) cmake_parse_arguments(ARGUMENT "${options}" "${one_value}" "${multi_value}" ${ARGN}) @@ -27,6 +27,9 @@ function(mdspan_add_test name) PUBLIC MDSPAN_IMPL_CHECK_PRECONDITION=$ ) + if(DEFINED ARGUMENT_COMPILE_FEATURES) + target_compile_features(${name} PUBLIC ${ARGUMENT_COMPILE_FEATURES}) + endif() endfunction() if(MDSPAN_USE_SYSTEM_GTEST) @@ -88,11 +91,15 @@ mdspan_add_test(test_element_access) mdspan_add_test(test_exhaustive_layouts) mdspan_add_test(test_layout_ctors) mdspan_add_test(test_layout_stride) -if(NOT CMAKE_CXX_STANDARD STREQUAL "14") +if("cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES) mdspan_add_test(test_submdspan) + target_compile_features(test_submdspan PRIVATE cxx_std_17) mdspan_add_test(test_submdspan_static_slice) + target_compile_features(test_submdspan_static_slice PRIVATE cxx_std_17) mdspan_add_test(test_layout_padded_left ENABLE_PRECONDITIONS) + target_compile_features(test_layout_padded_left PRIVATE cxx_std_17) mdspan_add_test(test_layout_padded_right ENABLE_PRECONDITIONS) + target_compile_features(test_layout_padded_right PRIVATE cxx_std_17) endif() # both of those don't work yet since its using vector if(NOT MDSPAN_ENABLE_CUDA AND NOT MDSPAN_ENABLE_HIP) @@ -100,7 +107,7 @@ mdspan_add_test(test_mdarray_ctors) mdspan_add_test(test_mdarray_to_mdspan) endif() -if(CMAKE_CXX_STANDARD GREATER_EQUAL 20) +if("cxx_std_20" IN_LIST CMAKE_CXX_COMPILE_FEATURES) if((CMAKE_CXX_COMPILER_ID STREQUAL Clang) OR ((CMAKE_CXX_COMPILER_ID STREQUAL GNU) AND (CMAKE_CXX_COMPILER_VERSION GREATER_EQUAL 12.0.0))) add_subdirectory(libcxx-backports) endif() diff --git a/tests/libcxx-backports/default_accessor/CMakeLists.txt b/tests/libcxx-backports/default_accessor/CMakeLists.txt index 44a40f07..6877c6b0 100644 --- a/tests/libcxx-backports/default_accessor/CMakeLists.txt +++ b/tests/libcxx-backports/default_accessor/CMakeLists.txt @@ -1,6 +1,6 @@ -mdspan_add_test(default_accessor.access.pass) -mdspan_add_test(default_accessor.ctor.conversion.pass) -mdspan_add_test(default_accessor.ctor.default.pass) +mdspan_add_test(default_accessor.access.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(default_accessor.ctor.conversion.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(default_accessor.ctor.default.pass COMPILE_FEATURES cxx_std_20) #mdspan_add_test(default_accessor.element_type.verify) -mdspan_add_test(default_accessor.offset.pass) -mdspan_add_test(default_accessor.types.pass) +mdspan_add_test(default_accessor.offset.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(default_accessor.types.pass COMPILE_FEATURES cxx_std_20) diff --git a/tests/libcxx-backports/extents/CMakeLists.txt b/tests/libcxx-backports/extents/CMakeLists.txt index d414c85f..7aab114b 100644 --- a/tests/libcxx-backports/extents/CMakeLists.txt +++ b/tests/libcxx-backports/extents/CMakeLists.txt @@ -1,10 +1,10 @@ -mdspan_add_test(comparison.pass) -mdspan_add_test(conversion.pass) -mdspan_add_test(ctad.pass) -mdspan_add_test(ctor_default.pass) -mdspan_add_test(ctor_from_array.pass) -mdspan_add_test(ctor_from_integral.pass) -mdspan_add_test(ctor_from_span.pass) -mdspan_add_test(dextents.pass) -mdspan_add_test(obs_static.pass) -mdspan_add_test(types.pass) +mdspan_add_test(comparison.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(conversion.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(ctad.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(ctor_default.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(ctor_from_array.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(ctor_from_integral.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(ctor_from_span.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(dextents.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(obs_static.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(types.pass COMPILE_FEATURES cxx_std_20) diff --git a/tests/libcxx-backports/layout_left/CMakeLists.txt b/tests/libcxx-backports/layout_left/CMakeLists.txt index d663ac96..bca1a048 100644 --- a/tests/libcxx-backports/layout_left/CMakeLists.txt +++ b/tests/libcxx-backports/layout_left/CMakeLists.txt @@ -1,12 +1,12 @@ -mdspan_add_test(layout_left.comparison.pass) -mdspan_add_test(layout_left.ctor.default.pass) -mdspan_add_test(layout_left.ctor.extents.pass) -mdspan_add_test(layout_left.ctor.layout_right.pass) -mdspan_add_test(layout_left.ctor.layout_stride.pass) -mdspan_add_test(layout_left.ctor.mapping.pass) +mdspan_add_test(layout_left.comparison.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_left.ctor.default.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_left.ctor.extents.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_left.ctor.layout_right.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_left.ctor.layout_stride.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_left.ctor.mapping.pass COMPILE_FEATURES cxx_std_20) #mdspan_add_test(layout_left.extents.verify) -mdspan_add_test(layout_left.index_operator.pass) -mdspan_add_test(layout_left.properties.pass) -mdspan_add_test(layout_left.required_span_size.pass) -mdspan_add_test(layout_left.static_requirements.pass) -mdspan_add_test(layout_left.stride.pass) +mdspan_add_test(layout_left.index_operator.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_left.properties.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_left.required_span_size.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_left.static_requirements.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_left.stride.pass COMPILE_FEATURES cxx_std_20) diff --git a/tests/libcxx-backports/layout_right/CMakeLists.txt b/tests/libcxx-backports/layout_right/CMakeLists.txt index 7a37c6a4..c75e5eba 100644 --- a/tests/libcxx-backports/layout_right/CMakeLists.txt +++ b/tests/libcxx-backports/layout_right/CMakeLists.txt @@ -1,12 +1,12 @@ -mdspan_add_test(layout_right.comparison.pass) -mdspan_add_test(layout_right.ctor.default.pass) -mdspan_add_test(layout_right.ctor.extents.pass) -mdspan_add_test(layout_right.ctor.layout_left.pass) -mdspan_add_test(layout_right.ctor.layout_stride.pass) -mdspan_add_test(layout_right.ctor.mapping.pass) +mdspan_add_test(layout_right.comparison.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_right.ctor.default.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_right.ctor.extents.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_right.ctor.layout_left.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_right.ctor.layout_stride.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_right.ctor.mapping.pass COMPILE_FEATURES cxx_std_20) #mdspan_add_test(layout_right.extents.verify) -mdspan_add_test(layout_right.index_operator.pass) -mdspan_add_test(layout_right.properties.pass) -mdspan_add_test(layout_right.required_span_size.pass) -mdspan_add_test(layout_right.static_requirements.pass) -mdspan_add_test(layout_right.stride.pass) +mdspan_add_test(layout_right.index_operator.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_right.properties.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_right.required_span_size.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_right.static_requirements.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_right.stride.pass COMPILE_FEATURES cxx_std_20) diff --git a/tests/libcxx-backports/layout_stride/CMakeLists.txt b/tests/libcxx-backports/layout_stride/CMakeLists.txt index 80b52a18..03f25712 100644 --- a/tests/libcxx-backports/layout_stride/CMakeLists.txt +++ b/tests/libcxx-backports/layout_stride/CMakeLists.txt @@ -1,13 +1,13 @@ -mdspan_add_test(layout_stride.comparison.pass) -mdspan_add_test(layout_stride.ctor.default.pass) -mdspan_add_test(layout_stride.ctor.extents_array.pass) -mdspan_add_test(layout_stride.ctor.extents_span.pass) -mdspan_add_test(layout_stride.ctor.strided_mapping.pass) -mdspan_add_test(layout_stride.deduction.pass) +mdspan_add_test(layout_stride.comparison.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_stride.ctor.default.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_stride.ctor.extents_array.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_stride.ctor.extents_span.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_stride.ctor.strided_mapping.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_stride.deduction.pass COMPILE_FEATURES cxx_std_20) #mdspan_add_test(layout_stride.extents.verify) //FIXME -mdspan_add_test(layout_stride.index_operator.pass) -mdspan_add_test(layout_stride.is_exhaustive_corner_case.pass) -mdspan_add_test(layout_stride.properties.pass) -mdspan_add_test(layout_stride.required_span_size.pass) -mdspan_add_test(layout_stride.static_requirements.pass) -mdspan_add_test(layout_stride.stride.pass) +mdspan_add_test(layout_stride.index_operator.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_stride.is_exhaustive_corner_case.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_stride.properties.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_stride.required_span_size.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_stride.static_requirements.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(layout_stride.stride.pass COMPILE_FEATURES cxx_std_20) diff --git a/tests/libcxx-backports/mdspan/CMakeLists.txt b/tests/libcxx-backports/mdspan/CMakeLists.txt index 04ba79f6..c493ab86 100644 --- a/tests/libcxx-backports/mdspan/CMakeLists.txt +++ b/tests/libcxx-backports/mdspan/CMakeLists.txt @@ -1,21 +1,21 @@ -mdspan_add_test(mdspan.assign.pass) -mdspan_add_test(mdspan.conversion.pass) +mdspan_add_test(mdspan.assign.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.conversion.pass COMPILE_FEATURES cxx_std_20) #mdspan_add_test(mdspan.conversion.verify) -mdspan_add_test(mdspan.ctor.copy.pass) -mdspan_add_test(mdspan.ctor.default.pass) -mdspan_add_test(mdspan.ctor.dh_array.pass) -mdspan_add_test(mdspan.ctor.dh_extents.pass) -mdspan_add_test(mdspan.ctor.dh_integers.pass) -mdspan_add_test(mdspan.ctor.dh_map.pass) -mdspan_add_test(mdspan.ctor.dh_map_acc.pass) -mdspan_add_test(mdspan.ctor.dh_span.pass) -mdspan_add_test(mdspan.ctor.move.pass) -mdspan_add_test(mdspan.deduction.pass) +mdspan_add_test(mdspan.ctor.copy.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.ctor.default.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.ctor.dh_array.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.ctor.dh_extents.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.ctor.dh_integers.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.ctor.dh_map.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.ctor.dh_map_acc.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.ctor.dh_span.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.ctor.move.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.deduction.pass COMPILE_FEATURES cxx_std_20) #mdspan_add_test(mdspan.element_type.verify) #mdspan_add_test(mdspan.extents.verify) -mdspan_add_test(mdspan.index_operator.pass) +mdspan_add_test(mdspan.index_operator.pass COMPILE_FEATURES cxx_std_20) #mdspan_add_test(mdspan.mapping.verify) -mdspan_add_test(mdspan.move.pass) -mdspan_add_test(mdspan.properties.pass) -mdspan_add_test(mdspan.swap.pass) -mdspan_add_test(mdspan.types.pass) +mdspan_add_test(mdspan.move.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.properties.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.swap.pass COMPILE_FEATURES cxx_std_20) +mdspan_add_test(mdspan.types.pass COMPILE_FEATURES cxx_std_20)