CMake: setting an environmental variable for ctest (or otherwise getting failed test output from ctest/make test automatically)

cmake, ctest, environment-variables, output, testing

Solution

The built-in `test` target cannot be modified, but you can add a custom `check` target which invokes `ctest` with the `--output-on-failure` switch in the following way:

if (CMAKE_CONFIGURATION_TYPES)
    add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} 
        --force-new-ctest-process --output-on-failure 
        --build-config "$<CONFIGURATION>")
else()
    add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} 
        --force-new-ctest-process --output-on-failure)
endif()

The custom target has to be set up differently for single build type and multi-configuration builds. In the latter case, the active build configuration has to be passed on to the `ctest` invocation using the `--build-config` flag. The `--force-new-ctest-process` is used by the built-in `test` target by default.

Problem

I want ctest to show me the failed tests output by default. That is, I want to run: ``` $ make all test ``` and see any output of failed tests without having to `cat Testing/Temporary/LastTest.log`. It appears that there are two ways of doing this: (1) Setting the `CTEST_OUTPUT_ON_FAILURE` environmental variable: ``` $ CTEST_OUTPUT_ON_FAILURE=1 make all test $ # or CTEST_OUTPUT_ON_FAILURE=1 ctest ``` (2) Specifying the `--output-on-failure` flag to the `ctest` invocation: ``` $ ctest --output-on-failure ``` Is there a way to write a CMakeLists.txt file such that ctests dumps failed tests output by default on a normal "make all test" invocation WITHOUT resorting to exporting the environmental variable globally in the session or resorting to a custom target like `make check` (as described here)? I am aware of the `SET_TESTS_PROPERTIES()` command, but trying it out like this: ``` CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(testenv CXX) ENABLE_TESTING() ADD_EXECUTABLE(hello hello.cpp) ADD_TEST(testhello hello) # Following sets the environment variable for the shell in which the test # progoram 'hello' is run, but not the shell in which ctest is run SET_TESTS_PROPERTIES(testhello PROPERTIES ENVIRONMENT "CTEST_OUTPUT_ON_FAILURE=1") ``` and experimenting shows that the environmental variable is set in the shell that the test program is executed in, but not in the shell that ctest is executed in.

Original source

Related problems