FindCxxTest.cmake (7815B)
1 # - Find CxxTest 2 # Find the CxxTest suite and declare a helper macro for creating unit tests 3 # and integrating them with CTest. 4 # For more details on CxxTest see http://cxxtest.tigris.org 5 # 6 # INPUT Variables 7 # 8 # CXXTEST_USE_PYTHON [deprecated since 1.3] 9 # Only used in the case both Python & Perl 10 # are detected on the system to control 11 # which CxxTest code generator is used. 12 # Valid only for CxxTest version 3. 13 # 14 # NOTE: In older versions of this Find Module, 15 # this variable controlled if the Python test 16 # generator was used instead of the Perl one, 17 # regardless of which scripting language the 18 # user had installed. 19 # 20 # CXXTEST_TESTGEN_ARGS (since CMake 2.8.3) 21 # Specify a list of options to pass to the CxxTest code 22 # generator. If not defined, --error-printer is 23 # passed. 24 # 25 # OUTPUT Variables 26 # 27 # CXXTEST_FOUND 28 # True if the CxxTest framework was found 29 # CXXTEST_INCLUDE_DIRS 30 # Where to find the CxxTest include directory 31 # CXXTEST_PERL_TESTGEN_EXECUTABLE 32 # The perl-based test generator 33 # CXXTEST_PYTHON_TESTGEN_EXECUTABLE 34 # The python-based test generator 35 # CXXTEST_TESTGEN_EXECUTABLE (since CMake 2.8.3) 36 # The test generator that is actually used (chosen using user preferences 37 # and interpreters found in the system) 38 # CXXTEST_TESTGEN_INTERPRETER (since CMake 2.8.3) 39 # The full path to the Perl or Python executable on the system 40 # 41 # MACROS for optional use by CMake users: 42 # 43 # CXXTEST_ADD_TEST(<test_name> <gen_source_file> <input_files_to_testgen...>) 44 # Creates a CxxTest runner and adds it to the CTest testing suite 45 # Parameters: 46 # test_name The name of the test 47 # gen_source_file The generated source filename to be 48 # generated by CxxTest 49 # input_files_to_testgen The list of header files containing the 50 # CxxTest::TestSuite's to be included in 51 # this runner 52 # 53 # #============== 54 # Example Usage: 55 # 56 # find_package(CxxTest) 57 # if(CXXTEST_FOUND) 58 # include_directories(${CXXTEST_INCLUDE_DIR}) 59 # enable_testing() 60 # 61 # CXXTEST_ADD_TEST(unittest_foo foo_test.cc 62 # ${CMAKE_CURRENT_SOURCE_DIR}/foo_test.h) 63 # target_link_libraries(unittest_foo foo) # as needed 64 # endif() 65 # 66 # This will (if CxxTest is found): 67 # 1. Invoke the testgen executable to autogenerate foo_test.cc in the 68 # binary tree from "foo_test.h" in the current source directory. 69 # 2. Create an executable and test called unittest_foo. 70 # 71 # #============= 72 # Example foo_test.h: 73 # 74 # #include <cxxtest/TestSuite.h> 75 # 76 # class MyTestSuite : public CxxTest::TestSuite 77 # { 78 # public: 79 # void testAddition( void ) 80 # { 81 # TS_ASSERT( 1 + 1 > 1 ); 82 # TS_ASSERT_EQUALS( 1 + 1, 2 ); 83 # } 84 # }; 85 # 86 87 #============================================================================= 88 # Copyright 2008-2010 Kitware, Inc. 89 # Copyright 2008-2010 Philip Lowman <philip@yhbt.com> 90 # 91 # Distributed under the OSI-approved BSD License (the "License"); 92 # see accompanying file Copyright.txt for details. 93 # 94 # This software is distributed WITHOUT ANY WARRANTY; without even the 95 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 96 # See the License for more information. 97 #============================================================================= 98 # (To distribute this file outside of CMake, substitute the full 99 # License text for the above reference.) 100 101 # Version 1.4 (11/18/10) (CMake 2.8.4) 102 # Issue 11384: Added support to the CXX_ADD_TEST macro so header 103 # files (containing the tests themselves) show up in 104 # Visual Studio and other IDEs. 105 # 106 # Version 1.3 (8/19/10) (CMake 2.8.3) 107 # Included patch by Simone Rossetto to check if either Python or Perl 108 # are present in the system. Whichever interpreter that is detected 109 # is now used to run the test generator program. If both interpreters 110 # are detected, the CXXTEST_USE_PYTHON variable is obeyed. 111 # 112 # Also added support for CXXTEST_TESTGEN_ARGS, for manually specifying 113 # options to the CxxTest code generator. 114 # Version 1.2 (3/2/08) 115 # Included patch from Tyler Roscoe to have the perl & python binaries 116 # detected based on CXXTEST_INCLUDE_DIR 117 # Version 1.1 (2/9/08) 118 # Clarified example to illustrate need to call target_link_libraries() 119 # Changed commands to lowercase 120 # Added licensing info 121 # Version 1.0 (1/8/08) 122 # Fixed CXXTEST_INCLUDE_DIRS so it will work properly 123 # Eliminated superfluous CXXTEST_FOUND assignment 124 # Cleaned up and added more documentation 125 126 #============================================================= 127 # CXXTEST_ADD_TEST (public macro) 128 #============================================================= 129 macro(CXXTEST_ADD_TEST _cxxtest_testname _cxxtest_outfname) 130 set(_cxxtest_real_outfname ${CMAKE_CURRENT_BINARY_DIR}/${_cxxtest_outfname}) 131 132 add_custom_command( 133 OUTPUT ${_cxxtest_real_outfname} 134 DEPENDS ${ARGN} 135 COMMAND ${CXXTEST_TESTGEN_INTERPRETER} 136 ${CXXTEST_TESTGEN_EXECUTABLE} ${CXXTEST_TESTGEN_ARGS} -o ${_cxxtest_real_outfname} ${ARGN} 137 ) 138 139 set_source_files_properties(${_cxxtest_real_outfname} PROPERTIES GENERATED true) 140 add_executable(${_cxxtest_testname} ${_cxxtest_real_outfname} ${ARGN}) 141 142 if(CMAKE_RUNTIME_OUTPUT_DIRECTORY) 143 add_test(${_cxxtest_testname} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${_cxxtest_testname}) 144 elseif(EXECUTABLE_OUTPUT_PATH) 145 add_test(${_cxxtest_testname} ${EXECUTABLE_OUTPUT_PATH}/${_cxxtest_testname}) 146 else() 147 add_test(${_cxxtest_testname} ${CMAKE_CURRENT_BINARY_DIR}/${_cxxtest_testname}) 148 endif() 149 150 endmacro(CXXTEST_ADD_TEST) 151 152 #============================================================= 153 # main() 154 #============================================================= 155 if(NOT DEFINED CXXTEST_TESTGEN_ARGS) 156 set(CXXTEST_TESTGEN_ARGS --error-printer) 157 endif() 158 159 find_package(PythonInterp QUIET) 160 find_package(Perl QUIET) 161 162 find_path(CXXTEST_INCLUDE_DIR cxxtest/TestSuite.h) 163 find_program(CXXTEST_PYTHON_TESTGEN_EXECUTABLE 164 NAMES cxxtestgen cxxtestgen.py 165 PATHS ${CXXTEST_INCLUDE_DIR}) 166 find_program(CXXTEST_PERL_TESTGEN_EXECUTABLE cxxtestgen.pl 167 PATHS ${CXXTEST_INCLUDE_DIR}) 168 169 if(PYTHONINTERP_FOUND OR PERL_FOUND) 170 include(FindPackageHandleStandardArgs) 171 172 if(PYTHONINTERP_FOUND AND (CXXTEST_USE_PYTHON OR NOT PERL_FOUND OR NOT DEFINED CXXTEST_USE_PYTHON)) 173 set(CXXTEST_TESTGEN_EXECUTABLE ${CXXTEST_PYTHON_TESTGEN_EXECUTABLE}) 174 set(CXXTEST_TESTGEN_INTERPRETER ${PYTHON_EXECUTABLE}) 175 FIND_PACKAGE_HANDLE_STANDARD_ARGS(CxxTest DEFAULT_MSG 176 CXXTEST_INCLUDE_DIR CXXTEST_PYTHON_TESTGEN_EXECUTABLE) 177 178 elseif(PERL_FOUND) 179 set(CXXTEST_TESTGEN_EXECUTABLE ${CXXTEST_PERL_TESTGEN_EXECUTABLE}) 180 set(CXXTEST_TESTGEN_INTERPRETER ${PERL_EXECUTABLE}) 181 FIND_PACKAGE_HANDLE_STANDARD_ARGS(CxxTest DEFAULT_MSG 182 CXXTEST_INCLUDE_DIR CXXTEST_PERL_TESTGEN_EXECUTABLE) 183 endif() 184 185 if(CXXTEST_FOUND) 186 set(CXXTEST_INCLUDE_DIRS ${CXXTEST_INCLUDE_DIR}) 187 endif() 188 189 else() 190 191 set(CXXTEST_FOUND false) 192 if(NOT CxxTest_FIND_QUIETLY) 193 if(CxxTest_FIND_REQUIRED) 194 message(FATAL_ERROR "Neither Python nor Perl found, cannot use CxxTest, aborting!") 195 else() 196 message(STATUS "Neither Python nor Perl found, CxxTest will not be used.") 197 endif() 198 endif() 199 200 endif()