How to copy contents of a directory into build directory after make with CMake?

C++Cmake

C++ Problem Overview


I've got some config files (xml, ini, ...) in the config directory next to the source files. How can I copy all the files in the config directory into the build directory (next to the executable file) each time I make the project?

C++ Solutions


Solution 1 - C++

You can use add_custom_command.

Say your target is called MyTarget, then you can do this:

add_custom_command(TARGET MyTarget PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config/ $<TARGET_FILE_DIR:MyTarget>)

This executes every time you build MyTarget and copies the contents of "/config" into the directory where the target exe/lib will end up.

As Mark Lakata points out in a comment below, replacing PRE_BUILD with POST_BUILD in the add_custom_command ensures that copying will only happen if the build succeeds.

Explanation
  • ${CMAKE_COMMAND} is the path to CMake
  • -E makes CMake run commands instead of building
  • copy_directory is a Command-Line Tool
  • config is the directory (that falls under the root of the project) who's contents will be copied into the build target
  • $<TARGET_FILE_DIR:MyTarget> is a generator expression, described in the add_custom_command documentation.

Solution 2 - C++

In addition to the top answer,

To copy the directory itself instead of the contents, you can add /${FOLDER_NAME} to the end of the second parameter.

Like this:

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config $<TARGET_FILE_DIR:${PROJECT_NAME}>/config)

Solution 3 - C++

CMake supports a shell type file copy. This link should be helpful for you - https://stackoverflow.com/questions/697560/how-to-copy-directory-from-source-tree-to-binary-tree

Solution 4 - C++


CMake enables symbolic links via create_symlink:

add_custom_command(TARGET ${CMAKE_PROJECT_NAME} PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E create_symlink
                   ${CMAKE_SOURCE_DIR}/config $<TARGET_FILE_DIR:${PROJECT_NAME}>/config)

It ensures that when you make a change to the files in the directory, build folder would subsequently be updated.

Solution 5 - C++

In my project i use INSTALL to specify in CMake, what and where i move my binary with conf file. After execution of cmake, use "make install".

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionB FaleyView Question on Stackoverflow
Solution 1 - C++FraserView Answer on Stackoverflow
Solution 2 - C++hyrchaoView Answer on Stackoverflow
Solution 3 - C++rajneeshView Answer on Stackoverflow
Solution 4 - C++UraxView Answer on Stackoverflow
Solution 5 - C++Luigi MenaleView Answer on Stackoverflow