-
Notifications
You must be signed in to change notification settings - Fork 249
/
CMakeLists.txt
220 lines (190 loc) · 8.22 KB
/
CMakeLists.txt
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
############################################################################
# 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(XSIMD_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")
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()