2021-04-29 01:59:43 +03:00
|
|
|
add_subdirectory(gtest)
|
2018-01-17 16:46:14 +03:00
|
|
|
|
2014-08-09 20:07:15 +04:00
|
|
|
set(TEST_MAIN_SRC test-main.cc gtest-extra.cc gtest-extra.h util.cc)
|
2016-02-03 14:59:03 +03:00
|
|
|
add_library(test-main STATIC ${TEST_MAIN_SRC})
|
2021-05-14 18:14:09 +03:00
|
|
|
target_include_directories(test-main PUBLIC
|
|
|
|
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
|
|
|
|
target_link_libraries(test-main gtest)
|
2016-01-29 18:21:17 +03:00
|
|
|
|
2016-03-18 18:10:06 +03:00
|
|
|
include(CheckCXXCompilerFlag)
|
|
|
|
|
2016-02-04 19:15:19 +03:00
|
|
|
# Workaround GTest bug https://github.com/google/googletest/issues/705.
|
2016-02-04 19:36:41 +03:00
|
|
|
check_cxx_compiler_flag(
|
|
|
|
-fno-delete-null-pointer-checks HAVE_FNO_DELETE_NULL_POINTER_CHECKS)
|
|
|
|
if (HAVE_FNO_DELETE_NULL_POINTER_CHECKS)
|
|
|
|
target_compile_options(test-main PUBLIC -fno-delete-null-pointer-checks)
|
|
|
|
endif ()
|
2016-02-04 19:15:19 +03:00
|
|
|
|
2016-03-18 17:52:24 +03:00
|
|
|
# Use less strict pedantic flags for the tests because GMock doesn't compile
|
|
|
|
# cleanly with -pedantic and -std=c++98.
|
2016-01-29 18:21:17 +03:00
|
|
|
if (CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
|
2018-06-06 16:57:59 +03:00
|
|
|
#set(PEDANTIC_COMPILE_FLAGS -Wall -Wextra -Wno-long-long -Wno-variadic-macros)
|
2016-01-29 18:21:17 +03:00
|
|
|
endif ()
|
2014-08-09 20:04:38 +04:00
|
|
|
|
2016-07-16 17:58:42 +03:00
|
|
|
function(add_fmt_executable name)
|
|
|
|
add_executable(${name} ${ARGN})
|
|
|
|
if (MINGW)
|
|
|
|
target_link_libraries(${name} -static-libgcc -static-libstdc++)
|
|
|
|
endif ()
|
|
|
|
endfunction()
|
|
|
|
|
2014-08-09 20:04:38 +04:00
|
|
|
# Adds a test.
|
2016-02-03 14:59:03 +03:00
|
|
|
# Usage: add_fmt_test(name srcs...)
|
2014-09-05 18:12:20 +04:00
|
|
|
function(add_fmt_test name)
|
2021-05-14 18:14:09 +03:00
|
|
|
cmake_parse_arguments(ADD_FMT_TEST "HEADER_ONLY;MODULE" "" "" ${ARGN})
|
2021-05-01 00:21:49 +03:00
|
|
|
|
|
|
|
set(sources ${name}.cc ${ADD_FMT_TEST_UNPARSED_ARGUMENTS})
|
|
|
|
if (ADD_FMT_TEST_HEADER_ONLY)
|
|
|
|
set(sources ${sources} ${TEST_MAIN_SRC} ../src/os.cc)
|
|
|
|
set(libs gtest fmt-header-only)
|
|
|
|
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
|
|
set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wno-weak-vtables)
|
|
|
|
endif ()
|
2021-05-14 18:14:09 +03:00
|
|
|
elseif (ADD_FMT_TEST_MODULE)
|
|
|
|
set(libs test-main test-module)
|
|
|
|
set_source_files_properties(${name}.cc PROPERTIES OBJECT_DEPENDS test-module)
|
|
|
|
else ()
|
|
|
|
set(libs test-main fmt)
|
2021-05-01 00:21:49 +03:00
|
|
|
endif ()
|
|
|
|
add_fmt_executable(${name} ${sources})
|
|
|
|
target_link_libraries(${name} ${libs})
|
2016-07-16 17:58:42 +03:00
|
|
|
|
2018-03-21 17:50:59 +03:00
|
|
|
# Define if certain C++ features can be used.
|
2016-01-29 18:21:17 +03:00
|
|
|
if (FMT_PEDANTIC)
|
|
|
|
target_compile_options(${name} PRIVATE ${PEDANTIC_COMPILE_FLAGS})
|
2014-08-15 19:40:03 +04:00
|
|
|
endif ()
|
2019-08-31 19:26:45 +03:00
|
|
|
if (FMT_WERROR)
|
|
|
|
target_compile_options(${name} PRIVATE ${WERROR_FLAG})
|
|
|
|
endif ()
|
2015-03-02 03:12:26 +03:00
|
|
|
add_test(NAME ${name} COMMAND ${name})
|
2014-08-09 20:04:38 +04:00
|
|
|
endfunction()
|
|
|
|
|
2021-03-18 19:04:17 +03:00
|
|
|
add_fmt_test(args-test)
|
2015-06-22 18:17:23 +03:00
|
|
|
add_fmt_test(assert-test)
|
2018-12-07 21:19:44 +03:00
|
|
|
add_fmt_test(chrono-test)
|
2019-03-10 17:41:29 +03:00
|
|
|
add_fmt_test(color-test)
|
2018-09-19 18:55:45 +03:00
|
|
|
add_fmt_test(core-test)
|
2014-09-05 18:12:20 +04:00
|
|
|
add_fmt_test(gtest-extra-test)
|
2018-09-19 18:55:45 +03:00
|
|
|
add_fmt_test(format-test mock-allocator.h)
|
Making CUDA test work with CMAKE_MSVC_RUNTIME_LIBRARY
CMake 3.15 introduced a new way of handling MSVC CRT type definition for
the build: CMAKE_MSVC_RUNTIME_LIBRARY variable.
(https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html)
This is supposed to be the way to go with MSVC CRT selection in new
projects. Using this method however breaks the current CMake script for
CUDA test. The reason is the CUDA test uses "FindCUDA" CMake module to
detect and set up CUDA support in CMake, which is deprecated since CMake
version 3.10, and which does not support CMAKE_MSVC_RUNTIME_LIBRARY
selector correctly (i.e. it does not propagate the compiler option
related to the CRT).
I did not find a way to "patch" in the correct compiler options, so
(while knowing this feature is only available from CMake 3.15 on) I
decided to change also the way CUDA is handled and instead of using
FindCUDA, used enable_language. Apart from having some nice additional
side-effects, it also fixed the problem with CRT selection.
However, the propagation of the compiler options (and in particular the
options related to C++ standard selection) is still a bit flaky on
Windows+MSVC platform, so it had to be done manually.
The patch makes two things in parallel:
1) Introduces MSVC_BUILD_STATIC, which, together with CMake version >=
3.15, allows building static version of the 'fmt' lib (and all the
tests).
2) At the same time, for CMake >= 3.15 it switches handling of CUDA
support from (old) FindCUDA to (new) enable_language, to fix the
problems which the old method has with the new CRT selector for MSVC in
a new CMake.
Added a check for CUDA before enabling it.
Using VERSION_LESS instead of VERSION_GREATER_EQUAL
Since apparently VERSION_GREATER_EQUAL exists only from CMake 3.7, while
Android is using CMake 3.6.
Removed MSVC_RUNTIME_LIBRARY logic from the CMake file.
The static build can be set on the command line with CMake >= 3.15
by defining the policy and the CMAKE_MSVC_RUNTIME_LIBARY this way:
cmake -G <gen> <options>
-DCMAKE_POLICY_DEFAULT_CMP0091=NEW
-DMSVC_BUILD_STATIC=ON
-DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$<CONFIG:Debug>:Debug>"
When MSVC_BUILD_DEBUG is set the test 'posix-mock-test' is skipped as it
does not build with the static runtime.
2019-09-19 15:58:15 +03:00
|
|
|
if (MSVC)
|
|
|
|
target_compile_options(format-test PRIVATE /bigobj)
|
|
|
|
endif ()
|
2018-11-20 18:43:40 +03:00
|
|
|
if (NOT (MSVC AND BUILD_SHARED_LIBS))
|
2021-05-02 15:55:55 +03:00
|
|
|
add_fmt_test(format-impl-test HEADER_ONLY header-only-test.cc)
|
2018-11-20 18:43:40 +03:00
|
|
|
endif ()
|
2018-11-14 20:39:37 +03:00
|
|
|
add_fmt_test(locale-test)
|
2016-05-06 17:37:20 +03:00
|
|
|
add_fmt_test(ostream-test)
|
2019-07-25 19:01:21 +03:00
|
|
|
add_fmt_test(compile-test)
|
2014-09-05 18:12:20 +04:00
|
|
|
add_fmt_test(printf-test)
|
2018-05-10 17:11:00 +03:00
|
|
|
add_fmt_test(ranges-test)
|
2019-05-15 20:02:40 +03:00
|
|
|
add_fmt_test(scan-test)
|
2021-05-18 06:47:38 +03:00
|
|
|
add_fmt_test(wchar-test)
|
2015-08-19 18:03:17 +03:00
|
|
|
|
2021-05-14 18:14:09 +03:00
|
|
|
if (FMT_CAN_MODULE)
|
|
|
|
# The tests need {fmt} to be compiled as traditional library
|
|
|
|
# because of visibility of implementation details.
|
|
|
|
# If module support is present the module tests require a
|
|
|
|
# test-only module to be built from {fmt}
|
|
|
|
add_library(test-module OBJECT ${CMAKE_SOURCE_DIR}/src/fmt.cc)
|
|
|
|
target_compile_features(test-module PUBLIC ${FMT_REQUIRED_FEATURES})
|
|
|
|
target_include_directories(test-module PUBLIC
|
|
|
|
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
|
|
|
|
enable_module(test-module)
|
|
|
|
|
|
|
|
add_fmt_test(module-test MODULE)
|
|
|
|
endif ()
|
|
|
|
|
2020-12-24 17:40:46 +03:00
|
|
|
if (NOT MSVC)
|
2020-12-24 17:54:33 +03:00
|
|
|
# FMT_ENFORCE_COMPILE_STRING is not supported under MSVC due to compiler bugs.
|
2021-05-01 03:02:14 +03:00
|
|
|
add_fmt_test(enforce-checks-test)
|
|
|
|
target_compile_definitions(enforce-checks-test PRIVATE
|
2020-12-24 17:54:33 +03:00
|
|
|
-DFMT_ENFORCE_COMPILE_STRING)
|
|
|
|
endif ()
|
2020-12-24 17:40:46 +03:00
|
|
|
|
2020-07-13 16:11:23 +03:00
|
|
|
if (NOT DEFINED MSVC_STATIC_RUNTIME AND MSVC)
|
|
|
|
foreach (flag_var
|
|
|
|
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
|
|
|
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
|
|
|
if (${flag_var} MATCHES "^(/|-)(MT|MTd)")
|
|
|
|
set(MSVC_STATIC_RUNTIME ON)
|
|
|
|
break()
|
|
|
|
endif()
|
|
|
|
endforeach()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if (NOT MSVC_STATIC_RUNTIME)
|
2016-07-16 17:58:42 +03:00
|
|
|
add_fmt_executable(posix-mock-test
|
2018-03-21 17:50:59 +03:00
|
|
|
posix-mock-test.cc ../src/format.cc ${TEST_MAIN_SRC})
|
2017-10-21 17:38:49 +03:00
|
|
|
target_include_directories(
|
|
|
|
posix-mock-test PRIVATE ${PROJECT_SOURCE_DIR}/include)
|
2021-04-29 01:59:43 +03:00
|
|
|
target_link_libraries(posix-mock-test gtest)
|
2018-06-06 16:57:59 +03:00
|
|
|
if (FMT_PEDANTIC)
|
|
|
|
target_compile_options(posix-mock-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})
|
|
|
|
endif ()
|
2019-06-24 03:10:57 +03:00
|
|
|
if (HAVE_STRTOD_L)
|
|
|
|
target_compile_definitions(posix-mock-test PRIVATE FMT_LOCALE)
|
|
|
|
endif ()
|
2015-06-24 19:16:03 +03:00
|
|
|
add_test(NAME posix-mock-test COMMAND posix-mock-test)
|
2019-12-16 01:51:37 +03:00
|
|
|
add_fmt_test(os-test)
|
2014-08-09 20:04:38 +04:00
|
|
|
endif ()
|
|
|
|
|
2018-06-06 16:57:59 +03:00
|
|
|
message(STATUS "FMT_PEDANTIC: ${FMT_PEDANTIC}")
|
|
|
|
|
2020-11-15 20:03:20 +03:00
|
|
|
if (FMT_PEDANTIC AND CXX_STANDARD LESS 20)
|
2019-05-28 06:02:08 +03:00
|
|
|
# MSVC fails to compile GMock when C++17 is enabled.
|
|
|
|
if (FMT_HAS_VARIANT AND NOT MSVC)
|
|
|
|
add_fmt_test(std-format-test)
|
|
|
|
set_property(TARGET std-format-test PROPERTY CXX_STANDARD 17)
|
|
|
|
endif ()
|
|
|
|
|
2019-03-10 17:56:46 +03:00
|
|
|
# Test that the library can be compiled with exceptions disabled.
|
|
|
|
# -fno-exception is broken in icc: https://github.com/fmtlib/fmt/issues/822.
|
|
|
|
if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
|
|
|
|
check_cxx_compiler_flag(-fno-exceptions HAVE_FNO_EXCEPTIONS_FLAG)
|
|
|
|
endif ()
|
|
|
|
if (HAVE_FNO_EXCEPTIONS_FLAG)
|
|
|
|
add_library(noexception-test ../src/format.cc)
|
|
|
|
target_include_directories(
|
|
|
|
noexception-test PRIVATE ${PROJECT_SOURCE_DIR}/include)
|
|
|
|
target_compile_options(noexception-test PRIVATE -fno-exceptions)
|
|
|
|
if (FMT_PEDANTIC)
|
|
|
|
target_compile_options(noexception-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})
|
|
|
|
endif ()
|
|
|
|
endif ()
|
|
|
|
|
|
|
|
# Test that the library compiles without locale.
|
|
|
|
add_library(nolocale-test ../src/format.cc)
|
|
|
|
target_include_directories(
|
|
|
|
nolocale-test PRIVATE ${PROJECT_SOURCE_DIR}/include)
|
|
|
|
target_compile_definitions(
|
|
|
|
nolocale-test PRIVATE FMT_STATIC_THOUSANDS_SEPARATOR=1)
|
|
|
|
|
2019-07-25 19:01:21 +03:00
|
|
|
add_test(compile-error-test ${CMAKE_CTEST_COMMAND}
|
2016-02-03 15:05:18 +03:00
|
|
|
--build-and-test
|
2019-07-25 19:01:21 +03:00
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/compile-error-test"
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/compile-error-test"
|
2016-02-03 15:05:18 +03:00
|
|
|
--build-generator ${CMAKE_GENERATOR}
|
2016-05-03 00:51:37 +03:00
|
|
|
--build-makeprogram ${CMAKE_MAKE_PROGRAM}
|
2018-06-06 16:57:59 +03:00
|
|
|
--build-options
|
2016-05-03 00:51:37 +03:00
|
|
|
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
|
2018-06-06 16:57:59 +03:00
|
|
|
"-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
|
|
|
|
"-DCXX_STANDARD_FLAG=${CXX_STANDARD_FLAG}"
|
|
|
|
"-DPEDANTIC_COMPILE_FLAGS=${PEDANTIC_COMPILE_FLAGS}"
|
2016-05-03 00:51:37 +03:00
|
|
|
"-DSUPPORTS_USER_DEFINED_LITERALS=${SUPPORTS_USER_DEFINED_LITERALS}")
|
2018-09-21 23:55:33 +03:00
|
|
|
endif ()
|
2016-02-03 15:05:18 +03:00
|
|
|
|
2018-09-21 23:55:33 +03:00
|
|
|
# These tests are disabled on Windows because they take too long.
|
|
|
|
if (FMT_PEDANTIC AND NOT WIN32)
|
|
|
|
# Test if the targets are found from the build directory.
|
2016-02-03 15:05:18 +03:00
|
|
|
add_test(find-package-test ${CMAKE_CTEST_COMMAND}
|
|
|
|
-C ${CMAKE_BUILD_TYPE}
|
|
|
|
--build-and-test
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/find-package-test"
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/find-package-test"
|
|
|
|
--build-generator ${CMAKE_GENERATOR}
|
|
|
|
--build-makeprogram ${CMAKE_MAKE_PROGRAM}
|
2016-05-04 01:51:28 +03:00
|
|
|
--build-options
|
|
|
|
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
|
2021-04-08 03:25:40 +03:00
|
|
|
"-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
|
2018-06-06 16:57:59 +03:00
|
|
|
"-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
|
2016-05-04 01:51:28 +03:00
|
|
|
"-DFMT_DIR=${PROJECT_BINARY_DIR}"
|
2018-06-06 16:57:59 +03:00
|
|
|
"-DPEDANTIC_COMPILE_FLAGS=${PEDANTIC_COMPILE_FLAGS}"
|
2016-05-04 01:51:28 +03:00
|
|
|
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
|
2016-02-03 15:05:18 +03:00
|
|
|
|
2018-09-21 23:55:33 +03:00
|
|
|
# Test if the targets are found when add_subdirectory is used.
|
2016-02-10 18:01:40 +03:00
|
|
|
add_test(add-subdirectory-test ${CMAKE_CTEST_COMMAND}
|
2016-02-03 15:05:18 +03:00
|
|
|
-C ${CMAKE_BUILD_TYPE}
|
|
|
|
--build-and-test
|
2016-02-10 18:01:40 +03:00
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/add-subdirectory-test"
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/add-subdirectory-test"
|
2016-02-03 15:05:18 +03:00
|
|
|
--build-generator ${CMAKE_GENERATOR}
|
|
|
|
--build-makeprogram ${CMAKE_MAKE_PROGRAM}
|
2016-05-04 01:51:28 +03:00
|
|
|
--build-options
|
|
|
|
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
|
2018-06-06 16:57:59 +03:00
|
|
|
"-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
|
|
|
|
"-DPEDANTIC_COMPILE_FLAGS=${PEDANTIC_COMPILE_FLAGS}"
|
2016-05-04 01:51:28 +03:00
|
|
|
"-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
|
2016-02-03 15:05:18 +03:00
|
|
|
endif ()
|
2019-08-28 12:58:37 +03:00
|
|
|
|
2019-12-09 18:30:34 +03:00
|
|
|
# Activate optional CUDA tests if CUDA is found. For version selection see
|
2019-08-28 12:58:37 +03:00
|
|
|
# https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cpp14-language-features
|
2019-12-09 18:30:34 +03:00
|
|
|
if (FMT_CUDA_TEST)
|
|
|
|
if (${CMAKE_VERSION} VERSION_LESS 3.15)
|
|
|
|
find_package(CUDA 9.0)
|
|
|
|
else ()
|
|
|
|
include(CheckLanguage)
|
|
|
|
check_language(CUDA)
|
|
|
|
if (CMAKE_CUDA_COMPILER)
|
|
|
|
enable_language(CUDA OPTIONAL)
|
|
|
|
set(CUDA_FOUND TRUE)
|
|
|
|
endif ()
|
Making CUDA test work with CMAKE_MSVC_RUNTIME_LIBRARY
CMake 3.15 introduced a new way of handling MSVC CRT type definition for
the build: CMAKE_MSVC_RUNTIME_LIBRARY variable.
(https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html)
This is supposed to be the way to go with MSVC CRT selection in new
projects. Using this method however breaks the current CMake script for
CUDA test. The reason is the CUDA test uses "FindCUDA" CMake module to
detect and set up CUDA support in CMake, which is deprecated since CMake
version 3.10, and which does not support CMAKE_MSVC_RUNTIME_LIBRARY
selector correctly (i.e. it does not propagate the compiler option
related to the CRT).
I did not find a way to "patch" in the correct compiler options, so
(while knowing this feature is only available from CMake 3.15 on) I
decided to change also the way CUDA is handled and instead of using
FindCUDA, used enable_language. Apart from having some nice additional
side-effects, it also fixed the problem with CRT selection.
However, the propagation of the compiler options (and in particular the
options related to C++ standard selection) is still a bit flaky on
Windows+MSVC platform, so it had to be done manually.
The patch makes two things in parallel:
1) Introduces MSVC_BUILD_STATIC, which, together with CMake version >=
3.15, allows building static version of the 'fmt' lib (and all the
tests).
2) At the same time, for CMake >= 3.15 it switches handling of CUDA
support from (old) FindCUDA to (new) enable_language, to fix the
problems which the old method has with the new CRT selector for MSVC in
a new CMake.
Added a check for CUDA before enabling it.
Using VERSION_LESS instead of VERSION_GREATER_EQUAL
Since apparently VERSION_GREATER_EQUAL exists only from CMake 3.7, while
Android is using CMake 3.6.
Removed MSVC_RUNTIME_LIBRARY logic from the CMake file.
The static build can be set on the command line with CMake >= 3.15
by defining the policy and the CMAKE_MSVC_RUNTIME_LIBARY this way:
cmake -G <gen> <options>
-DCMAKE_POLICY_DEFAULT_CMP0091=NEW
-DMSVC_BUILD_STATIC=ON
-DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$<CONFIG:Debug>:Debug>"
When MSVC_BUILD_DEBUG is set the test 'posix-mock-test' is skipped as it
does not build with the static runtime.
2019-09-19 15:58:15 +03:00
|
|
|
endif ()
|
|
|
|
|
2019-12-09 18:30:34 +03:00
|
|
|
if (CUDA_FOUND)
|
|
|
|
add_subdirectory(cuda-test)
|
|
|
|
add_test(NAME cuda-test COMMAND fmt-in-cuda-test)
|
|
|
|
endif ()
|
2019-08-28 12:58:37 +03:00
|
|
|
endif ()
|