1 cmake_minimum_required(VERSION 3.0.2)
6 # will make visual studio generated project group files
7 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
9 pkg_search_module(GTestMain gtest_main)
10 if (NOT GTestMain_FOUND)
11 configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
13 COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
14 RESULT_VARIABLE result
15 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download
18 message(FATAL_ERROR "CMake step for googletest failed: ${result}")
22 COMMAND ${CMAKE_COMMAND} --build .
23 RESULT_VARIABLE result
24 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download
27 message(FATAL_ERROR "CMake step for googletest failed: ${result}")
30 set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
31 set(GTestMain_LIBRARIES gtest_main)
34 ${CMAKE_CURRENT_BINARY_DIR}/googletest-src
35 ${CMAKE_CURRENT_BINARY_DIR}/googletest-build
40 if (MSVC AND (GSL_CXX_STANDARD EQUAL 17))
41 set(GSL_CPLUSPLUS_OPT -Zc:__cplusplus -permissive-)
44 # this interface adds compile options to how the tests are run
45 # please try to keep entries ordered =)
46 add_library(gsl_tests_config INTERFACE)
47 if(MSVC) # MSVC or simulating MSVC
48 target_compile_options(gsl_tests_config INTERFACE
53 $<$<CXX_COMPILER_ID:MSVC>:
54 /wd4996 # Use of function or classes marked [[deprecated]]
55 /wd26409 # CppCoreCheck - GTest
56 /wd26426 # CppCoreCheck - GTest
57 /wd26440 # CppCoreCheck - GTest
58 /wd26446 # CppCoreCheck - prefer gsl::at()
59 /wd26472 # CppCoreCheck - use gsl::narrow(_cast)
60 /wd26481 # CppCoreCheck - use span instead of pointer arithmetic
61 $<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,1920>: # VS2015
62 /wd4189 # variable is initialized but not referenced
63 $<$<NOT:$<CONFIG:Debug>>: # Release, RelWithDebInfo
64 /wd4702 # Unreachable code
68 $<$<CXX_COMPILER_ID:Clang>:
71 -Wno-c++98-compat-pedantic
72 -Wno-covered-switch-default # GTest
73 -Wno-deprecated-declarations # Allow tests for [[deprecated]] elements
74 -Wno-global-constructors # GTest
75 -Wno-language-extension-token # GTest gtest-port.h
77 -Wno-missing-prototypes
78 -Wno-shift-sign-overflow # GTest gtest-port.h
80 -Wno-used-but-marked-unused # GTest EXPECT_DEATH
81 $<$<EQUAL:${GSL_CXX_STANDARD},14>: # no support for [[maybe_unused]]
82 -Wno-unused-member-function
88 target_compile_options(gsl_tests_config INTERFACE
99 -Wno-deprecated-declarations # Allow tests for [[deprecated]] elements
100 $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
103 -Wno-c++98-compat-pedantic
105 -Wno-covered-switch-default # GTest
106 -Wno-global-constructors # GTest
107 -Wno-missing-prototypes
109 -Wno-unknown-attributes
110 -Wno-used-but-marked-unused # GTest EXPECT_DEATH
112 $<$<EQUAL:${GSL_CXX_STANDARD},14>: # no support for [[maybe_unused]]
113 -Wno-unused-member-function
117 $<$<CXX_COMPILER_ID:Clang>:
118 $<$<AND:$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.99>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,6>>:
119 $<$<EQUAL:${GSL_CXX_STANDARD},17>:-Wno-undefined-func-template>
122 $<$<CXX_COMPILER_ID:AppleClang>:
123 $<$<AND:$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,9.1>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,10>>:
124 $<$<EQUAL:${GSL_CXX_STANDARD},17>:-Wno-undefined-func-template>
127 $<$<CXX_COMPILER_ID:GNU>:
128 -Wdouble-promotion # float implicit to double
129 -Wlogical-op # suspicious uses of logical operators
130 $<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,6>>:
131 -Wduplicated-cond # duplicated if-else conditions
132 -Wmisleading-indentation
134 $<$<EQUAL:${GSL_CXX_STANDARD},14>: # no support for [[maybe_unused]]
138 $<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,7>>:
139 -Wduplicated-branches # identical if-else branches
145 # for tests to find the gtest header
146 target_include_directories(gsl_tests_config SYSTEM INTERFACE
147 googletest/googletest/include
150 set_property(TARGET PROPERTY FOLDER "GSL_tests")
152 function(add_gsl_test name)
153 add_executable(${name} ${name}.cpp)
154 target_link_libraries(${name}
157 ${GTestMain_LIBRARIES}
163 # group all tests under GSL_tests
164 set_property(TARGET ${name} PROPERTY FOLDER "GSL_tests")
167 add_gsl_test(span_tests)
168 add_gsl_test(span_ext_tests)
169 add_gsl_test(span_compatibility_tests)
170 add_gsl_test(multi_span_tests)
171 add_gsl_test(strided_span_tests)
172 add_gsl_test(string_span_tests)
173 add_gsl_test(at_tests)
174 add_gsl_test(bounds_tests)
175 add_gsl_test(notnull_tests)
176 add_gsl_test(assertion_tests)
177 add_gsl_test(utils_tests)
178 add_gsl_test(owner_tests)
179 add_gsl_test(byte_tests)
180 add_gsl_test(algorithm_tests)
181 add_gsl_test(strict_notnull_tests)
187 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
188 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
189 STRING (REGEX REPLACE "/EHsc" "" ${flag_var} "${${flag_var}}")
192 # this interface adds compile options to how the tests are run
193 # please try to keep entries ordered =)
194 add_library(gsl_tests_config_noexcept INTERFACE)
195 if(MSVC) # MSVC or simulating MSVC
196 target_compile_definitions(gsl_tests_config_noexcept INTERFACE
197 _HAS_EXCEPTIONS=0 # disable exceptions in the Microsoft STL
199 target_compile_options(gsl_tests_config_noexcept INTERFACE
203 $<$<CXX_COMPILER_ID:MSVC>:
206 /wd26440 # CppCoreCheck - GTest
207 /wd26446 # CppCoreCheck - prefer gsl::at()
209 $<$<CXX_COMPILER_ID:Clang>:
212 -Wno-c++98-compat-pedantic
213 -Wno-missing-prototypes
214 -Wno-unknown-attributes
218 target_compile_options(gsl_tests_config_noexcept INTERFACE
230 $<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
233 -Wno-c++98-compat-pedantic
234 -Wno-missing-prototypes
235 -Wno-unknown-attributes
238 $<$<CXX_COMPILER_ID:GNU>:
239 -Wdouble-promotion # float implicit to double
240 -Wlogical-op # suspicious uses of logical operators
241 -Wuseless-cast # casting to its own type
242 $<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,6>>:
243 -Wduplicated-cond # duplicated if-else conditions
244 -Wmisleading-indentation
247 $<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,7>>:
248 -Wduplicated-branches # identical if-else branches
250 $<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,8>>:
251 -Wcast-align=strict # increase alignment (i.e. char* to int*)
257 function(add_gsl_test_noexcept name)
258 add_executable(${name} ${name}.cpp)
259 target_link_libraries(${name}
261 gsl_tests_config_noexcept
262 ${GTestMain_LIBRARIES}
268 # group all tests under GSL_tests_noexcept
269 set_property(TARGET ${name} PROPERTY FOLDER "GSL_tests_noexcept")
272 add_gsl_test_noexcept(no_exception_ensure_tests)