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)