1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
|
############################################################################
# Copyright (c) Johan Mabille, Sylvain Corlay, Wolf Vollprecht and #
# Martin Renou #
# Copyright (c) QuantStack #
# Copyright (c) Serge Guelton #
# #
# Distributed under the terms of the BSD 3-Clause License. #
# #
# The full license is in the file LICENSE, distributed with this software. #
############################################################################
cmake_minimum_required(VERSION 3.8)
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
project(xsimd-test)
enable_testing()
find_package(xsimd REQUIRED CONFIG)
set(XSIMD_INCLUDE_DIR ${xsimd_INCLUDE_DIRS})
endif ()
if(NOT CMAKE_BUILD_TYPE)
message(STATUS "Setting tests build type to Release")
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
else()
message(STATUS "Tests build type is ${CMAKE_BUILD_TYPE}")
endif()
include(CheckCXXCompilerFlag)
string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE)
OPTION(XSIMD_ENABLE_WERROR "Turn on -Werror" OFF)
################
# ARM SETTINGS #
################
OPTION(CROSS_COMPILE_ARM "cross compile for ARM targets" OFF)
# Note: to compile on ARM (or cross compile), you may need to add the following:
# -DTARGET_ARCH="armv8-a -mfpu=neon -mfloat-abi=softfp -target arm-linux-gnueabi"
set(TARGET_ARCH "native" CACHE STRING "Target architecture arguments")
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Intel")
if (NOT WIN32 AND NOT ANDROID)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunused-parameter -Wextra -Wreorder")
# Users may override the c++ standard:
if(NOT DEFINED CMAKE_CXX_STANDARD OR "${CMAKE_CXX_STANDARD}" STREQUAL "")
if (ENABLE_XTL_COMPLEX)
CHECK_CXX_COMPILER_FLAG("-std=c++14" HAS_CPP14_FLAG)
if (NOT HAS_CPP14_FLAG)
message(FATAL_ERROR "Unsupported compiler -- xsimd requires C++14 support when xtl complex support is enabled")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
else()
CHECK_CXX_COMPILER_FLAG("-std=c++11" HAS_CPP11_FLAG)
if (NOT HAS_CPP11_FLAG)
message(FATAL_ERROR "Unsupported compiler -- xsimd requires C++11 support!")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()
endif()
endif()
if (NOT CROSS_COMPILE_ARM)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fPIC")
endif()
endif()
if (ANDROID)
# Nothing to do here, we assume the cmake Android NDK toolchain sets the
# correct options for arm and neon.
elseif (CROSS_COMPILE_ARM)
# We're cross-compiling with clang++ on Azure Pipelines, this is all pretty specific and just for testing
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS)
set(CMAKE_THREAD_LIBS_INIT)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER_TARGET arm-linux-gnueabi)
set(CMAKE_CXX_COMPILER_TARGET arm-linux-gnueabi)
set(ARM_ARCH_DIRECTORY "arm-linux-gnueabi" CACHE STRING "ARM arch header dir")
set(ARM_GCC_VER "4.7.3" CACHE STRING "ARM GCC header dir")
include_directories(/usr/${ARM_ARCH_DIRECTORY}/include/c++/${ARM_GCC_VER}/${ARM_ARCH_DIRECTORY}/)
include_directories(/usr/${ARM_ARCH_DIRECTORY}/include/c++/${ARM_GCC_VER}/)
include_directories(/usr/${ARM_ARCH_DIRECTORY}/include/)
if(NOT CMAKE_CXX_FLAGS MATCHES "-march")
message(STATUS "SETTING ARCH TO ${TARGET_ARCH}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=${TARGET_ARCH}")
endif()
if(ARM_ARCH_DIRECTORY MATCHES "arm-linux-gnueabi")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon -mfloat-abi=softfp -target arm-linux-gnueabi")
else ()
# delegating to gcc here
endif()
message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
message(STATUS "CMAKE_CXX_LINK_EXECUTABLE: ${CMAKE_CXX_LINK_EXECUTABLE}")
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^ppc64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=${TARGET_ARCH} -mtune=${TARGET_ARCH}")
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "riscv64")
# Nothing specific
elseif(NOT WIN32 AND NOT EMSCRIPTEN)
if(NOT CMAKE_CXX_FLAGS MATCHES "-march" AND NOT CMAKE_CXX_FLAGS MATCHES "-arch" AND NOT CMAKE_OSX_ARCHITECTURES)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=${TARGET_ARCH}")
endif()
endif()
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /MP /bigobj")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244 /wd4267 /wd4005 /wd4146 /wd4800")
set(CMAKE_EXE_LINKER_FLAGS /MANIFEST:NO)
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES Clang AND MSVC AND WIN32) # We are using clang-cl
add_compile_options(/EHsc /bigobj)
set(CMAKE_EXE_LINKER_FLAGS /MANIFEST:NO)
endif()
set(XSIMD_TESTS
main.cpp
test_api.cpp
test_arch.cpp
test_basic_math.cpp
test_batch.cpp
test_batch_bool.cpp
test_batch_cast.cpp
test_batch_complex.cpp
test_batch_float.cpp
test_batch_int.cpp
test_bitwise_cast.cpp
test_batch_constant.cpp
test_batch_manip.cpp
test_complex_exponential.cpp
test_complex_hyperbolic.cpp
test_complex_power.cpp
test_complex_trigonometric.cpp
test_conversion.cpp
test_custom_default_arch.cpp
test_error_gamma.cpp
test_explicit_batch_instantiation.cpp
test_exponential.cpp
test_extract_pair.cpp
test_fp_manipulation.cpp
test_hyperbolic.cpp
test_load_store.cpp
test_memory.cpp
test_poly_evaluation.cpp
test_power.cpp
test_rounding.cpp
test_select.cpp
test_shuffle.cpp
test_sum.cpp
test_traits.cpp
test_trigonometric.cpp
test_xsimd_api.cpp
test_utils.hpp
)
if(NOT MSVC)
list(APPEND XSIMD_TESTS test_gnu_source.cpp)
endif()
add_executable(test_xsimd ${XSIMD_TESTS} ${XSIMD_HEADERS})
target_include_directories(test_xsimd PRIVATE ${XSIMD_INCLUDE_DIR})
option(DOWNLOAD_DOCTEST OFF)
find_package(doctest QUIET)
if (doctest_FOUND)
set(DOCTEST_MINIMAL_VERSION 2.4.9)
if (doctest_VERSION VERSION_LESS DOCTEST_MINIMAL_VERSION)
message(FATAL_ERROR "Requires doctest >= ${DOCTEST_MINIMAL_VERSION}")
endif()
target_link_libraries(test_xsimd PRIVATE doctest::doctest)
elseif(DOWNLOAD_DOCTEST)
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/doctest")
file(DOWNLOAD
"https://github.com/doctest/doctest/releases/download/v2.4.9/doctest.h"
"${CMAKE_CURRENT_BINARY_DIR}/doctest/doctest.h"
STATUS DOWNLOAD_DOCTEST_STATUS)
list(GET DOWNLOAD_DOCTEST_STATUS 0 DOWNLOAD_DOCTEST_STATUS_CODE)
list(GET DOWNLOAD_DOCTEST_STATUS 1 DOWNLOAD_DOCTEST_ERROR_MESSAGE)
if(${DOWNLOAD_DOCTEST_STATUS_CODE} EQUAL 0)
message(STATUS "Successfully downloaded doctest.h")
else()
message(FATAL_ERROR "Error occurred during download of doctest: ${DOWNLOAD_DOCTEST_ERROR_MESSAGE}")
endif()
target_include_directories(test_xsimd PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
else()
message(FATAL_ERROR "
Cannot find required doctest component.
Please either set CMAKE_PREFIX_PATH to the location of doctestConfig.cmake,
or set DOWNLOAD_DOCTEST=ON")
endif()
if(ENABLE_XTL_COMPLEX)
add_compile_definitions(XSIMD_ENABLE_XTL_COMPLEX=1)
target_include_directories(test_xsimd PRIVATE ${xtl_INCLUDE_DIRS})
endif()
add_test(NAME test_xsimd COMMAND test_xsimd)
if (CROSS_COMPILE_ARM)
add_custom_target(xtest COMMAND qemu-arm -L /usr/arm-linux-gnueabi/ test_xsimd DEPENDS test_xsimd)
else()
add_custom_target(xtest COMMAND test_xsimd DEPENDS test_xsimd)
endif()
if (XSIMD_ENABLE_WERROR)
target_compile_options(test_xsimd PRIVATE -Werror -Wall -DXSIMD_SKIP_ON_WERROR)
endif()
add_subdirectory(doc)
add_subdirectory(architectures)
if(EMSCRIPTEN)
set_target_properties(test_xsimd PROPERTIES LINK_FLAGS "-s MODULARIZE=1 -s EXPORT_NAME=test_xsimd_wasm -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -lembind")
target_compile_options(test_xsimd
PUBLIC --std=c++14
PUBLIC "SHELL: -msimd128"
PUBLIC "SHELL: -msse2"
)
endif()
|