Eu usaria add_custom_commandpara conseguir isso junto com cmake -E copy_if_different.... Para informações completas, corra
cmake --help-command add_custom_command
cmake -E
Portanto, no seu caso, se você tiver a seguinte estrutura de diretório:
/CMakeLists.txt
/src
/libs/test.dll
e seu destino CMake ao qual o comando se aplica é MyTest, então você pode adicionar o seguinte ao seu 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
Se você deseja apenas todo o conteúdo do /libs/diretório copiado, use 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>)
Se você precisar copiar dlls diferentes dependendo da configuração (Release, Debug, por exemplo), você pode tê-los em subdiretórios nomeados com a configuração correspondente:, /libs/Releasee /libs/Debug. Em seguida, você precisa injetar o tipo de configuração no caminho para a dll na add_custom_commandchamada, assim:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>como destino. Caso contrário, ele iria copiá-lo para o caminho de construção da biblioteca, o que era inútil.