]> granicus.if.org Git - icinga2/blob - cmake/BoostTestTargets.cmake
Fix the .bundle validation.
[icinga2] / cmake / BoostTestTargets.cmake
1 # - Add tests using boost::test
2 #
3 # Add this line to your test files in place of including a basic boost test header:
4 #  #include <BoostTestTargetConfig.h>
5 #
6 # If you cannot do that and must use the included form for a given test,
7 # include the line
8 #  // OVERRIDE_BOOST_TEST_INCLUDED_WARNING
9 # in the same file with the boost test include.
10 #
11 #  include(BoostTestTargets)
12 #  add_boost_test(<testdriver_name> SOURCES <source1> [<more sources...>]
13 #   [FAIL_REGULAR_EXPRESSION <additional fail regex>]
14 #   [LAUNCHER <generic launcher script>]
15 #   [LIBRARIES <library> [<library>...]]
16 #   [RESOURCES <resource> [<resource>...]]
17 #   [TESTS <testcasename> [<testcasename>...]])
18 #
19 #  If for some reason you need access to the executable target created,
20 #  it can be found in ${${testdriver_name}_TARGET_NAME} as specified when
21 #  you called add_boost_test
22 #
23 # Requires CMake 2.6 or newer (uses the 'function' command)
24 #
25 # Requires:
26 #       GetForceIncludeDefinitions
27 #       CopyResourcesToBuildTree
28 #
29 # Original Author:
30 # 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
31 # http://academic.cleardefinition.com
32 # Iowa State University HCI Graduate Program/VRAC
33 #
34 # Copyright Iowa State University 2009-2010.
35 # Distributed under the Boost Software License, Version 1.0.
36 # (See accompanying file LICENSE_1_0.txt or copy at
37 # http://www.boost.org/LICENSE_1_0.txt)
38
39 if(__add_boost_test)
40         return()
41 endif()
42 set(__add_boost_test YES)
43
44 set(BOOST_TEST_TARGET_PREFIX "boosttest")
45
46 if(NOT Boost_FOUND)
47         find_package(Boost 1.34.0 QUIET)
48 endif()
49 if("${Boost_VERSION}0" LESS "1034000")
50         set(_shared_msg
51                 "NOTE: boost::test-based targets and tests cannot "
52                 "be added: boost >= 1.34.0 required but not found. "
53                 "(found: '${Boost_VERSION}'; want >=103400) ")
54         if(BUILD_TESTING)
55                 message(FATAL_ERROR
56                         ${_shared_msg}
57                         "You may disable BUILD_TESTING to continue without the "
58                         "tests.")
59         else()
60                 message(STATUS
61                         ${_shared_msg}
62                         "BUILD_TESTING disabled, so continuing anyway.")
63         endif()
64 endif()
65
66 include(GetForceIncludeDefinitions)
67 include(CopyResourcesToBuildTree)
68
69 if(Boost_FOUND AND NOT "${Boost_VERSION}0" LESS "1034000")
70         set(_boosttesttargets_libs)
71         set(_boostConfig "BoostTestTargetsIncluded.h")
72         if(NOT Boost_UNIT_TEST_FRAMEWORK_LIBRARY)
73                 find_package(Boost 1.34.0 QUIET COMPONENTS unit_test_framework)
74         endif()
75         if(Boost_UNIT_TEST_FRAMEWORK_LIBRARY)
76                 set(_boosttesttargets_libs "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}")
77                 if(Boost_USE_STATIC_LIBS)
78                         set(_boostConfig "BoostTestTargetsStatic.h")
79                 else()
80                         if(NOT APPLE)
81                                 set(_boostConfig "BoostTestTargetsDynamic.h")
82                         endif()
83                 endif()
84         endif()
85         get_filename_component(_moddir ${CMAKE_CURRENT_LIST_FILE} PATH)
86         configure_file("${_moddir}/${_boostConfig}"
87                 "${CMAKE_CURRENT_BINARY_DIR}/BoostTestTargetConfig.h"
88                 COPYONLY)
89         include_directories("${CMAKE_CURRENT_BINARY_DIR}")
90 endif()
91
92 function(add_boost_test _name)
93         if(NOT BUILD_TESTING)
94                 return()
95         endif()
96         if("${CMAKE_VERSION}" VERSION_LESS "2.8.0")
97                 if(NOT "${_boost_test_cmakever_pestered}x" EQUAL "${CMAKE_VERSION}x")
98                         message(STATUS
99                                 "Not adding boost::test targets - CMake 2.8.0 or newer required, using ${CMAKE_VERSION}")
100                         set(_boost_test_cmakever_pestered
101                                 "${CMAKE_VERSION}"
102                                 CACHE
103                                 INTERNAL
104                                 ""
105                                 FORCE)
106                 endif()
107                 return()
108         endif()
109
110         # parse arguments
111         set(_nowhere)
112         set(_curdest _nowhere)
113         set(_val_args
114                 SOURCES
115                 FAIL_REGULAR_EXPRESSION
116                 LAUNCHER
117                 LIBRARIES
118                 RESOURCES
119                 TESTS)
120         set(_bool_args
121                 USE_COMPILED_LIBRARY)
122         foreach(_arg ${_val_args} ${_bool_args})
123                 set(${_arg})
124         endforeach()
125         foreach(_element ${ARGN})
126                 list(FIND _val_args "${_element}" _val_arg_find)
127                 list(FIND _bool_args "${_element}" _bool_arg_find)
128                 if("${_val_arg_find}" GREATER "-1")
129                         set(_curdest "${_element}")
130                 elseif("${_bool_arg_find}" GREATER "-1")
131                         set("${_element}" ON)
132                         set(_curdest _nowhere)
133                 else()
134                         list(APPEND ${_curdest} "${_element}")
135                 endif()
136         endforeach()
137
138         if(_nowhere)
139                 message(FATAL_ERROR "Syntax error in use of add_boost_test!")
140         endif()
141
142         if(NOT SOURCES)
143                 message(FATAL_ERROR
144                         "Syntax error in use of add_boost_test: at least one source file required!")
145         endif()
146
147         if(Boost_FOUND AND NOT "${Boost_VERSION}0" LESS "1034000")
148
149                 include_directories(${Boost_INCLUDE_DIRS})
150
151                 set(includeType)
152                 foreach(src ${SOURCES})
153                         file(READ ${src} thefile)
154                         if("${thefile}" MATCHES ".*BoostTestTargetConfig.h.*")
155                                 set(includeType CONFIGURED)
156                                 set(includeFileLoc ${src})
157                                 break()
158                         elseif("${thefile}" MATCHES ".*boost/test/included/unit_test.hpp.*")
159                                 set(includeType INCLUDED)
160                                 set(includeFileLoc ${src})
161                                 set(_boosttesttargets_libs)     # clear this out - linking would be a bad idea
162                                 if(NOT
163                                         "${thefile}"
164                                         MATCHES
165                                         ".*OVERRIDE_BOOST_TEST_INCLUDED_WARNING.*")
166                                         message("Please replace the include line in ${src} with this alternate include line instead:")
167                                         message("  \#include <BoostTestTargetConfig.h>")
168                                         message("Once you've saved your changes, re-run CMake. (See BoostTestTargets.cmake for more info)")
169                                 endif()
170                                 break()
171                         endif()
172                 endforeach()
173
174                 if(NOT _boostTestTargetsNagged${_name} STREQUAL "${includeType}")
175                         if("includeType" STREQUAL "CONFIGURED")
176                                 message(STATUS
177                                         "Test '${_name}' uses the CMake-configurable form of the boost test framework - congrats! (Including File: ${includeFileLoc})")
178                         elseif("${includeType}" STREQUAL "INCLUDED")
179                                 message("In test '${_name}': ${includeFileLoc} uses the 'included' form of the boost unit test framework.")
180                         else()
181                                 message("In test '${_name}': Didn't detect the CMake-configurable boost test include.")
182                                 message("Please replace your existing boost test include in that test with the following:")
183                                 message("  \#include <BoostTestTargetConfig.h>")
184                                 message("Once you've saved your changes, re-run CMake. (See BoostTestTargets.cmake for more info)")
185                         endif()
186                 endif()
187                 set(_boostTestTargetsNagged${_name}
188                         "${includeType}"
189                         CACHE
190                         INTERNAL
191                         ""
192                         FORCE)
193
194
195                 if(RESOURCES)
196                         list(APPEND SOURCES ${RESOURCES})
197                 endif()
198
199                 # Generate a unique target name, using the relative binary dir
200                 # and provided name. (transform all / into _ and remove all other
201                 # non-alphabet characters)
202                 file(RELATIVE_PATH
203                         targetpath
204                         "${CMAKE_BINARY_DIR}"
205                         "${CMAKE_CURRENT_BINARY_DIR}")
206                 string(REGEX REPLACE "[^A-Za-z/_]" "" targetpath "${targetpath}")
207                 string(REPLACE "/" "_" targetpath "${targetpath}")
208
209                 set(_target_name ${BOOST_TEST_TARGET_PREFIX}-${targetpath}-${_name})
210                 set(${_name}_TARGET_NAME "${_target_name}" PARENT_SCOPE)
211
212                 # Build the test.
213                 add_executable(${_target_name} ${SOURCES})
214
215                 list(APPEND LIBRARIES ${_boosttesttargets_libs})
216
217                 if(LIBRARIES)
218                         target_link_libraries(${_target_name} ${LIBRARIES})
219                 endif()
220
221                 if(RESOURCES)
222                         set_property(TARGET ${_target_name} PROPERTY RESOURCE ${RESOURCES})
223                         copy_resources_to_build_tree(${_target_name})
224                 endif()
225
226                 if(NOT Boost_TEST_FLAGS)
227 #                       set(Boost_TEST_FLAGS --catch_system_error=yes --output_format=XML)
228                         set(Boost_TEST_FLAGS --catch_system_error=yes)
229                 endif()
230
231                 # TODO: Figure out why only recent boost handles individual test running properly
232
233                 if(LAUNCHER)
234                         set(_test_command ${LAUNCHER} "\$<TARGET_FILE:${_target_name}>")
235                 else()
236                         set(_test_command ${_target_name})
237                 endif()
238
239                 if(TESTS AND "${Boost_VERSION}" VERSION_GREATER "103799")
240                         foreach(_test ${TESTS})
241                                 add_test(NAME
242                                         ${_name}-${_test}
243                                         COMMAND
244                                         ${_test_command}
245                                         --run_test=${_test}
246                                         ${Boost_TEST_FLAGS})
247                                 if(FAIL_REGULAR_EXPRESSION)
248                                         set_tests_properties(${_name}-${_test}
249                                                 PROPERTIES
250                                                 FAIL_REGULAR_EXPRESSION
251                                                 "${FAIL_REGULAR_EXPRESSION}")
252                                 endif()
253                         endforeach()
254                 else()
255                         add_test(NAME
256                                 ${_name}-boost_test
257                                 COMMAND
258                                 ${_test_command}
259                                 ${Boost_TEST_FLAGS})
260                         if(FAIL_REGULAR_EXPRESSION)
261                                 set_tests_properties(${_name}-${_test}
262                                         PROPERTIES
263                                         FAIL_REGULAR_EXPRESSION
264                                         "${FAIL_REGULAR_EXPRESSION}")
265                         endif()
266                 endif()
267
268                 # CppCheck the test if we can.
269                 if(COMMAND add_cppcheck)
270                         add_cppcheck(${_target_name} STYLE UNUSED_FUNCTIONS)
271                 endif()
272
273         endif()
274 endfunction()