74 votes

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

Copier le 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.

143voto

Chty Points 531

Avec cmake-2.8 , la commande de fichier a un argument de copie:

 file(COPY yourDir DESTINATION yourDestination)
 

44voto

Chin Huang Points 3830

Avec CMake 2.8, utilisez la commande file(COPY ...) .

Avec les anciennes versions de CMake, cette macro copie les 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)
 

27voto

Seth Johnson Points 6471

La commande configure ne copie les fichiers que lorsque cmake est 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 plus d'une fois, vous devrez modifier la ligne add_custom_target pour la 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)
 

16voto

Jiang Bian Points 711

Utilisez execute_process et appelez cmake -E. Si vous souhaitez une copie en profondeur, vous pouvez utiliser la commande copy_directory . Mieux encore, vous pouvez créer un symlink (si votre plate-forme le supporte) 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

2voto

prokher Points 100

Remercier! C'est un conseil très utile pour utiliser les groupes 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/")
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X