1 #------------------------------------------------------------------------------
2 # Build the google test library
4 # We compile Google Test ourselves instead of using pre-compiled libraries.
5 # See the Google Test FAQ "Why is it not recommended to install a
6 # pre-compiled copy of Google Test (for example, into /usr/local)?"
7 # at http://code.google.com/p/googletest/wiki/FAQ for more details.
8 add_library(gmock STATIC
9 gmock-gtest-all.cc gmock/gmock.h gtest/gtest.h gtest/gtest-spi.h)
10 target_compile_definitions(gmock PUBLIC GTEST_HAS_STD_WSTRING=1)
11 target_include_directories(gmock SYSTEM PUBLIC . gmock gtest)
15 target_link_libraries(gmock ${CMAKE_THREAD_LIBS_INIT})
17 target_compile_definitions(gmock PUBLIC GTEST_HAS_PTHREAD=0)
20 if (NOT SUPPORTS_VARIADIC_TEMPLATES OR NOT SUPPORTS_INITIALIZER_LIST)
21 target_compile_definitions(gmock PUBLIC GTEST_LANG_CXX11=0)
24 # Workaround a bug in implementation of variadic templates in MSVC11.
26 target_compile_definitions(gmock PUBLIC _VARIADIC_MAX=10)
29 # GTest doesn't detect <tuple> with clang.
30 if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
31 target_compile_definitions(gmock PUBLIC GTEST_USE_OWN_TR1_TUPLE=1)
34 # Silence MSVC tr1 deprecation warning in gmock.
35 target_compile_definitions(gmock
36 PUBLIC _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING=0)
38 #------------------------------------------------------------------------------
39 # Build the actual library tests
41 set(TEST_MAIN_SRC test-main.cc gtest-extra.cc gtest-extra.h util.cc)
42 add_library(test-main STATIC ${TEST_MAIN_SRC})
43 target_compile_definitions(test-main PUBLIC
44 FMT_USE_FILE_DESCRIPTORS=$<BOOL:${HAVE_OPEN}>)
45 target_include_directories(test-main SYSTEM PUBLIC gtest gmock)
46 target_link_libraries(test-main gmock fmt)
48 include(CheckCXXCompilerFlag)
50 # Workaround GTest bug https://github.com/google/googletest/issues/705.
51 check_cxx_compiler_flag(
52 -fno-delete-null-pointer-checks HAVE_FNO_DELETE_NULL_POINTER_CHECKS)
53 if (HAVE_FNO_DELETE_NULL_POINTER_CHECKS)
54 target_compile_options(test-main PUBLIC -fno-delete-null-pointer-checks)
57 # Use less strict pedantic flags for the tests because GMock doesn't compile
58 # cleanly with -pedantic and -std=c++98.
59 if (CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
60 #set(PEDANTIC_COMPILE_FLAGS -Wall -Wextra -Wno-long-long -Wno-variadic-macros)
63 function(add_fmt_executable name)
64 add_executable(${name} ${ARGN})
66 target_link_libraries(${name} -static-libgcc -static-libstdc++)
71 # Usage: add_fmt_test(name srcs...)
72 function(add_fmt_test name)
73 add_fmt_executable(${name} ${name}.cc ${ARGN})
74 target_link_libraries(${name} test-main)
76 # Define if certain C++ features can be used.
77 target_compile_definitions(${name} PRIVATE
78 FMT_USE_TYPE_TRAITS=$<BOOL:${SUPPORTS_TYPE_TRAITS}>
79 FMT_USE_ENUM_BASE=$<BOOL:${SUPPORTS_ENUM_BASE}>)
81 target_compile_options(${name} PRIVATE ${PEDANTIC_COMPILE_FLAGS})
83 target_include_directories(${name} SYSTEM PUBLIC gtest gmock)
84 add_test(NAME ${name} COMMAND ${name})
87 add_fmt_test(assert-test)
88 add_fmt_test(chrono-test)
89 add_fmt_test(color-test)
90 add_fmt_test(core-test)
91 add_fmt_test(grisu-test)
92 target_compile_definitions(grisu-test PRIVATE FMT_USE_GRISU=1)
93 add_fmt_test(gtest-extra-test)
94 add_fmt_test(format-test mock-allocator.h)
95 if (NOT (MSVC AND BUILD_SHARED_LIBS))
96 add_fmt_test(format-impl-test)
98 add_fmt_test(locale-test)
99 add_fmt_test(ostream-test)
100 add_fmt_test(prepare-test)
101 add_fmt_test(printf-test)
102 add_fmt_test(custom-formatter-test)
103 add_fmt_test(ranges-test)
106 add_fmt_executable(posix-mock-test
107 posix-mock-test.cc ../src/format.cc ${TEST_MAIN_SRC})
108 target_include_directories(
109 posix-mock-test PRIVATE ${PROJECT_SOURCE_DIR}/include)
110 target_compile_definitions(posix-mock-test PRIVATE FMT_USE_FILE_DESCRIPTORS=1)
111 target_link_libraries(posix-mock-test gmock)
112 target_include_directories(posix-mock-test SYSTEM PUBLIC gtest gmock)
114 target_compile_options(posix-mock-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})
116 add_test(NAME posix-mock-test COMMAND posix-mock-test)
117 add_fmt_test(posix-test)
120 add_fmt_executable(header-only-test
121 header-only-test.cc header-only-test2.cc test-main.cc)
122 target_link_libraries(header-only-test gmock)
123 target_include_directories(header-only-test SYSTEM PUBLIC gtest gmock)
124 if (TARGET fmt-header-only)
125 target_link_libraries(header-only-test fmt-header-only)
127 target_include_directories(
128 header-only-test PRIVATE ${PROJECT_SOURCE_DIR}/include)
129 target_compile_definitions(header-only-test PRIVATE FMT_HEADER_ONLY=1)
132 message(STATUS "FMT_PEDANTIC: ${FMT_PEDANTIC}")
135 # Test that the library can be compiled with exceptions disabled.
136 # -fno-exception is broken in icc: https://github.com/fmtlib/fmt/issues/822.
137 if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
138 check_cxx_compiler_flag(-fno-exceptions HAVE_FNO_EXCEPTIONS_FLAG)
140 if (HAVE_FNO_EXCEPTIONS_FLAG)
141 add_library(noexception-test ../src/format.cc)
142 target_include_directories(
143 noexception-test PRIVATE ${PROJECT_SOURCE_DIR}/include)
144 target_compile_options(noexception-test PRIVATE -fno-exceptions)
146 target_compile_options(noexception-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})
150 # Test that the library compiles without locale.
151 add_library(nolocale-test ../src/format.cc)
152 target_include_directories(
153 nolocale-test PRIVATE ${PROJECT_SOURCE_DIR}/include)
154 target_compile_definitions(
155 nolocale-test PRIVATE FMT_STATIC_THOUSANDS_SEPARATOR=1)
157 # Test that the library compiles without windows.h.
158 if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
159 add_library(no-windows-h-test ../src/format.cc)
160 target_include_directories(
161 no-windows-h-test PRIVATE ${PROJECT_SOURCE_DIR}/include)
162 target_compile_definitions(no-windows-h-test PRIVATE FMT_USE_WINDOWS_H=0)
164 target_compile_options(no-windows-h-test PRIVATE ${PEDANTIC_COMPILE_FLAGS})
166 target_include_directories(no-windows-h-test SYSTEM PUBLIC gtest gmock)
169 add_test(compile-test ${CMAKE_CTEST_COMMAND}
171 "${CMAKE_CURRENT_SOURCE_DIR}/compile-test"
172 "${CMAKE_CURRENT_BINARY_DIR}/compile-test"
173 --build-generator ${CMAKE_GENERATOR}
174 --build-makeprogram ${CMAKE_MAKE_PROGRAM}
176 "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
177 "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
178 "-DCXX_STANDARD_FLAG=${CXX_STANDARD_FLAG}"
179 "-DPEDANTIC_COMPILE_FLAGS=${PEDANTIC_COMPILE_FLAGS}"
180 "-DSUPPORTS_USER_DEFINED_LITERALS=${SUPPORTS_USER_DEFINED_LITERALS}")
183 # These tests are disabled on Windows because they take too long.
184 if (FMT_PEDANTIC AND NOT WIN32)
185 # Test if the targets are found from the build directory.
186 add_test(find-package-test ${CMAKE_CTEST_COMMAND}
187 -C ${CMAKE_BUILD_TYPE}
189 "${CMAKE_CURRENT_SOURCE_DIR}/find-package-test"
190 "${CMAKE_CURRENT_BINARY_DIR}/find-package-test"
191 --build-generator ${CMAKE_GENERATOR}
192 --build-makeprogram ${CMAKE_MAKE_PROGRAM}
194 "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
195 "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
196 "-DFMT_DIR=${PROJECT_BINARY_DIR}"
197 "-DPEDANTIC_COMPILE_FLAGS=${PEDANTIC_COMPILE_FLAGS}"
198 "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
200 # Test if the targets are found when add_subdirectory is used.
201 add_test(add-subdirectory-test ${CMAKE_CTEST_COMMAND}
202 -C ${CMAKE_BUILD_TYPE}
204 "${CMAKE_CURRENT_SOURCE_DIR}/add-subdirectory-test"
205 "${CMAKE_CURRENT_BINARY_DIR}/add-subdirectory-test"
206 --build-generator ${CMAKE_GENERATOR}
207 --build-makeprogram ${CMAKE_MAKE_PROGRAM}
209 "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
210 "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
211 "-DPEDANTIC_COMPILE_FLAGS=${PEDANTIC_COMPILE_FLAGS}"
212 "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")