Usaría add_custom_command
para lograr esto junto con cmake -E copy_if_different...
. Para información completa ejecutar
cmake --help-command add_custom_command
cmake -E
Así, en su caso, si usted tiene la siguiente estructura de directorios:
/CMakeLists.txt
/src
/libs/test.dll
y su objetivo CMake al que se aplica el comando es MyTest
, entonces podría agregar lo siguiente a su CMakeLists.txt:
add_custom_command(TARGET MyTest POST_BUILD # Adds a post-build event to MyTest
COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E copy_if_different..."
"${PROJECT_SOURCE_DIR}/libs/test.dll" # <--this is in-file
$<TARGET_FILE_DIR:MyTest>) # <--this is out-file path
Si lo que desea todo el contenido del directorio /libs/
copiados, utilice cmake -E copy_directory
:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs"
$<TARGET_FILE_DIR:MyTest>)
Si necesita copiar diferentes dlls dependiendo de la configuración (Release, depuración, ej.) entonces podría tenerlos en subdirectorios nombrados con la configuración correspondiente: /libs/Release
y /libs/Debug
. A continuación, deberá inyectar el tipo de configuración en la ruta de acceso al archivo DLL en la llamada add_custom_command
, así:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)
Nota rápida de lo que funcionó en mi caso, en caso de que ayude a alguien más en el futuro: tengo un proyecto de biblioteca estática con el cual el ejecutable principal se vincula opcionalmente, y esa biblioteca requiere una copia DLL si se agrega. Entonces, en el archivo CMakeLists.txt de esa biblioteca usé '$ {CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$' para el destino de destino. De lo contrario, lo copiaría en la ruta de compilación de la biblioteca, que fue inútil. –
AberrantWolf