Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

152 lines
4.1 KiB
CMake

cmake_minimum_required(VERSION 3.10)
project(SafeInt VERSION 3.0.26)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# Runtime tests are:
# - default
# - without built-in 128-bit support
# - without intrinsics
# Compile time tests are:
# - default C++11
# - C++14
# - TODO - consider adding in 17, 20 just to see if anything breaks
# - compile without exceptions
# Supported compilers:
# - Microsoft
# - clang
# - gcc
# - Intel (not regularly tested)
# other compilers on a best effort
# test for g++
find_program(MSVC_CL "cl.exe")
if(NOT MSVC_CL)
message(STATUS "Skipping MSVC testing")
else()
message(STATUS "MSVC available, configuring MSVC tests")
set(CMAKE_CXX_COMPILER ${MSVC_CL})
# the standard level is already at C++11, which is what we need for runtime tests
add_compile_options(/Wall /wd4710 /wd4711)
# This will test whatever the mainline code can do, typically using int128
add_executable(SafeIntTest_msvc
../AddVerify.cpp
../AddTestCase.cpp
../CastVerify.cpp
../DivVerify.cpp
../DivTestCase.cpp
../IncDecVerify.cpp
../ModVerify.cpp
../MultVerify.cpp
../MultTestCase.cpp
../SubVerify.cpp
../SubTestCase.cpp
../TestMain.cpp
../TestMain.h
../../SafeInt.hpp
)
# Forces use of the older, less efficient code that can't use either int128 or intrinsics
add_executable(SafeIntTest_msvc_NoIntrinsic
../AddVerify.cpp
../AddTestCase.cpp
../CastVerify.cpp
../DivVerify.cpp
../DivTestCase.cpp
../IncDecVerify.cpp
../ModVerify.cpp
../MultVerify.cpp
../MultTestCase.cpp
../SubVerify.cpp
../SubTestCase.cpp
../TestMain.cpp
../TestMain.h
../../SafeInt.hpp
)
target_compile_definitions(SafeIntTest_msvc_NoIntrinsic PUBLIC "SAFEINT_USE_INTRINSICS=0" "SAFEINT_HAS_INT128=0")
# compilation tests, these are good if they just build
add_executable(CompileTest_msvc
../CompileTest.cpp
../ConstExpr.cpp
../CleanCompile.cpp
../../SafeInt.hpp
)
target_compile_options(CompileTest_msvc PUBLIC /wd4711 /wd4710)
add_executable(CompileTest_msvc14
../CompileTest.cpp
../ConstExpr.cpp
../CleanCompile.cpp
../../SafeInt.hpp
)
target_compile_options(CompileTest_msvc14 PUBLIC /std:c++14 /wd4711)
add_executable(CompileTest_msvc17
../CompileTest.cpp
../ConstExpr.cpp
../CleanCompile.cpp
../../SafeInt.hpp
)
target_compile_options(CompileTest_msvc17 PUBLIC /std:c++17)
# compilation tests, these are good if they just build
add_executable(CompileTest_msvc_noexcept
../CompileTest.cpp
../ConstExpr.cpp
../CleanCompile.cpp
../../SafeInt.hpp
)
target_compile_options(CompileTest_msvc_noexcept PUBLIC /wd4711 /wd4710 /EHsc)
add_executable(safe_math_test_msvc
../c_safe_math/safe_math_test.c
../c_safe_math/safe_math_test.h
../c_safe_math/safe_math_test_add.cpp
../c_safe_math/safe_math_test_div.cpp
../c_safe_math/safe_math_test_mult.cpp
../c_safe_math/safe_math_test_sub.cpp
../c_safe_math/compile_test.c
../AddTestCase.cpp
../DivTestCase.cpp
../MultTestCase.cpp
../SubTestCase.cpp
)
target_compile_definitions(safe_math_test_msvc PUBLIC)
target_compile_options(safe_math_test_msvc PUBLIC /wd4464)
add_executable(safe_math_compile_msvc
../c_safe_math/safe_math_compile.c
../c_safe_math/compile_test.c
../../safe_math.h
../../safe_math_impl.h
)
target_compile_options(safe_math_compile_msvc PUBLIC -Wall /wd4464)
endif()
enable_testing()
if(MSVC_CL)
add_test(NAME SafeIntTest_msvc COMMAND SafeIntTest_msvc)
add_test(NAME SafeIntTest_msvc_NoIntrinsic COMMAND SafeIntTest_msvc_NoIntrinsic)
add_test(NAME safe_math_test_msvc COMMAND safe_math_test_msvc)
set_tests_properties(SafeIntTest_msvc
SafeIntTest_msvc_NoIntrinsic
safe_math_test_msvc
PROPERTIES FAIL_REGULAR_EXPRESSION "Error")
endif()