update_directory command for CMake
June 18, 2017 Leave a comment
CMake offers several platform independent commands for manipulating files that are used often in the custom build commands. (For more details see Command-Line Tool Mode.)
One of the more useful ones is the copy_directory
that is commonly used in post-build step to copy configuration and support files (configs, DLLs, …) to the binary directory so program can be directly executed in a IDE or debugger.
Unfortunately this command always overwrites the contents of the destination directory so all changes in the target folder are lost, this is a problem when developer wants to keep local configuration changes during development.
Here is how you can implement a custom update_directory
that works exactly like copy_directory
but writes files to the destination folder only if they are missing or the file timestamp is older.
# cmake/update_directory.cmake file(GLOB_RECURSE _file_list RELATIVE "${src_dir}" "${src_dir}/*") foreach( each_file ${_file_list} ) set(destinationfile "${dst_dir}/${each_file}") set(sourcefile "${src_dir}/${each_file}") if(NOT EXISTS ${destinationfile} OR ${sourcefile} IS_NEWER_THAN ${destinationfile}) get_filename_component(destinationdir ${destinationfile} DIRECTORY) file(COPY ${sourcefile} DESTINATION ${destinationdir}) endif() endforeach(each_file)
This is how you might use it in CMakeLists.txt
# Example CMakeLists.txt cmake_minimum_required(VERSION 3.7.0) project(Dummy) set(_target Dummy) add_executable(${_target} src/dummy.c) set(source_dir "${CMAKE_CURRENT_SOURCE_DIR}/configs") set(dest_dir "$<TARGET_FILE_DIR:${_target}>") # Copy changed files from config to the binary folder after # a successful build add_custom_command(TARGET ${_target} POST_BUILD COMMAND ${CMAKE_COMMAND} -Dsrc_dir="${source_dir}" -Ddst_dir="${dest_dir}" -P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/update_directory.cmake" )
Caveat! CMake post build steps are executed only if the build is really needed, if target is up to date no command is executed.
Get full example from https://github.com/tikonen/blog/tree/master/cmake/update_directory