Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 4 additions & 58 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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.")
Expand Down
2 changes: 2 additions & 0 deletions benchmarks/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -81,6 +82,7 @@ function(mdspan_add_openmp_benchmark EXENAME)
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/benchmarks>
)
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()
Expand Down
5 changes: 3 additions & 2 deletions compilation_tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
13 changes: 10 additions & 3 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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})

Expand All @@ -27,6 +27,9 @@ function(mdspan_add_test name)
PUBLIC
MDSPAN_IMPL_CHECK_PRECONDITION=$<BOOL:${ARGUMENT_ENABLE_PRECONDITIONS}>
)
if(DEFINED ARGUMENT_COMPILE_FEATURES)
target_compile_features(${name} PUBLIC ${ARGUMENT_COMPILE_FEATURES})
endif()
endfunction()

if(MDSPAN_USE_SYSTEM_GTEST)
Expand Down Expand Up @@ -88,19 +91,23 @@ 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)
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()
Expand Down
10 changes: 5 additions & 5 deletions tests/libcxx-backports/default_accessor/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
20 changes: 10 additions & 10 deletions tests/libcxx-backports/extents/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
22 changes: 11 additions & 11 deletions tests/libcxx-backports/layout_left/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
22 changes: 11 additions & 11 deletions tests/libcxx-backports/layout_right/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
24 changes: 12 additions & 12 deletions tests/libcxx-backports/layout_stride/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
34 changes: 17 additions & 17 deletions tests/libcxx-backports/mdspan/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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)
Loading