Tengo un problema muy similar, pero la solución que aquí se presenta no es realmente satisfactoria. Al igual que el póster original, quiero ejecutar pruebas unitarias basadas en boost :: test.
Tengo varios proyectos de prueba, uno para cada componente principal de nuestro producto. Tener que ejecutar el objetivo de instalación antes de cada prueba significa recompilarlo todo solo para ejecutar las pruebas que pertenecen a un componente central. Eso es lo que quiero evitar.
Si cambio algo en un componente central, quiero compilar ese componente principal y las pruebas asociadas. Y luego ejecuta las pruebas. Cuando las pruebas tienen éxito, solo entonces quiero compilar y eventualmente instalar el resto.
Para ejecutar las pruebas en el depurador, me encontré con algunos scripts cmake muy útiles en: https://github.com/rpavlik/cmake-modules
Con esto, se pueden especificar todos los directorios de los archivos .DLL necesarios, y la variable de entorno PATH se establece para el nuevo proceso:
# 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
)
donde $ {} PL_RUNTIME_DIRS_DEBUG contiene los directorios donde los archivos DLL de impulso y todas las otras bibliotecas se pueden encontrar.
Ahora estoy buscando la forma en que puedo lograr algo similar con ADD_CUSTOM_COMMAND()
Actualización:
ADD_CUSTOM_COMMAND() puede tener varios comandos que cmake escribe en un archivo por lotes. Entonces, primero puede establecer la ruta con todos los directorios de tiempo de ejecución y luego ejecutar el ejecutable de prueba. Para poder ejecutar fácilmente las pruebas de forma manual, dejo que cmake crear un archivo por lotes adicional en el directorio de construcción:
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()
Con esto, las pruebas unitarias atrapan los errores tan pronto como sea posible, sin tener que compilar el conjunto mucho primero
http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:install –