File: FindCxxTest.cmake

package info (click to toggle)
cmake 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 147,284 kB
  • sloc: ansic: 403,915; cpp: 290,772; sh: 4,102; python: 3,357; yacc: 3,106; lex: 1,189; f90: 532; asm: 471; lisp: 375; cs: 270; java: 266; fortran: 230; perl: 217; objc: 215; xml: 198; makefile: 97; javascript: 83; pascal: 63; tcl: 55; php: 25; ruby: 22
file content (274 lines) | stat: -rw-r--r-- 9,162 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file LICENSE.rst or https://cmake.org/licensing for details.

#[=======================================================================[.rst:
FindCxxTest
-----------

Finds `CxxTest`_, a C++ unit testing framework suite, and provides a helper
command to create test runners and integrate them with CTest.

.. _`CxxTest`: https://github.com/CxxTest/cxxtest

Result Variables
^^^^^^^^^^^^^^^^

This module defines the following variables:

``CXXTEST_FOUND``
  Boolean indicating whether the CxxTest framework is found.

``CXXTEST_INCLUDE_DIRS``
  Include directories containing headers needed to use CxxTest.

``CXXTEST_TESTGEN_EXECUTABLE``
  The path to the found CxxTest test generator script (Perl- or Python-based),
  selected based on the found interpreter or user-specified preference.

``CXXTEST_TESTGEN_INTERPRETER``
  The path to the found Perl or Python interpreter used to run the test
  generator script, if needed (e.g., on platforms where script shebang lines are
  not supported).

Cache Variables
^^^^^^^^^^^^^^^

The following cache variables may also be set:

``CXXTEST_PERL_TESTGEN_EXECUTABLE``
  The path to the Perl-based CxxTest test generator script.

``CXXTEST_PYTHON_TESTGEN_EXECUTABLE``
  The path to the Python-based CxxTest test generator script.

Hints
^^^^^

This module accepts the following variables before calling
``find_package(CxxTest)``:

``CXXTEST_TESTGEN_ARGS``
  This variable can be set to specify a semicolon-separated list of command-line
  options to pass to the CxxTest code generator.  If not set, the default value
  is ``--error-printer``.

Commands
^^^^^^^^

This module provides the following command if CxxTest is found:

.. command:: cxxtest_add_test

  Creates a CxxTest runner and adds it to the CTest testing suite:

  .. code-block:: cmake

    cxxtest_add_test(<test-name> <gen-source-file> <input-files-to-testgen>...)

  Parameters:

  ``<test-name>``
    The name of the test executable target to be created and registered as a
    test in the CTest suite.

  ``<gen-source-file>``
    The name of the source file to be generated by the CxxTest code generator.
    This must be a relative path.  It is interpreted relative to the
    current binary directory (:variable:`CMAKE_CURRENT_BINARY_DIR`).

  ``<input-files-to-testgen>``
    A list of header files containing test suite classes derived from the C++
    class ``CxxTest::TestSuite``, to be included in the test runner.  These must
    be given as absolute paths.

Deprecated Variables
^^^^^^^^^^^^^^^^^^^^

The following variables are deprecated and provided for backward compatibility:

``CXXTEST_USE_PYTHON``
  .. deprecated:: 2.8.3
    In earlier versions of CMake, this hint variable was used to force the use
    of the Python-based test generator instead of the Perl one, regardless of
    which scripting language was installed.  It is now only considered when both
    Perl and Python interpreters are found.

  A boolean hint variable that, when set to true, prefers the Python code
  generator over the Perl one if both interpreters are found.  This variable is
  only relevant when using CxxTest version 3.

Examples
^^^^^^^^

The following example demonstrates how CxxTest can be used in CMake with this
module.  If CxxTest is found:

* Additional interface :ref:`imported target <Imported Targets>` is created
  manually in the project to encapsulate the CxxTest usage requirements and
  link it to specified tests.  Such target is useful, for example, when dealing
  with multiple tests.

* Test generator is invoked to create ``foo_test.cc`` in the current binary
  directory from the input header ``foo_test.h`` located in the current source
  directory.

* An executable named ``unit_test_foo`` is built and registered as a test in
  CTest.

.. code-block:: cmake
  :caption: ``CMakeLists.txt``

  find_package(CxxTest)

  # Create interface imported target:
  if(CXXTEST_FOUND AND NOT TARGET CxxTest::CxxTest)
    add_library(CxxTest::CxxTest INTERFACE IMPORTED)
    set_target_properties(
      CxxTest::CxxTest
      PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CXXTEST_INCLUDE_DIRS}"
    )
  endif()

  # Add test:
  if(CXXTEST_FOUND)
    enable_testing()

    cxxtest_add_test(
      unit_test_foo
      foo_test.cc
      ${CMAKE_CURRENT_SOURCE_DIR}/foo_test.h
    )

    target_link_libraries(
      unit_test_foo
      PRIVATE
        CxxTest::CxxTest
        # Link any project targets as needed, if test depends on them:
        foo
    )
  endif()

.. code-block:: c++
  :caption: ``foo_test.h``

  #include <cxxtest/TestSuite.h>

  class MyTestSuite : public CxxTest::TestSuite
  {
  public:
    void testAddition(void)
    {
      TS_ASSERT(1 + 1 > 1);
      TS_ASSERT_EQUALS(1 + 1, 2);
    }
  };
#]=======================================================================]

# Version 1.4 (11/18/10) (CMake 2.8.4)
#     Issue 11384: Added support to the CXX_ADD_TEST macro so header
#                  files (containing the tests themselves) show up in
#                  Visual Studio and other IDEs.
#
# Version 1.3 (8/19/10) (CMake 2.8.3)
#     Included patch by Simone Rossetto to check if either Python or Perl
#     are present in the system.  Whichever interpreter that is detected
#     is now used to run the test generator program.  If both interpreters
#     are detected, the CXXTEST_USE_PYTHON variable is obeyed.
#
#     Also added support for CXXTEST_TESTGEN_ARGS, for manually specifying
#     options to the CxxTest code generator.
# Version 1.2 (3/2/08)
#     Included patch from Tyler Roscoe to have the perl & python binaries
#     detected based on CXXTEST_INCLUDE_DIR
# Version 1.1 (2/9/08)
#     Clarified example to illustrate need to call target_link_libraries()
#     Changed commands to lowercase
#     Added licensing info
# Version 1.0 (1/8/08)
#     Fixed CXXTEST_INCLUDE_DIRS so it will work properly
#     Eliminated superfluous CXXTEST_FOUND assignment
#     Cleaned up and added more documentation

#=============================================================
# cxxtest_add_test (public macro)
#=============================================================
macro(CXXTEST_ADD_TEST _cxxtest_testname _cxxtest_outfname)
    set(_cxxtest_real_outfname ${CMAKE_CURRENT_BINARY_DIR}/${_cxxtest_outfname})

    add_custom_command(
        OUTPUT  ${_cxxtest_real_outfname}
        DEPENDS ${ARGN}
        COMMAND ${CXXTEST_TESTGEN_INTERPRETER}
        ${CXXTEST_TESTGEN_EXECUTABLE} ${CXXTEST_TESTGEN_ARGS} -o ${_cxxtest_real_outfname} ${ARGN}
    )

    set_source_files_properties(${_cxxtest_real_outfname} PROPERTIES GENERATED true)
    add_executable(${_cxxtest_testname} ${_cxxtest_real_outfname} ${ARGN})

    # There's no target used for these commands, so we don't need to do
    # anything here for CMP0178.
    if(CMAKE_RUNTIME_OUTPUT_DIRECTORY)
        add_test(${_cxxtest_testname} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${_cxxtest_testname})
    elseif(EXECUTABLE_OUTPUT_PATH)
        add_test(${_cxxtest_testname} ${EXECUTABLE_OUTPUT_PATH}/${_cxxtest_testname})
    else()
        add_test(${_cxxtest_testname} ${CMAKE_CURRENT_BINARY_DIR}/${_cxxtest_testname})
    endif()

endmacro()

#=============================================================
# main()
#=============================================================
if(NOT DEFINED CXXTEST_TESTGEN_ARGS)
  set(CXXTEST_TESTGEN_ARGS --error-printer)
endif()

find_package(Python QUIET)
find_package(Perl QUIET)

find_path(CXXTEST_INCLUDE_DIR cxxtest/TestSuite.h)
find_program(CXXTEST_PYTHON_TESTGEN_EXECUTABLE
         NAMES cxxtestgen cxxtestgen.py
         PATHS ${CXXTEST_INCLUDE_DIR})
find_program(CXXTEST_PERL_TESTGEN_EXECUTABLE cxxtestgen.pl
         PATHS ${CXXTEST_INCLUDE_DIR})

if(PYTHON_FOUND OR Perl_FOUND)
  include(FindPackageHandleStandardArgs)

  if(PYTHON_FOUND AND (CXXTEST_USE_PYTHON OR NOT Perl_FOUND OR NOT DEFINED CXXTEST_USE_PYTHON))
    set(CXXTEST_TESTGEN_EXECUTABLE ${CXXTEST_PYTHON_TESTGEN_EXECUTABLE})
    execute_process(COMMAND ${CXXTEST_PYTHON_TESTGEN_EXECUTABLE} --version
      OUTPUT_VARIABLE _CXXTEST_OUT ERROR_VARIABLE _CXXTEST_OUT RESULT_VARIABLE _CXXTEST_RESULT)
    if(_CXXTEST_RESULT EQUAL 0)
      set(CXXTEST_TESTGEN_INTERPRETER "")
    else()
      set(CXXTEST_TESTGEN_INTERPRETER ${Python_EXECUTABLE})
    endif()
    find_package_handle_standard_args(CxxTest DEFAULT_MSG
        CXXTEST_INCLUDE_DIR CXXTEST_PYTHON_TESTGEN_EXECUTABLE)

  elseif(Perl_FOUND)
    set(CXXTEST_TESTGEN_EXECUTABLE ${CXXTEST_PERL_TESTGEN_EXECUTABLE})
    set(CXXTEST_TESTGEN_INTERPRETER ${PERL_EXECUTABLE})
    find_package_handle_standard_args(CxxTest DEFAULT_MSG
        CXXTEST_INCLUDE_DIR CXXTEST_PERL_TESTGEN_EXECUTABLE)
  endif()

  if(CXXTEST_FOUND)
    set(CXXTEST_INCLUDE_DIRS ${CXXTEST_INCLUDE_DIR})
  endif()

else()

  set(CXXTEST_FOUND false)
  if(NOT CxxTest_FIND_QUIETLY)
    if(CxxTest_FIND_REQUIRED)
      message(FATAL_ERROR "Neither Python nor Perl found, cannot use CxxTest, aborting!")
    else()
      message(STATUS "Neither Python nor Perl found, CxxTest will not be used.")
    endif()
  endif()

endif()