Подтвердить что ты не робот

CMake: настройка переменной среды для ctest (или иначе получение неудачного тестового вывода из теста ctest/make автоматически)

Я хочу, чтобы ctest показывал мне результат неудачных тестов по умолчанию. То есть, я хочу запустить:

$ make all test

и увидеть любой результат неудачных тестов без необходимости cat Testing/Temporary/LastTest.log.

Кажется, что есть два способа сделать это:

(1) Установка переменной CTEST_OUTPUT_ON_FAILURE для окружающей среды:

 $ CTEST_OUTPUT_ON_FAILURE=1 make all test
 $ # or CTEST_OUTPUT_ON_FAILURE=1 ctest

(2) Указание флага --output-on-failure на вызов ctest:

 $ ctest --output-on-failure

Есть ли способ написать файл CMakeLists.txt, так что ctests dumps неудачно завершает вывод тестов по умолчанию при обычном вызове "сделать все тесты" БЕЗ использования экспорта глобальной переменной во время сеанса или прибегая к таргетингу, например make check (как описано здесь)?

Я знаю команду SET_TESTS_PROPERTIES(), но пробую ее следующим образом:

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")

и экспериментирование показывает, что в оболочке задана переменная окружения, в которой выполняется тестовая программа, но не в оболочке, в которой выполняется ctest.

4b9b3361

Ответ 1

Невозможно изменить встроенную цель test, но вы можете добавить пользовательскую цель check, которая вызывает ctest с помощью переключателя --output-on-failure следующим образом:

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()

Пользовательская цель должна быть настроена по-разному для однострочных и многоконфигурированных сборок. В последнем случае конфигурация активной сборки должна быть передана при вызове ctest с использованием флага --build-config. По умолчанию --force-new-ctest-process используется встроенным объектом test.