forked from catchorg/Catch2
		
	
		
			
	
	
		
			186 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			186 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								<a id="top"></a>
							 | 
						||
| 
								 | 
							
								# CMake integration
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Because we use CMake to build Catch2, we also provide a couple of
							 | 
						||
| 
								 | 
							
								integration points for our users.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1) Catch2 exports a (namespaced) CMake target
							 | 
						||
| 
								 | 
							
								2) Catch2's repository contains CMake scripts for automatic registration
							 | 
						||
| 
								 | 
							
								of `TEST_CASE`s in CTest
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## CMake target
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Catch2's CMake build exports an interface target `Catch2::Catch2`. Linking
							 | 
						||
| 
								 | 
							
								against it will add the proper include path and all necessary capabilities
							 | 
						||
| 
								 | 
							
								to the resulting binary.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This means that if Catch2 has been installed on the system, it should be
							 | 
						||
| 
								 | 
							
								enough to do:
							 | 
						||
| 
								 | 
							
								```cmake
							 | 
						||
| 
								 | 
							
								find_package(Catch2 REQUIRED)
							 | 
						||
| 
								 | 
							
								target_link_libraries(tests Catch2::Catch2)
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This target is also provided when Catch2 is used as a subdirectory.
							 | 
						||
| 
								 | 
							
								Assuming that Catch2 has been cloned to `lib/Catch2`:
							 | 
						||
| 
								 | 
							
								```cmake
							 | 
						||
| 
								 | 
							
								add_subdirectory(lib/Catch2)
							 | 
						||
| 
								 | 
							
								target_link_libraries(tests Catch2::Catch2)
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Automatic test registration
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Catch2's repository also contains two CMake scripts that help users
							 | 
						||
| 
								 | 
							
								with automatically registering their `TEST_CASE`s with CTest. They
							 | 
						||
| 
								 | 
							
								can be found in the `contrib` folder, and are
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1) `Catch.cmake` (and its dependency `CatchAddTests.cmake`)
							 | 
						||
| 
								 | 
							
								2) `ParseAndAddCatchTests.cmake`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If Catch2 has been installed in system, both of these can be used after
							 | 
						||
| 
								 | 
							
								doing `find_package(Catch2 REQUIRED)`. Otherwise you need to add them
							 | 
						||
| 
								 | 
							
								to your CMake module path.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### `Catch.cmake` and `AddCatchTests.cmake`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`Catch.cmake` provides function `catch_discover_tests` to get tests from
							 | 
						||
| 
								 | 
							
								a target. This function works by running the resulting executable with
							 | 
						||
| 
								 | 
							
								`--list-test-names-only` flag, and then parsing the output to find all
							 | 
						||
| 
								 | 
							
								existing tests. 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Usage
							 | 
						||
| 
								 | 
							
								```cmake
							 | 
						||
| 
								 | 
							
								cmake_minimum_required(VERSION 3.5)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								project(baz LANGUAGES CXX VERSION 0.0.1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								find_package(Catch2 REQUIRED)
							 | 
						||
| 
								 | 
							
								add_executable(foo test.cpp)
							 | 
						||
| 
								 | 
							
								target_link_libraries(foo Catch2::Catch2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								include(CTest)
							 | 
						||
| 
								 | 
							
								include(Catch)
							 | 
						||
| 
								 | 
							
								catch_discover_tests(foo)
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Customization
							 | 
						||
| 
								 | 
							
								`catch_discover_tests` can be given several extra argumets:
							 | 
						||
| 
								 | 
							
								```cmake
							 | 
						||
| 
								 | 
							
								catch_discover_tests(target
							 | 
						||
| 
								 | 
							
								                     [TEST_SPEC arg1...]
							 | 
						||
| 
								 | 
							
								                     [EXTRA_ARGS arg1...]
							 | 
						||
| 
								 | 
							
								                     [WORKING_DIRECTORY dir]
							 | 
						||
| 
								 | 
							
								                     [TEST_PREFIX prefix]
							 | 
						||
| 
								 | 
							
								                     [TEST_SUFFIX suffix]
							 | 
						||
| 
								 | 
							
								                     [PROPERTIES name1 value1...]
							 | 
						||
| 
								 | 
							
								                     [TEST_LIST var]
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `TEST_SPEC arg1...`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Specifies test cases, wildcarded test cases, tags and tag expressions to
							 | 
						||
| 
								 | 
							
								pass to the Catch executable alongside the `--list-test-names-only` flag.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `EXTRA_ARGS arg1...`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Any extra arguments to pass on the command line to each test case.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `WORKING_DIRECTORY dir`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Specifies the directory in which to run the discovered test cases.  If this
							 | 
						||
| 
								 | 
							
								option is not provided, the current binary directory is used.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `TEST_PREFIX prefix`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Specifies a _prefix_ to be added to the name of each discovered test case.
							 | 
						||
| 
								 | 
							
								This can be useful when the same test executable is being used in multiple
							 | 
						||
| 
								 | 
							
								calls to `catch_discover_tests()`, with different `TEST_SPEC` or `EXTRA_ARGS`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `TEST_SUFFIX suffix`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Same as `TEST_PREFIX`, except it specific the _suffix_ for the test names.
							 | 
						||
| 
								 | 
							
								Both `TEST_PREFIX` and `TEST_SUFFIX` can be specified at the same time.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `PROPERTIES name1 value1...`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Specifies additional properties to be set on all tests discovered by this
							 | 
						||
| 
								 | 
							
								invocation of `catch_discover_tests`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `TEST_LIST var`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Make the list of tests available in the variable `var`, rather than the
							 | 
						||
| 
								 | 
							
								default `<target>_TESTS`.  This can be useful when the same test
							 | 
						||
| 
								 | 
							
								executable is being used in multiple calls to `catch_discover_tests()`.
							 | 
						||
| 
								 | 
							
								Note that this variable is only available in CTest.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### `ParseAndAddCatchTests.cmake`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`ParseAndAddCatchTests` works by parsing all implementation files
							 | 
						||
| 
								 | 
							
								associated with the provided target, and registering them via CTest's
							 | 
						||
| 
								 | 
							
								`add_test`. This approach has some limitations, such as the fact that
							 | 
						||
| 
								 | 
							
								commented-out tests will be registered anyway.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```cmake
							 | 
						||
| 
								 | 
							
								cmake_minimum_required(VERSION 3.5)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								project(baz LANGUAGES CXX VERSION 0.0.1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								find_package(Catch2 REQUIRED)
							 | 
						||
| 
								 | 
							
								add_executable(foo test.cpp)
							 | 
						||
| 
								 | 
							
								target_link_libraries(foo Catch2::Catch2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								include(CTest)
							 | 
						||
| 
								 | 
							
								include(ParseAndAddCatchTests)
							 | 
						||
| 
								 | 
							
								ParseAndAddCatchTests(foo)
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### Customization
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`ParseAndAddCatchTests` provides some customization points:
							 | 
						||
| 
								 | 
							
								* `PARSE_CATCH_TESTS_VERBOSE` -- When `ON`, the script prints debug
							 | 
						||
| 
								 | 
							
								messages. Defaults to `OFF`.
							 | 
						||
| 
								 | 
							
								* `PARSE_CATCH_TESTS_NO_HIDDEN_TESTS` -- When `ON`, hidden tests (tests
							 | 
						||
| 
								 | 
							
								tagged with any of `[!hide]`, `[.]` or `[.foo]`) will not be registered.
							 | 
						||
| 
								 | 
							
								Defaults to `OFF`.
							 | 
						||
| 
								 | 
							
								* `PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME` -- When `ON`, adds fixture
							 | 
						||
| 
								 | 
							
								class name to the test name in CTest. Defaults to `ON`.
							 | 
						||
| 
								 | 
							
								* `PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME` -- When `ON`, adds target
							 | 
						||
| 
								 | 
							
								name to the test name in CTest. Defaults to `ON`.
							 | 
						||
| 
								 | 
							
								* `PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS` -- When `ON`, adds test
							 | 
						||
| 
								 | 
							
								file to `CMAKE_CONFIGURE_DEPENDS`. This means that the CMake configuration
							 | 
						||
| 
								 | 
							
								step will be re-ran when the test files change, letting new tests be
							 | 
						||
| 
								 | 
							
								automatically discovered. Defaults to `OFF`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## CMake project options
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Catch2's CMake project also provides some options for other projects
							 | 
						||
| 
								 | 
							
								that consume it. These are
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* `CATCH_BUILD_EXAMPLES` -- When `ON`, Catch2's usage examples will be
							 | 
						||
| 
								 | 
							
								built. Defaults to `OFF`.
							 | 
						||
| 
								 | 
							
								* `CATCH_INSTALL_DOCS` -- When `ON`, Catch2's documentation will be
							 | 
						||
| 
								 | 
							
								included in the installation. Defaults to `ON`.
							 | 
						||
| 
								 | 
							
								* `CATCH_INSTALL_HELPERS` -- When `ON`, Catch2's contrib folder will be
							 | 
						||
| 
								 | 
							
								included in the installation. Defaults to `ON`.
							 | 
						||
| 
								 | 
							
								* `BUILD_TESTING` -- When `ON` and the project is not used as a subproject,
							 | 
						||
| 
								 | 
							
								Catch2's test binary will be built. Defaults to `ON`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[Home](Readme.md#top)
							 |