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


71

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

谢谢。

Answers:


43

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

对于较旧的CMake版本,此宏将文件从一个目录复制到另一个目录。如果您不想在复制的文件中替换变量,请更改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)

使用cmake -E模式时,很容易复制文件或目录。非常感谢
姜边

编辑,因为这是公认的答案和对方的回答与文件(COPY命令是清洁的。
钦黄

4
是的,但是您可以作为依赖于目标的自定义命令运行file(COPY ...)吗?
juzzlin 2014年

2
文件(GLOB_RECURSE ..)子目录
外国佬

130

从2.8版开始,file命令具有copy参数:

注意:

相对于当前源目录评估相对输入路径,相对于当前构建目录评估相对目的地


4
这看起来很有希望。您能否解释一下如何触发它,或者它每次都运行?
Drew Noakes

5
它仅在运行cmake命令时起作用,而在实际构建期间不起作用
kevin

如果我要检查目标目录是否已存在该怎么办?
艾哈迈德·侯赛因'18

27

configure命令仅在cmake运行时复制文件。另一个选项是创建一个新目标,并使用custom_command选项。这是我使用的一个(如果您多次运行它,则必须修改该add_custom_target行以使其在每个调用中都是唯一的)。


我调整了您的(惊人的)答案,使之具有更加模块化的脚本。看我的答案!
萨拉曼达尔

请注意,这个(现在已经十岁了!)答案早于CMake中的生成器表达式以及copy_directory命令。
塞斯·约翰逊

25

正如没有人提到cmake -E copy_directory的自定义目标,这是我使用的:


简短容易,很棒。如果删除,DEPENDS ${MY_TARGET}则可以与编译过程并行运行。请记住,每次make运行时都会复制文件,因此对于很大的文件夹可能会有限制。
西蒙·沃塔

我得到Expected a command name, got unquoted argument with text "/runtime-files-dir".这个:(

这是我的首选解决方案,因为它可以使用$ <CONFIG>
Amazonasmann

15

使用execute_process并调用cmake -E。如果要深拷贝,可以使用copy_directory命令。更好的是,您可以symlink使用create_symlink命令创建一个(如果您的平台支持)。后者可以这样实现:

来源:http//www.cmake.org/pipermail/cmake/2009-March/028299.html


3
唯一的问题是,如果在目录中生成了临时文件,它将打破源代码外构建的概念。
杰森·莫克

2

谢谢!这对使用一堆add_custom_target和add_custom_command确实很有帮助。我编写了以下函数以在项目中的任何地方使用。还指定安装规则。我主要用它来导出接口头文件。

用法如下所示:


这看起来很有趣。可以复制整个目录吗?
Drew Noakes

1

根据塞思·约翰逊(Seth Johnson)的回答,这就是我为方便起见而写的内容。

编辑:并没有真正按预期工作。这个完美无瑕。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.