Как скопировать каталог из исходного дерева в двоичное дерево? - PullRequest
54 голосов
/ 30 марта 2009

Копирование каталога из исходного дерева в двоичное дерево. Например: Как скопировать www в папку bin.

work
├─bin
└─src
    ├─doing
    │  └─www
    ├─include
    └─lib

Спасибо.

Ответы [ 7 ]

112 голосов
/ 01 февраля 2010

Начиная с версии 2.8, команда file имеет аргумент копирования:

file(COPY yourDir DESTINATION yourDestination)

Обратите внимание, что:

Относительные входные пути оцениваются относительно текущего источника каталог, и относительный пункт назначения оценивается относительно текущий каталог сборки

33 голосов
/ 30 марта 2009

В CMake 2.8 используйте команду file(COPY ...).

В старых версиях CMake этот макрос копирует файлы из одного каталога в другой. Если вы не хотите заменять переменные в скопированных файлах, измените аргумент 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)
25 голосов
/ 08 июня 2009

Команда configure будет копировать файлы только при запуске cmake. Другой вариант - создать новую цель и использовать опцию custom_command. Вот один из них, который я использую (если вы запускаете его более одного раза, вам придется изменить строку add_custom_target, чтобы сделать ее уникальной для каждого вызова).

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)
15 голосов
/ 09 декабря 2014

Поскольку никто не упомянул cmake -E copy_directory в качестве пользовательской цели, вот что я использовал:

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})
15 голосов
/ 31 марта 2009

Используйте execute_process и вызовите cmake -E. Если вам нужна глубокая копия, вы можете использовать команду copy_directory. Более того, вы можете создать symlink (если ваша платформа поддерживает это) с помощью команды create_symlink. Последнее может быть достигнуто так:

execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_SOURCE_DIR}/path/to/www
                                                           ${CMAKE_BINARY_DIR}/path/to/www)

От: http://www.cmake.org/pipermail/cmake/2009-March/028299.html

2 голосов
/ 08 октября 2010

Спасибо! Это действительно полезный совет, чтобы использовать набор add_custom_target и add_custom_command Я написал следующую функцию для использования везде в моих проектах. Также указывает правило установки. Я использую его в основном для экспорта заголовочных файлов интерфейса.

#
# 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)

Использование выглядит следующим образом:

cm_export_file("API/someHeader0.hpp" "include/API/")
cm_export_file("API/someHeader1.hpp" "include/API/")
1 голос
/ 01 февраля 2017

Исходя из ответа Сета Джонсона, это то, что я написал для большего удобства.

# 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()

РЕДАКТИРОВАТЬ: Это действительно не работает, как ожидалось. Этот работает безупречно.

# 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()
...