1 cmake_minimum_required(VERSION 3.0.2) 2 3 project(GSLTests CXX) 4 5 # will make visual studio generated project group files 6 set_property(GLOBAL PROPERTY USE_FOLDERS ON) 7 8 list(APPEND CATCH_CMAKE_ARGS 9 "-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/external" 10 "-DNO_SELFTEST=true" 11 ) 12 13 if(GIT_FOUND) 14 # add catch 15 ExternalProject_Add( 16 catch 17 PREFIX ${CMAKE_BINARY_DIR}/catch 18 GIT_REPOSITORY https://github.com/catchorg/Catch2.git 19 GIT_TAG v2.0.1 20 CMAKE_ARGS ${CATCH_CMAKE_ARGS} 21 LOG_DOWNLOAD 1 22 UPDATE_DISCONNECTED 1 23 ) 24 else() 25 # assume catch is installed in a system directory 26 add_custom_target(catch) 27 endif() 28 29 if (MSVC AND (GSL_CXX_STANDARD EQUAL 17)) 30 set(GSL_CPLUSPLUS_OPT -Zc:__cplusplus -permissive-) 31 endif() 32 33 # this interface adds compile options to how the tests are run 34 # please try to keep entries ordered =) 35 add_library(gsl_tests_config INTERFACE) 36 if(MSVC) # MSVC or simulating MSVC 37 target_compile_options(gsl_tests_config INTERFACE 38 ${GSL_CPLUSPLUS_OPT} 39 /EHsc 40 /W4 41 /WX 42 $<$<CXX_COMPILER_ID:Clang>: 43 -Weverything 44 -Wno-c++98-compat 45 -Wno-c++98-compat-pedantic 46 -Wno-missing-braces 47 -Wno-missing-prototypes 48 -Wno-unknown-attributes 49 $<$<EQUAL:${GSL_CXX_STANDARD},14>:-Wno-unused-member-function> 50 > 51 ) 52 else() 53 target_compile_options(gsl_tests_config INTERFACE 54 -fno-strict-aliasing 55 -Wall 56 -Wcast-align 57 -Wconversion 58 -Wctor-dtor-privacy 59 -Werror 60 -Wextra 61 -Wpedantic 62 -Wshadow 63 -Wsign-conversion 64 $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>: 65 -Weverything 66 -Wno-c++98-compat 67 -Wno-c++98-compat-pedantic 68 -Wno-missing-braces 69 -Wno-missing-prototypes 70 -Wno-padded 71 -Wno-unknown-attributes 72 $<$<EQUAL:${GSL_CXX_STANDARD},14>:-Wno-unused-member-function> 73 -Wno-weak-vtables 74 > 75 $<$<CXX_COMPILER_ID:Clang>: 76 $<$<CXX_COMPILER_VERSION:5.0.2>:-Wno-undefined-func-template> 77 > 78 ) 79 endif(MSVC) 80 81 # for tests to find the catch header 82 target_include_directories(gsl_tests_config INTERFACE 83 ${CMAKE_BINARY_DIR}/external/include 84 ) 85 86 # set definitions for tests 87 target_compile_definitions(gsl_tests_config INTERFACE 88 GSL_THROW_ON_CONTRACT_VIOLATION 89 ) 90 91 # create the main executable for each test. this reduces the compile time 92 # of each test by pre-compiling catch. 93 add_library(test_catch STATIC test.cpp) 94 target_link_libraries(test_catch 95 GSL 96 gsl_tests_config 97 ) 98 add_dependencies(test_catch catch) 99 set_property(TARGET test_catch PROPERTY FOLDER "GSL_tests") 100 101 function(add_gsl_test name) 102 add_executable(${name} ${name}.cpp) 103 target_link_libraries(${name} 104 GSL 105 test_catch 106 gsl_tests_config 107 ) 108 add_dependencies(${name} catch) 109 add_test( 110 ${name} 111 ${name} 112 ) 113 # group all tests under GSL_tests 114 set_property(TARGET ${name} PROPERTY FOLDER "GSL_tests") 115 endfunction() 116 117 add_gsl_test(span_tests) 118 add_gsl_test(multi_span_tests) 119 add_gsl_test(strided_span_tests) 120 add_gsl_test(string_span_tests) 121 add_gsl_test(at_tests) 122 add_gsl_test(bounds_tests) 123 add_gsl_test(notnull_tests) 124 add_gsl_test(assertion_tests) 125 add_gsl_test(utils_tests) 126 add_gsl_test(owner_tests) 127 add_gsl_test(byte_tests) 128 add_gsl_test(algorithm_tests) 129 add_gsl_test(strict_notnull_tests) 130 131 132 # No exception tests 133 134 foreach(flag_var 135 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE 136 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) 137 STRING (REGEX REPLACE "/EHsc" "" ${flag_var} "${${flag_var}}") 138 endforeach(flag_var) 139 140 # this interface adds compile options to how the tests are run 141 # please try to keep entries ordered =) 142 add_library(gsl_tests_config_noexcept INTERFACE) 143 if(MSVC) # MSVC or simulating MSVC 144 target_compile_definitions(gsl_tests_config_noexcept INTERFACE 145 _HAS_EXCEPTIONS=0 146 ) 147 target_compile_options(gsl_tests_config_noexcept INTERFACE 148 ${GSL_CPLUSPLUS_OPT} 149 /W4 150 /WX 151 $<$<CXX_COMPILER_ID:MSVC>: 152 /wd4577 153 /wd4702 154 > 155 $<$<CXX_COMPILER_ID:Clang>: 156 -Weverything 157 -Wno-c++98-compat 158 -Wno-c++98-compat-pedantic 159 -Wno-missing-prototypes 160 -Wno-unknown-attributes 161 > 162 ) 163 else() 164 target_compile_options(gsl_tests_config_noexcept INTERFACE 165 -fno-exceptions 166 -fno-strict-aliasing 167 -Wall 168 -Wcast-align 169 -Wconversion 170 -Wctor-dtor-privacy 171 -Werror 172 -Wextra 173 -Wpedantic 174 -Wshadow 175 -Wsign-conversion 176 $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>: 177 -Weverything 178 -Wno-c++98-compat 179 -Wno-c++98-compat-pedantic 180 -Wno-missing-prototypes 181 -Wno-unknown-attributes 182 -Wno-weak-vtables 183 > 184 ) 185 endif(MSVC) 186 187 # set definitions for tests 188 target_compile_definitions(gsl_tests_config_noexcept INTERFACE 189 GSL_TERMINATE_ON_CONTRACT_VIOLATION 190 ) 191 192 function(add_gsl_test_noexcept name) 193 add_executable(${name} ${name}.cpp) 194 target_link_libraries(${name} 195 GSL 196 gsl_tests_config_noexcept 197 ) 198 add_test( 199 ${name} 200 ${name} 201 ) 202 # group all tests under GSL_tests_noexcept 203 set_property(TARGET ${name} PROPERTY FOLDER "GSL_tests_noexcept") 204 endfunction() 205 206 add_gsl_test_noexcept(no_exception_throw_tests) 207 add_gsl_test_noexcept(no_exception_ensure_tests) 208