Answer : You may consider using configure_file with the COPYONLY option: configure_file(<input> <output> COPYONLY) Unlike file(COPY ...) it creates a file-level dependency between input and output, that is: If the input file is modified the build system will re-run CMake to re-configure the file and generate the build system again. both option are valid and targeting two different steps of your build: file(COPY ... copies the file in configuration step and only in this step. When you rebuild your project without having changed your cmake configuration, this command won't be executed. add_custom_command is the preferred choice when you want to copy the file around on each build step. The right version for your task would be: add_custom_command( TARGET foo POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/test/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt) you can choose between PRE_BUILD , PRE_LINK ...