如何将目录从源树复制到二叉树?

将目录从源树复制到二叉树。例如: 如何将 www 复制到 bin 文件夹。

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

谢谢。

109797 次浏览

对于 CMake 2.8或更高版本,请使用 file(COPY ...)命令。

当 CMake 版本低于2.8时,下面的宏将文件从一个目录复制到另一个目录。如果不想替换复制文件中的变量,那么更改 configure _ file @ONLY参数(例如,将其更改为 COPYONLY)。

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

使用 execute _ process 并调用 cmake-E。如果需要深度副本,可以使用 copy_directory命令。更好的是,您可以使用 create _ symlink 命令创建一个 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

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)

自2.8版本以来,ABC0命令有一个 COPY子命令:

file(COPY yourDir DESTINATION yourDestination)

请注意:

相对于当前源计算相对输入路径 目录,并且相对于 当前生成目录

谢谢!对于使用 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/")

由于没有人提到 cmake -E copy_directory作为定制目标,以下是我使用的方法:

add_custom_target(copy-runtime-files ALL
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/runtime-files-dir ${CMAKE_BINARY_DIR}/runtime-files-dir
DEPENDS ${MY_TARGET})

基于赛斯 · 约翰逊的回答; 为了更方便而写道:

# Copy files
macro(resource_files files)
foreach(file ${files})
message(STATUS "Copying resource ${file}")
file(COPY ${file} DESTINATION ${Work_Directory})
endforeach()
endmacro()


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