【发布时间】:2012-11-05 22:47:33
【问题描述】:
我在源文件旁边的config 目录中有一些配置文件(xml、ini、...)。每次制作项目时,如何将config目录中的所有文件复制到构建目录(可执行文件旁边)?
【问题讨论】:
我在源文件旁边的config 目录中有一些配置文件(xml、ini、...)。每次制作项目时,如何将config目录中的所有文件复制到构建目录(可执行文件旁边)?
【问题讨论】:
您可以使用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 将结束的目录中。
正如Mark Lakata 在下面的评论中指出的那样,将add_custom_command 中的PRE_BUILD 替换为POST_BUILD 可确保只有在构建成功时才会进行复制。
${CMAKE_COMMAND} 是 CMake 的路径-E 使 CMake 运行命令而不是构建copy_directory 是 Command-Line Tool
config 是目录(位于项目的根目录下),其内容将被复制到构建目标中$<TARGET_FILE_DIR:MyTarget> 是一个生成器表达式,在add_custom_command 文档中进行了描述。【讨论】:
add_executable 或 add_library 添加的内容。
make 足够聪明,如果它检测到它没有改变,甚至不会执行 make MyTarget。如果您的目标发生任何变化,那么 make 将在该目标上执行,并且文件将被复制。
make clean意识到项目清理时必须删除复制的文件?
除了最上面的答案,
要复制目录本身而不是内容,可以在第二个参数末尾添加/${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)
【讨论】:
CMake 支持 shell 类型的文件复制。这个链接应该对你有帮助 - How to copy directory from source tree to binary tree?
【讨论】:
CMake 通过create_symlink 启用符号链接:
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink
${CMAKE_SOURCE_DIR}/config $<TARGET_FILE_DIR:${PROJECT_NAME}>/config)
它确保当您对目录中的文件进行更改时,构建文件夹随后会被更新。
【讨论】:
在我的项目中,我使用 INSTALL 在 CMake 中指定使用 conf 文件移动二进制文件的内容和位置。执行cmake后,使用“make install”。
【讨论】:
install() 命令,但这是针对一种特殊情况:代码构建、通过单元测试,并准备好供其他人使用。我不安装它来调试它。