Copie du répertoire de l'arborescence source vers l'arborescence binaire. Par exemple: Comment copier www dans le dossier bin.
work
├─bin
└─src
├─doing
│ └─www
├─include
└─lib
Merci.
Avec CMake 2.8, utilisez la commande file(COPY ...)
.
Avec les anciennes versions de CMake, cette macro copie des fichiers d'un répertoire à un autre. Si vous ne souhaitez pas remplacer les variables dans les fichiers copiés, modifiez l'argument configure_file @ONLY.
# Copy files from source directory to destination directory, substituting any
# variables. Create destination directory if it does not exist.
macro(configure_files srcDir destDir)
message(STATUS "Configuring directory ${destDir}")
make_directory(${destDir})
file(GLOB templateFiles RELATIVE ${srcDir} ${srcDir}/*)
foreach(templateFile ${templateFiles})
set(srcTemplatePath ${srcDir}/${templateFile})
if(NOT IS_DIRECTORY ${srcTemplatePath})
message(STATUS "Configuring file ${templateFile}")
configure_file(
${srcTemplatePath}
${destDir}/${templateFile}
@ONLY)
endif(NOT IS_DIRECTORY ${srcTemplatePath})
endforeach(templateFile)
endmacro(configure_files)
Depuis la version 2.8, la commande de fichier a un argument de copie:
file(COPY yourDir DESTINATION yourDestination)
Notez que:
Les chemins d'entrée relatifs sont évalués par rapport au répertoire source actuel, et une destination relative est évaluée par rapport au répertoire de construction actuel
La commande configure
copiera uniquement les fichiers lorsque cmake
sera exécuté. Une autre option consiste à créer une nouvelle cible et à utiliser l'option custom_command. En voici un que j'utilise (si vous l'exécutez plusieurs fois, vous devrez modifier le add_custom_target
ligne pour le rendre unique pour chaque appel).
macro(copy_files GLOBPAT DESTINATION)
file(GLOB COPY_FILES
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
${GLOBPAT})
add_custom_target(copy ALL
COMMENT "Copying files: ${GLOBPAT}")
foreach(FILENAME ${COPY_FILES})
set(SRC "${CMAKE_CURRENT_SOURCE_DIR}/${FILENAME}")
set(DST "${DESTINATION}/${FILENAME}")
add_custom_command(
TARGET copy
COMMAND ${CMAKE_COMMAND} -E copy ${SRC} ${DST}
)
endforeach(FILENAME)
endmacro(copy_files)
Comme personne ne l'a mentionné cmake -E copy_directory
en tant que cible personnalisée, voici ce que j'ai utilisé:
add_custom_target(copy-runtime-files ALL
COMMAND cmake -E copy_directory ${CMAKE_SOURCE_DIR}/runtime-files-dir ${CMAKE_BINARY_DIR}/runtime-files-dir
DEPENDS ${MY_TARGET})
Utilisez execute_process et appelez cmake -E. Si vous voulez une copie complète, vous pouvez utiliser le copy_directory
commande. Encore mieux, vous pouvez créer un symlink
(si votre plate-forme le prend en charge) avec la commande create_symlink. Ce dernier peut être réalisé comme ceci:
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_SOURCE_DIR}/path/to/www
${CMAKE_BINARY_DIR}/path/to/www)
De: http://www.cmake.org/pipermail/cmake/2009-March/028299.html
Remercier! C'est un conseil vraiment utile pour utiliser un tas d'add_custom_target et add_custom_command. J'ai écrit la fonction suivante à utiliser partout dans mes projets. Est également spécifie la règle d'installation. Je l'utilise principalement pour exporter des fichiers d'en-tête d'interface.
#
# export file: copy it to the build tree on every build invocation and add rule for installation
#
function (cm_export_file FILE DEST)
if (NOT TARGET export-files)
add_custom_target(export-files ALL COMMENT "Exporting files into build tree")
endif (NOT TARGET export-files)
get_filename_component(FILENAME "${FILE}" NAME)
add_custom_command(TARGET export-files COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/${FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${DEST}/${FILENAME}")
install(FILES "${FILE}" DESTINATION "${DEST}")
endfunction (cm_export_file)
L'utilisation ressemble à ceci:
cm_export_file("API/someHeader0.hpp" "include/API/")
cm_export_file("API/someHeader1.hpp" "include/API/")
Sur la base de la réponse de Seth Johnson, c'est ce que j'ai écrit pour plus de commodité.
# Always define the target
add_custom_target(copy_resources ALL COMMENT "Copying resources…")
# Copy single files
macro(add_files_to_environment files)
add_custom_command(TARGET copy_resources POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${ARGV} ${CMAKE_CURRENT_BINARY_DIR})
endmacro()
# Copy full directories
macro(add_directory_to_environment distant local_name)
file(GLOB_RECURSE DistantFiles
RELATIVE ${distant}
${distant}/*)
foreach(Filename ${DistantFiles})
set(SRC "${distant}/${Filename}")
set(DST "${CURRENT_BUILD_DIR}/${local_name}/${Filename}")
add_custom_command(TARGET copy_resources POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${SRC} ${DST})
message(STATUS "file ${Filename}")
endforeach(Filename)
endmacro()
EDIT: Cela ne fonctionne pas vraiment comme prévu. Celui-ci fonctionne parfaitement.
# Copy single files
macro(resource_files files)
foreach(file ${files})
message(STATUS "Copying resource ${file}")
file(COPY ${file} DESTINATION ${Work_Directory})
endforeach()
endmacro()
# Copy full directories
macro(resource_dirs dirs)
foreach(dir ${dirs})
# Replace / at the end of the path (copy dir content VS copy dir)
string(REGEX REPLACE "/+$" "" dirclean "${dir}")
message(STATUS "Copying resource ${dirclean}")
file(COPY ${dirclean} DESTINATION ${Work_Directory})
endforeach()
endmacro()