So, there are numerous ways to copy files (and directories) at CMake
runtime (file(COPY ...)
, configure_file(...)
and add_custom_command()
all work*), but I haven't yet found out how to make a file or directory copied from the source to build directory appear in an archive generated by CPack. I though that this SO answer would fix it, as it actually links the copying to a target which will then have an install linked to it:
install(TARGET mytarget DESTINATION bin)
whereas I did recognise that the file()
and configure_file()
commands don't have an obvious way to be added to a target. But, this didn't work. So, given a simple CMakeLists.txt, such as the one below, how do I make all of the files (including the exmaple
directory) appear in the archive?!
cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
enable_language(FORTRAN)
add_executable(mytarget ${PROJECT_SOURCE_DIR}/myprog.for)
install(TARGETS mytarget DESTINATION bin)
add_custom_command(TARGET mytarget PREBUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${PROJECT_SOURCE_DIR}/examplefiles ${PROJECT_BINARY_DIR}/examplefiles)
set(CPACK_GENERATOR "TGZ")
include(CPack)
* I haven't yet found out which one of these 3 methods is actually (most?) correct - so any advice on this too will be hugely appreciated
As explained in the documentation of the CPack module, the binary installers created by CPack contain everything installed via CMake's INSTALL
command. Thus the executable mytarget
in your example will be included in the CPack archive, because you use the install
command to copy it to the bin
folder.
To also have CPack include the example
folder in the generated archive, you can use the DIRECTORY
variant of the install command in the following way:
install(DIRECTORY "${PROJECT_SOURCE_DIR}/examplefiles/" DESTINATION "example")
The file(COPY ...)
and configure_file(...)
do not have an effect on what is installed by CPack. Both command are usually used to copy files from the source tree to the binary tree upon configuring the CMake project.
Using add_custom_command
with ${CMAKE_COMMAND} -E copy_directory ...
will postpone the actual copying of files to the build time of the project. It will however not trigger the inclusion of the copied files in the CPack archive, either.