Как скопировать каталог из исходного дерева в двоичное дерево?
копирование каталога из исходного дерева в бинарное дерево. Например: как скопировать www в папку bin.
work
├─bin
└─src
├─doing
│ └─www
├─include
└─lib
спасибо.
7 ответов:
С 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)
начиная с версии 2.8, в file command имеет аргумент копирования:
file(COPY yourDir DESTINATION yourDestination)
внимание:
относительные входные пути вычисляются относительно текущего источника каталог, и относительное назначение оценивается относительно текущий каталог сборки
The
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)
используйте execute_process и вызовите cmake-E. Если вы хотите глубокую копию, вы можете использовать
поскольку никто не упоминал 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})
спасибо! Это действительно полезный совет, чтобы использовать кучу 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/")
основываясь на ответе от Сета Джонсона, это то, что я написал для большего удобства.
# 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: это действительно не работает, как ожидалось. Этот работает безупречно.
# 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()