CMake не может найти тест, если CMAKE_RUNTIME_OUTPUT_DIRECTORY изменен

Я строю свой проект с помощью CMake и пытаюсь создать набор тестовых наборов для каждого модуля. Видимо, если я изменю переменную CMAKE_RUNTIME_OUTPUT_DIRECTORY тогда ctest не может найти тест для запуска и не работает.

Я сделал минимальный пример, чтобы продемонстрировать, о чем я говорю, и я запускаю его с CMake 2.8.11.2 на Lubuntu 13.10. Буду признателен, если кто-нибудь скажет мне, является ли это ошибкой и / или как обойти ее. Благодарю.

файл CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (Test)

# Put all tests in the test directory, where the sources also are
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/test)

enable_testing()

add_subdirectory (${PROJECT_SOURCE_DIR}/test)

файл test/CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

add_executable(ttest main.cpp)
add_test(ttest ttest)

файл test/main.cpp:

int main() {
    return 0;
}

После сборки в новой папке build, исполняемый файл правильно создан в папке test, Бег make test Результаты сборки в следующем выводе:

Running tests...
Test project /home/svalorzen/Tests/cmake/build
    Start 1: ttest
Could not find executable ttest
Looked in the following places:
ttest
ttest
Release/ttest
Release/ttest
Debug/ttest
Debug/ttest
MinSizeRel/ttest
MinSizeRel/ttest
RelWithDebInfo/ttest
RelWithDebInfo/ttest
Deployment/ttest
Deployment/ttest
Development/ttest
Development/ttest
Unable to find executable: ttest
1/1 Test #1: ttest ............................***Not Run   0.00 sec

0% tests passed, 1 tests failed out of 1

Total Test time (real) =   0.00 sec

The following tests FAILED:
      1 - ttest (Not Run)
Errors while running CTest
make: *** [test] Error 8

4 ответа

Решение

редактировать:

на самом деле я что-то пропустил в документации для add_test:

Если COMMAND указывает исполняемую цель (созданную add_executable), она автоматически будет заменена расположением исполняемого файла, созданного во время сборки

Итак, используя ttest вместо $<TARGET_FILE:ttest> должно сработать.


У меня та же проблема, но я не знаю точно, это ошибка или нет.

Решением, которое я нашел для этого, является предоставление пути тестового исполняемого файла в команде (с целевым ttest):

в тесте /CMakeLists.txt:

add_test(ttest test/ttest)

В конце концов, вы хотели бы сохранить путь в переменной, чтобы написать что-то вроде ${test_dir}/ttest,

Если вы хотите что-то более надежное, лучше всего использовать длинную команду add_test и выражения генератора:

add_test(NAME ttest COMMAND $<TARGET_FILE:ttest>)

Выражение поколения $<TARGET_FILE:ttest> развернемся до выходного файла исполняемой цели (ttest здесь), так что вы уверены, что с каталогом проблем нет. Есть другое выражение, упомянутое в документации по cmake.

Это может быть немного многословно, если у вас есть много тестов для объявления, поэтому я использую такой макрос:

macro (create_test target)
  add_test (NAME ${target} COMMAND $<TARGET_FILE:${target}>)
endmacro (create_test)

#[some code]

#test definition
create_test(ttest)

Предполагая, что имя теста совпадает с именем исполняемого файла.

Я не мог найти другое рабочее решение. Можно установить рабочий каталог с помощью add_test Это, очевидно, заставляет ctest найти исполняемый файл, но затем тест завершается с ошибкой "BAD_COMMAND".

Я новичок в cmake, так что может быть есть другое решение.

Используйте команду:

add_test(NAME ttest COMMAND $<TARGET_FILE:ttest>)

Пишу NAME а также COMMAND обязательно при использовании TARGET_FILE (или по крайней мере это не работает для меня иначе. Используйте cmake --help-command add_test для дополнительной информации.

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

Так что если у вас есть что-то вроде этого:

    add_test(NAME "name" COMMAND "testExe arg1 arg2 arg3")

Вместо этого сделайте это:

    add_test(NAME "name" COMMAND "testExe" "arg1" "arg2" "arg3")

В противном случае CMake попытается найти имя исполняемого файла теста с пробелами в нем.

Использование четкого ИМЯ и КОМАНДЫ решает проблему для меня

      add_test(NAME ttest COMMAND ttest)
Другие вопросы по тегам