用CMake制作完后如何将目录内容复制到构建目录中?


78

config在源文件旁边的目录中有一些配置文件(xml,ini,...)。每次创建项目时,如何将config目录中的所有文件复制到build目录中(可执行文件旁边)?

Answers:


142

您可以使用add_custom_command

假设您的目标称为MyTarget,那么您可以执行以下操作:

add_custom_command(TARGET MyTarget PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config/ $<TARGET_FILE_DIR:MyTarget>)

每次构建时都会执行此操作,MyTarget并将“ / config”的内容复制到目标exe / lib所在的目录中。

正如马克Lakata指出在下面留言,替换PRE_BUILDPOST_BUILDadd_custom_command确保,如果生成成功复制才会发生。

说明

  • ${CMAKE_COMMAND} 是通往CMake的道路
  • -E 使CMake运行命令而不是构建
  • copy_directory命令行工具
  • config 是目录(位于项目的根目录下),其内容将被复制到构建目标中
  • $<TARGET_FILE_DIR:MyTarget>是文档中描述的生成器表达式add_custom_command

1
您在CMakeLists.txt中拥有的实际目标之一-即通过add_executable或添加的内容add_library
弗雷泽

1
是的-我认为make它足够聪明,即使make MyTarget它检测到未更改也不会执行。如果您的目标发生任何更改,那么make将在该目标上执行,并且文件将被复制。
弗雷泽

7
POST_BUILD可能是一个更好的选择,这意味着仅在构建成功后才复制文件。
Mark Lakata 2015年

6
有没有一种方法可以make clean知道在清理项目时必须删除复制的文件?
moonwalker 2015年

3
有没有办法复制目录本身而不是目录?

11

除了最佳答案之外,

要复制目录本身而不是目录,可以将其添加/${FOLDER_NAME}到第二个参数的末尾。

像这样:

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config $<TARGET_FILE_DIR:${PROJECT_NAME}>/config)


-5

在我的项目中,我使用INSTALL在CMake中进行指定,以及将二进制文件与conf文件一起移动的位置和位置。执行cmake之后,使用“ make install”。


OP询问构建完成后如何执行此操作。含义是没有在外壳中输入其他命令。执行构建过程并伪装二进制文件所需的文件。我也使用该install()命令,但这是一种特殊情况:代码可以构建,通过单元测试,并且可以供其他人使用。我不安装它来调试它。
PfunnyGuy
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.