web-dev-qa-db-fra.com

Comment copier le répertoire de l'arborescence source vers l'arborescence binaire?

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.

56
Jiang Bian

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)
34
Chin Huang

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

115
Chty

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)
26
Seth Johnson

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})
18
juzzlin

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

15
Jiang Bian

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/")
2
prokher

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()
1
Salamandar