У меня очень похожая проблема, но представленное здесь решение не является действительно удовлетворительным.Как и оригинальный постер, я хочу запустить модульные тесты на основе boost :: test.
У меня есть несколько тестовых проектов, по одному для каждого компонента мэра нашего продукта.Необходимость запуска цели установки перед каждым тестом означает перекомпиляцию всего, чтобы запустить тесты, относящиеся к основному компоненту.Вот чего я хочу избежать.
Если я что-то изменю в основном компоненте, я хочу скомпилировать этот основной компонент и связанные с ним тесты.А затем запустите тесты.Когда тесты пройдут успешно, только тогда я захочу скомпилировать и в конце концов установить оставшуюся часть.
Для запуска тестов в отладчике я нашел несколько очень полезных скриптов cmake по адресу: https://github.com/rpavlik/cmake-modules
С этим я могу указать все каталоги необходимых библиотек, и переменная окружения PATH будет установлена для нового процесса:
# for debugging
INCLUDE(CreateLaunchers)
create_target_launcher(PLCoreTests
ARGS "--run-test=Core1"
RUNTIME_LIBRARY_DIRS ${PL_RUNTIME_DIRS_DEBUG} ${PROJECT_BINARY_DIR}/bin/Debug
WORKING_DIRECTORY ${PL_MAIN_DIR}/App/PL/bin
)
Где $ {PL_RUNTIME_DIRS_DEBUG} содержит каталоги, в которых библиотек DLL от повышенияи все остальные библиотеки можно найти.
Теперь я ищу, как мне добиться чего-то похожего с ADD_CUSTOM_COMMAND ()
Обновление:
ADD_CUSTOM_COMMAND () может иметьнесколько команд, которые cmake записывает в командный файл.Итак, вы можете сначала задать путь со всеми каталогами времени выполнения, а затем выполнить исполняемый файл теста.Чтобы можно было легко выполнять тесты вручную, я позволил cmake создать дополнительный командный файл в каталоге сборки:
MACRO(RunUnitTest TestTargetName)
IF(RUN_UNIT_TESTS)
SET(TEMP_RUNTIME_DIR ${PROJECT_BINARY_DIR}/bin/Debug)
FOREACH(TmpRuntimeDir ${PL_RUNTIME_DIRS_DEBUG})
SET(TEMP_RUNTIME_DIR ${TEMP_RUNTIME_DIR} ${TmpRuntimeDir})
ENDFOREACH(TmpRuntimeDir)
ADD_CUSTOM_COMMAND(TARGET ${TestTargetName} POST_BUILD
COMMAND echo "PATH=${TEMP_RUNTIME_DIR};%PATH%" > ${TestTargetName}_script.bat
COMMAND echo ${TestTargetName}.exe --result_code=no --report_level=no >> ${TestTargetName}_script.bat
COMMAND ${TestTargetName}_script.bat
WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug
)
ENDIF(RUN_UNIT_TESTS)
ENDMACRO()
При этом модульные тесты отлавливают ошибки как можно скорее, без необходимости компилироватьсначала весь лот.