[CMake] Copying of 3rd party DLLs in a POST-BUILD step
Michael Jackson
mike.jackson at bluequartz.net
Mon Jan 9 10:11:04 EST 2012
I was going to chime in with my own macro:
# --------------------------------------------------------------------
#-- Copy all the Qt4 dependent DLLs into the current build directory so that
#-- one can debug an application or library that depends on Qt4 libraries.
macro (CMP_COPY_QT4_RUNTIME_LIBRARIES QTLIBLIST)
#message(STATUS "CMP_COPY_QT4_RUNTIME_LIBRARIES")
if (MSVC)
if (DEFINED QT_QMAKE_EXECUTABLE)
set(TYPE "d")
FOREACH(qtlib ${QTLIBLIST})
GET_FILENAME_COMPONENT(QT_DLL_PATH_tmp ${QT_QMAKE_EXECUTABLE} PATH)
message(STATUS "Generating Copy Rule for Qt Debug DLL Library ${QT_DLL_PATH_tmp}/${qtlib}d4.dll")
add_custom_target(ZZ_${qtlib}-Debug-Copy ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_DLL_PATH_tmp}/${qtlib}${TYPE}4.dll
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug/
COMMENT "Copying ${qtlib}${TYPE}4.dll to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug/")
message(STATUS "Generating Copy Rule for Qt Release DLL Library ${QT_DLL_PATH_tmp}/${qtlib}d4.dll")
add_custom_target(ZZ_${qtlib}-Release-Copy ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_DLL_PATH_tmp}/${qtlib}4.dll
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Release/
COMMENT "Copying ${qtlib}4.dll to ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Release/")
ENDFOREACH(qtlib)
endif(DEFINED QT_QMAKE_EXECUTABLE)
endif()
endmacro()
The only issue I really have with this is that this macro requires there to be BOTH debug and Release libraries available and will copy BOTH no matter which configuration is being built. I am thinking that the "yourCopyDlls.cmake" could be auto generated based on what the programmer says they need and then do the appropriate copy. I may look into this today. Thanks for sharing.
___________________________________________________________
Mike Jackson Principal Software Engineer
BlueQuartz Software Dayton, Ohio
mike.jackson at bluequartz.net www.bluequartz.net
On Jan 9, 2012, at 9:51 AM, John Drescher wrote:
> 2012/1/9 Hauke Heibel <hauke.heibel at googlemail.com>:
>> Hi Michael,
>>
>> What I do is running a custom command which itself executes a CMake
>> script. Usually similar to
>>
>> add_custom_command(TARGET CopyDlls
>> COMMAND ${CMAKE_COMMAND}
>> -DMSVC_BUILD_CONFIG_DIR=${CMAKE_CFG_INTDIR}
>> -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
>> -P "<pathto>/yourCopyDlls.cmake"
>> VERBATIM
>> )
>>
>> In the "yourCopyDlls.cmake", you can GLOB your DLLs with or without
>> the "d" postfix depending on MSVC_BUILD_CONFIG_DIR. You can now even
>> copy additional files such as e.g. PDB files.
>>
>
> Thanks for sharing this. I use cmake generate a batch file (using
> FILE(append ...) ) that calls cmake -E copy_if_different for each
> file. then add this as a custom target however your method looks much
> cleaner..
>
>
> John
> --
>
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake
More information about the CMake
mailing list