2015-05-08 2 views
2

Использование CMake, у меня есть ряд исполняемых файлов, которые построены, а затем добавляют в качестве тестов, например:CMake - Как создать исполняемый файл, но не добавить его цели?

set(TestID 1) 
add_executable (Test${TestID} Test${TestID}.cpp) 

# Create test 
configure_file(${TestID}.endf ${TestID}.endf COPYONLY) 
add_test(NAME ${TestID} COMMAND Test${TestID}) 

Это прекрасно работает, исполняемые файлы создаются и тесты добавлены правильно. Однако я не хочу, чтобы тестовые исполняемые файлы добавлялись к цели all.

Вместо того, чтобы мои тесты были построены вместе со всем остальным, я хотел бы, чтобы они были построены непосредственно перед выполнением тестов; возможно, как часть make test или как часть ctest.

Как это сделать?

ответ

4

Установите EXCLUDE_FROM_ALL флаг на создание целевого тест исполняемого для исключения цели из all цели:

add_executable (Test${TestID} EXCLUDE_FROM_ALL Test${TestID}.cpp) 

Убедившись, что тестовые цели построены до выполнения тестов является более сложным. Вы не можете добавить зависимость к встроенной цели test с add_dependencies, потому что цель test принадлежит к группе зарезервированных целей (например, all, clean и еще нескольким другим), которые существуют только в созданной системе сборки.

В качестве рабочего решения вы можете использовать свойство каталога TEST_INCLUDE_FILE, чтобы запустить сборку необходимых тестовых исполняемых файлов до запуска тестов. Создайте файл BuildTestTargets.cmake.in в исходном каталоге со следующим содержанием:

execute_process(COMMAND "@[email protected]" --build . --target Test1) 
execute_process(COMMAND "@[email protected]" --build . --target Test2) 

Затем добавьте следующий код в ваш CMakeLists.txt:

configure_file("BuildTestTargets.cmake.in" "BuildTestTargets.cmake") 
set_directory_properties(PROPERTIES TEST_INCLUDE_FILE 
    "${CMAKE_CURRENT_BINARY_DIR}/BuildTestTargets.cmake") 

CTest будет включать в себя и запустить файл BuildTestTargets.cmake в качестве первого шага до тесты выполняются.

+1

Ну, это отвечало на мой вопрос, поскольку я специально спросил его. Но что я действительно хотел (разве вы не могли прочитать мои мысли?), Чтобы эти цели были созданы, когда я выполняю 'make test ...' или 'ctest ...'. Как я могу заставить это случиться? Я обновил свой вопрос, поэтому вам больше не нужно читать мой разум. – jlconlin