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

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

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

谢谢。

使用CMake 2.8,使用file(COPY ...)命令。

对于较老的CMake版本,这个macros将文件从一个目录复制到另一个目录。 如果您不想在复制的文件中replacevariables,请更改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(COPY yourDir DESTINATION yourDestination) 

注意:

相对于当前源目录评估相对inputpath,并且相对于当前构build目录评估相对目的地

configure命令只会在cmake运行时复制文件。 另一个选项是创build一个新的目标,并使用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。 如果您想要深度复制,则可以使用copy_directory命令。 更好的是,你可以用create_symlink命令创build一个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

由于没有人提到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}) 

谢谢! 这是真正有用的build议,使用一堆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/") 

根据Seth Johnson的回答,这就是我为了更方便而写的。

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