| <a id="top"></a> | |
| # CMake integration | |
| **Contents**<br> | |
| [CMake target](#cmake-target)<br> | |
| [Automatic test registration](#automatic-test-registration)<br> | |
| [CMake project options](#cmake-project-options)<br> | |
| [Installing Catch2 from git repository](#installing-catch2-from-git-repository)<br> | |
| [Installing Catch2 from vcpkg](#installing-catch2-from-vcpkg)<br> | |
| 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) | |
| ``` | |
| Another possibility is to use [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html): | |
| ```cmake | |
| Include(FetchContent) | |
| FetchContent_Declare( | |
| Catch2 | |
| GIT_REPOSITORY https://github.com/catchorg/Catch2.git | |
| GIT_TAG v2.13.1) | |
| FetchContent_MakeAvailable(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` (deprecated) | |
| 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 `CatchAddTests.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] | |
| [REPORTER reporter] | |
| [OUTPUT_DIR dir] | |
| [OUTPUT_PREFIX prefix] | |
| [OUTPUT_SUFFIX suffix] | |
| ) | |
| ``` | |
| * `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. | |
| * `REPORTER reporter` | |
| Use the specified reporter when running the test case. The reporter will | |
| be passed to the test runner as `--reporter reporter`. | |
| * `OUTPUT_DIR dir` | |
| If specified, the parameter is passed along as | |
| `--out dir/<test_name>` to test executable. The actual file name is the | |
| same as the test name. This should be used instead of | |
| `EXTRA_ARGS --out foo` to avoid race conditions writing the result output | |
| when using parallel test execution. | |
| * `OUTPUT_PREFIX prefix` | |
| May be used in conjunction with `OUTPUT_DIR`. | |
| If specified, `prefix` is added to each output file name, like so | |
| `--out dir/prefix<test_name>`. | |
| * `OUTPUT_SUFFIX suffix` | |
| May be used in conjunction with `OUTPUT_DIR`. | |
| If specified, `suffix` is added to each output file name, like so | |
| `--out dir/<test_name>suffix`. This can be used to add a file extension to | |
| the output file name e.g. ".xml". | |
| ### `ParseAndAddCatchTests.cmake` | |
| ⚠ This script is [deprecated](https://github.com/catchorg/Catch2/pull/2120) | |
| in Catch 2.13.4 and superseded by the above approach using `catch_discover_tests`. | |
| See [#2092](https://github.com/catchorg/Catch2/issues/2092) for details. | |
| `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. More serious, only a | |
| subset of the assertion macros currently available in Catch can be | |
| detected by this script and tests with any macros that cannot be | |
| parsed are *silently ignored*. | |
| #### 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`. | |
| Optionally, one can specify a launching command to run tests by setting the | |
| variable `OptionalCatchTestLauncher` before calling `ParseAndAddCatchTests`. For | |
| instance to run some tests using `MPI` and other sequentially, one can write | |
| ```cmake | |
| set(OptionalCatchTestLauncher ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${NUMPROC}) | |
| ParseAndAddCatchTests(mpi_foo) | |
| unset(OptionalCatchTestLauncher) | |
| ParseAndAddCatchTests(bar) | |
| ``` | |
| ## CMake project options | |
| Catch2's CMake project also provides some options for other projects | |
| that consume it. These are | |
| * `CATCH_BUILD_TESTING` -- When `ON`, Catch2's SelfTest project will be | |
| built. Defaults to `ON`. Note that Catch2 also obeys `BUILD_TESTING` CMake | |
| variable, so _both_ of them need to be `ON` for the SelfTest to be built, | |
| and either of them can be set to `OFF` to disable building SelfTest. | |
| * `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`. | |
| ## Installing Catch2 from git repository | |
| If you cannot install Catch2 from a package manager (e.g. Ubuntu 16.04 | |
| provides catch only in version 1.2.0) you might want to install it from | |
| the repository instead. Assuming you have enough rights, you can just | |
| install it to the default location, like so: | |
| ``` | |
| $ git clone https://github.com/catchorg/Catch2.git | |
| $ cd Catch2 | |
| $ cmake -Bbuild -H. -DBUILD_TESTING=OFF | |
| $ sudo cmake --build build/ --target install | |
| ``` | |
| If you do not have superuser rights, you will also need to specify | |
| [CMAKE_INSTALL_PREFIX](https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html) | |
| when configuring the build, and then modify your calls to | |
| [find_package](https://cmake.org/cmake/help/latest/command/find_package.html) | |
| accordingly. | |
| ## Installing Catch2 from vcpkg | |
| Alternatively, you can build and install Catch2 using [vcpkg](https://github.com/microsoft/vcpkg/) dependency manager: | |
| ``` | |
| git clone https://github.com/Microsoft/vcpkg.git | |
| cd vcpkg | |
| ./bootstrap-vcpkg.sh | |
| ./vcpkg integrate install | |
| ./vcpkg install catch2 | |
| ``` | |
| The catch2 port in vcpkg is kept up to date by microsoft team members and community contributors. | |
| If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. | |
| --- | |
| [Home](Readme.md#top) | |