mirror of
https://github.com/microsoft/GSL.git
synced 2026-01-25 00:22:19 +01:00
* infra: individual test executables We used have tests contained in a single executable. This was fine for testing, but it would be more convient to separate tests into indivudal modules so targeted changes could have targeted tests. This change associates each test file with its own executable. We now have 14 tests for GSL each of which testing a different component. * revert -Wno-reserved-identifier * Update tests/span_tests.cpp thanks copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * be sure to include build type in ctest command * [VS] make sure we are building the correct configuration * restore tests/span_tests.cpp * fix build break after merge conflicts * fix build break after merge conflicts #2 * another try at fixing a build break * fix silly typo. build break pt 4 * Use file globbing for test sources instead of manual list (#1227) * Initial plan * Use file globbing for test sources instead of manual list Replace the manually maintained list of test sources with file(GLOB) to automatically discover all .cpp files in the tests directory, excluding no_exception_ensure_tests.cpp which needs special compilation flags. This approach: - Automatically picks up new test files without CMake updates - Still correctly excludes no_exception_ensure_tests.cpp - Maintains the same test build configuration - Works with both C++14 and C++20 Co-authored-by: carsonRadtke <10507970+carsonRadtke@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: carsonRadtke <10507970+carsonRadtke@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
314 lines
11 KiB
CMake
314 lines
11 KiB
CMake
cmake_minimum_required(VERSION 3.14...3.16)
|
|
|
|
project(GSLTests LANGUAGES CXX)
|
|
|
|
set(GSL_CXX_STANDARD "14" CACHE STRING "Use c++ standard")
|
|
|
|
set(CMAKE_CXX_STANDARD ${GSL_CXX_STANDARD})
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
include(FindPkgConfig)
|
|
include(ExternalProject)
|
|
|
|
# will make visual studio generated project group files
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
|
|
if(CI_TESTING AND GSL_CXX_STANDARD EQUAL 20)
|
|
add_compile_definitions(FORCE_STD_SPAN_TESTS=1)
|
|
endif()
|
|
|
|
if(IOS)
|
|
add_compile_definitions(GTEST_HAS_DEATH_TEST=1 IOS_PROCESS_DELAY_WORKAROUND=1)
|
|
endif()
|
|
|
|
pkg_search_module(GTestMain gtest_main)
|
|
if (NOT GTestMain_FOUND)
|
|
# No pre-installed GTest is available, try to download it using Git.
|
|
find_package(Git REQUIRED QUIET)
|
|
|
|
configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
|
|
execute_process(
|
|
COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
|
|
RESULT_VARIABLE result
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download
|
|
)
|
|
if(result)
|
|
message(FATAL_ERROR "CMake step for googletest failed: ${result}")
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND ${CMAKE_COMMAND} --build .
|
|
RESULT_VARIABLE result
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download
|
|
)
|
|
if(result)
|
|
message(FATAL_ERROR "CMake step for googletest failed: ${result}")
|
|
endif()
|
|
|
|
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
|
set(GTestMain_LIBRARIES gtest_main)
|
|
|
|
add_subdirectory(
|
|
${CMAKE_CURRENT_BINARY_DIR}/googletest-src
|
|
${CMAKE_CURRENT_BINARY_DIR}/googletest-build
|
|
EXCLUDE_FROM_ALL
|
|
)
|
|
endif()
|
|
|
|
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
|
find_package(Microsoft.GSL CONFIG REQUIRED)
|
|
enable_testing()
|
|
|
|
if (NOT DEFINED Microsoft.GSL_VERSION)
|
|
message(FATAL_ERROR "Microsoft.GSL_VERSION not defined!")
|
|
endif()
|
|
|
|
message(STATUS "Microsoft.GSL_VERSION = ${Microsoft.GSL_VERSION}")
|
|
endif()
|
|
|
|
if (MSVC AND (GSL_CXX_STANDARD GREATER_EQUAL 17))
|
|
set(GSL_CPLUSPLUS_OPT -Zc:__cplusplus -permissive-)
|
|
endif()
|
|
|
|
include(CheckCXXCompilerFlag)
|
|
# this interface adds compile options to how the tests are run
|
|
# please try to keep entries ordered =)
|
|
add_library(gsl_tests_config INTERFACE)
|
|
if(MSVC) # MSVC or simulating MSVC
|
|
target_compile_options(gsl_tests_config INTERFACE
|
|
${GSL_CPLUSPLUS_OPT}
|
|
/EHsc
|
|
/W4
|
|
/WX
|
|
$<$<CXX_COMPILER_ID:MSVC>:
|
|
/wd4996 # Use of function or classes marked [[deprecated]]
|
|
/wd26409 # CppCoreCheck - GTest
|
|
/wd26426 # CppCoreCheck - GTest
|
|
/wd26440 # CppCoreCheck - GTest
|
|
/wd26446 # CppCoreCheck - prefer gsl::at()
|
|
/wd26472 # CppCoreCheck - use gsl::narrow(_cast)
|
|
/wd26481 # CppCoreCheck - use span instead of pointer arithmetic
|
|
$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,1920>: # VS2015
|
|
/wd4189 # variable is initialized but not referenced
|
|
$<$<NOT:$<CONFIG:Debug>>: # Release, RelWithDebInfo
|
|
/wd4702 # Unreachable code
|
|
>
|
|
>
|
|
>
|
|
$<$<CXX_COMPILER_ID:Clang>:
|
|
-Weverything
|
|
-Wfloat-equal
|
|
-Wno-c++98-compat
|
|
-Wno-c++98-compat-pedantic
|
|
-Wno-covered-switch-default # GTest
|
|
-Wno-deprecated-declarations # Allow tests for [[deprecated]] elements
|
|
-Wno-global-constructors # GTest
|
|
-Wno-language-extension-token # GTest gtest-port.h
|
|
-Wno-missing-braces
|
|
-Wno-missing-prototypes
|
|
-Wno-shift-sign-overflow # GTest gtest-port.h
|
|
-Wno-undef # GTest
|
|
-Wno-used-but-marked-unused # GTest EXPECT_DEATH
|
|
-Wno-switch-default # GTest EXPECT_DEATH
|
|
$<$<EQUAL:${GSL_CXX_STANDARD},14>: # no support for [[maybe_unused]]
|
|
-Wno-unused-member-function
|
|
-Wno-unused-variable
|
|
$<$<VERSION_EQUAL:$<CXX_COMPILER_VERSION>,15.0.1>:
|
|
-Wno-deprecated # False positive in MSVC Clang 15.0.1 raises a C++17 warning
|
|
>
|
|
>
|
|
>
|
|
)
|
|
check_cxx_compiler_flag("-Wno-reserved-identifier" WARN_RESERVED_ID)
|
|
if (WARN_RESERVED_ID)
|
|
target_compile_options(gsl_tests_config INTERFACE "-Wno-reserved-identifier")
|
|
endif()
|
|
else()
|
|
target_compile_options(gsl_tests_config INTERFACE
|
|
-fno-strict-aliasing
|
|
-Wall
|
|
-Wcast-align
|
|
-Wconversion
|
|
-Wctor-dtor-privacy
|
|
-Werror
|
|
-Wextra
|
|
-Wpedantic
|
|
-Wshadow
|
|
-Wsign-conversion
|
|
-Wfloat-equal
|
|
-Wno-deprecated-declarations # Allow tests for [[deprecated]] elements
|
|
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
|
|
-Weverything
|
|
-Wno-c++98-compat
|
|
-Wno-c++98-compat-pedantic
|
|
-Wno-missing-braces
|
|
-Wno-covered-switch-default # GTest
|
|
-Wno-global-constructors # GTest
|
|
-Wno-missing-prototypes
|
|
-Wno-padded
|
|
-Wno-switch-default
|
|
-Wno-unknown-attributes
|
|
-Wno-used-but-marked-unused # GTest EXPECT_DEATH
|
|
-Wno-weak-vtables
|
|
$<$<EQUAL:${GSL_CXX_STANDARD},14>: # no support for [[maybe_unused]]
|
|
-Wno-unused-member-function
|
|
-Wno-unused-variable
|
|
>
|
|
>
|
|
$<$<CXX_COMPILER_ID:Clang>:
|
|
$<$<AND:$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,4.99>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,6>>:
|
|
$<$<EQUAL:${GSL_CXX_STANDARD},17>:-Wno-undefined-func-template>
|
|
>
|
|
$<$<AND:$<EQUAL:${GSL_CXX_STANDARD},20>,$<OR:$<CXX_COMPILER_VERSION:11.0.0>,$<CXX_COMPILER_VERSION:10.0.0>>>:
|
|
-Wno-zero-as-null-pointer-constant # failing Clang Ubuntu 20.04 tests, seems to be a bug with clang 10.0.0
|
|
# and clang 11.0.0. (operator< is being re-written by the compiler
|
|
# as operator<=> and raising the warning)
|
|
>
|
|
>
|
|
$<$<CXX_COMPILER_ID:AppleClang>:
|
|
$<$<AND:$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,9.1>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,10>>:
|
|
$<$<EQUAL:${GSL_CXX_STANDARD},17>:-Wno-undefined-func-template>
|
|
>
|
|
>
|
|
$<$<CXX_COMPILER_ID:GNU>:
|
|
-Wdouble-promotion # float implicit to double
|
|
-Wlogical-op # suspicious uses of logical operators
|
|
$<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,6>>:
|
|
-Wduplicated-cond # duplicated if-else conditions
|
|
-Wmisleading-indentation
|
|
-Wnull-dereference
|
|
$<$<EQUAL:${GSL_CXX_STANDARD},14>: # no support for [[maybe_unused]]
|
|
-Wno-unused-variable
|
|
>
|
|
>
|
|
$<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,7>>:
|
|
-Wduplicated-branches # identical if-else branches
|
|
>
|
|
>
|
|
)
|
|
endif(MSVC)
|
|
check_cxx_compiler_flag("-Wno-unsafe-buffer-usage" WARN_UNSAFE_BUFFER)
|
|
if (WARN_UNSAFE_BUFFER)
|
|
# This test uses very greedy heuristics such as "no pointer arithmetic on raw buffer"
|
|
target_compile_options(gsl_tests_config INTERFACE "-Wno-unsafe-buffer-usage")
|
|
endif()
|
|
|
|
# for tests to find the gtest header
|
|
target_include_directories(gsl_tests_config SYSTEM INTERFACE
|
|
googletest/googletest/include
|
|
)
|
|
|
|
# Individually build and register each test source (except no_exception_ensure_tests.cpp)
|
|
# no_exception_ensure_tests.cpp is built separately with exceptions disabled
|
|
file(GLOB GSL_TEST_SOURCES CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
|
|
list(FILTER GSL_TEST_SOURCES EXCLUDE REGEX "no_exception_ensure_tests\\.cpp$")
|
|
|
|
foreach(src IN LISTS GSL_TEST_SOURCES)
|
|
get_filename_component(test_name "${src}" NAME_WE)
|
|
add_executable(${test_name} ${src})
|
|
target_link_libraries(${test_name}
|
|
Microsoft.GSL::GSL
|
|
gsl_tests_config
|
|
${GTestMain_LIBRARIES}
|
|
)
|
|
add_test(NAME ${test_name} COMMAND ${test_name})
|
|
set_target_properties(${test_name} PROPERTIES FOLDER "tests")
|
|
endforeach()
|
|
|
|
# No exception tests
|
|
|
|
foreach(flag_var
|
|
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
|
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
|
STRING (REGEX REPLACE "/EHsc" "" ${flag_var} "${${flag_var}}")
|
|
endforeach(flag_var)
|
|
|
|
# this interface adds compile options to how the tests are run
|
|
# please try to keep entries ordered =)
|
|
add_library(gsl_tests_config_noexcept INTERFACE)
|
|
if(MSVC) # MSVC or simulating MSVC
|
|
target_compile_definitions(gsl_tests_config_noexcept INTERFACE
|
|
_HAS_EXCEPTIONS=0 # disable exceptions in the Microsoft STL
|
|
)
|
|
target_compile_options(gsl_tests_config_noexcept INTERFACE
|
|
${GSL_CPLUSPLUS_OPT}
|
|
/W4
|
|
/WX
|
|
$<$<CXX_COMPILER_ID:MSVC>:
|
|
/wd4577
|
|
/wd4702
|
|
/wd26440 # CppCoreCheck - GTest
|
|
/wd26446 # CppCoreCheck - prefer gsl::at()
|
|
>
|
|
$<$<CXX_COMPILER_ID:Clang>:
|
|
-Weverything
|
|
-Wfloat-equal
|
|
-Wno-c++98-compat
|
|
-Wno-c++98-compat-pedantic
|
|
-Wno-missing-prototypes
|
|
-Wno-unknown-attributes
|
|
$<$<EQUAL:${GSL_CXX_STANDARD},14>:
|
|
$<$<VERSION_EQUAL:$<CXX_COMPILER_VERSION>,15.0.1>:
|
|
-Wno-deprecated # False positive in MSVC Clang 15.0.1 raises a C++17 warning
|
|
>
|
|
>
|
|
>
|
|
)
|
|
check_cxx_compiler_flag("-Wno-reserved-identifier" WARN_RESERVED_ID)
|
|
if (WARN_RESERVED_ID)
|
|
target_compile_options(gsl_tests_config_noexcept INTERFACE "-Wno-reserved-identifier")
|
|
endif()
|
|
else()
|
|
target_compile_options(gsl_tests_config_noexcept INTERFACE
|
|
-fno-exceptions
|
|
-fno-strict-aliasing
|
|
-Wall
|
|
-Wcast-align
|
|
-Wconversion
|
|
-Wctor-dtor-privacy
|
|
-Werror
|
|
-Wextra
|
|
-Wpedantic
|
|
-Wshadow
|
|
-Wsign-conversion
|
|
-Wfloat-equal
|
|
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:AppleClang>>:
|
|
-Weverything
|
|
-Wno-c++98-compat
|
|
-Wno-c++98-compat-pedantic
|
|
-Wno-missing-prototypes
|
|
-Wno-unknown-attributes
|
|
-Wno-weak-vtables
|
|
>
|
|
$<$<CXX_COMPILER_ID:GNU>:
|
|
-Wdouble-promotion # float implicit to double
|
|
-Wlogical-op # suspicious uses of logical operators
|
|
-Wuseless-cast # casting to its own type
|
|
$<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,6>>:
|
|
-Wduplicated-cond # duplicated if-else conditions
|
|
-Wmisleading-indentation
|
|
-Wnull-dereference
|
|
>
|
|
$<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,7>>:
|
|
-Wduplicated-branches # identical if-else branches
|
|
>
|
|
$<$<NOT:$<VERSION_LESS:$<CXX_COMPILER_VERSION>,8>>:
|
|
-Wcast-align=strict # increase alignment (i.e. char* to int*)
|
|
>
|
|
>
|
|
)
|
|
endif(MSVC)
|
|
check_cxx_compiler_flag("-Wno-unsafe-buffer-usage" WARN_UNSAFE_BUFFER)
|
|
if (WARN_UNSAFE_BUFFER)
|
|
# This test uses very greedy heuristics such as "no pointer arithmetic on raw buffer"
|
|
target_compile_options(gsl_tests_config_noexcept INTERFACE "-Wno-unsafe-buffer-usage")
|
|
endif()
|
|
|
|
add_executable(gsl_noexcept_tests no_exception_ensure_tests.cpp)
|
|
target_link_libraries(gsl_noexcept_tests
|
|
Microsoft.GSL::GSL
|
|
gsl_tests_config_noexcept
|
|
)
|
|
add_test(gsl_noexcept_tests gsl_noexcept_tests)
|