将资源目录从源复制到CMake中的构建目录

时间:2017-02-27 02:11:11

标签: c++ cmake assets

我正在尝试用C ++编写一个练习游戏。我正在使用CMake,我的项目由IDE自动构建在一个单独的构建目录中。但是,我的assets文件夹被复制到新目录。

目前,我正尝试使用以下方法解决此问题:

add_custom_command(TARGET ${PROJECT_NAME}
    POST_BUILD
    COMMAND cp -r ${PROJECT_SOURCE_DIR}/assets ${CMAKE_BINARY_DIR}
    )

但是,这似乎对结果没有任何影响,资产目录仍然存在于我的构建目录中。

如何将此资产目录复制到我的构建位置?有没有更聪明的方法将我的程序指向我的资产位置(也许还可以使用/ usr / share中的资产?)

3 个答案:

答案 0 :(得分:6)

经过一段时间的搜索,我找到了file(COPY {files} DESTINATION {directory})命令:

file(COPY assets DESTINATION ${CMAKE_BINARY_DIR})

答案 1 :(得分:0)

我找到了两种方法,既可以确保它在目标版本上复制,也可以保持最新,即使目标不需要重新构建。


第一个使用CMake命令行工具copy_directory。从文档中不清楚此复制是否总是发生,无论是否assets目录中的文件已更新,还是仅在资产文件不存在或资产文件已更新时才复制:

add_custom_target(copy_assets
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_LIST_DIR}/assets ${CMAKE_CURRENT_BINARY_DIR}/assets
)
add_dependencies(mytarget copy_assets)

第二个需要一个小的附加CMake脚本文件,但是它允许我们使用file(COPY ...) CMake comamnd,它在文档中指出“复制保留输入文件的时间戳,并优化文件的存在(如果存在)。具有相同时间戳的目的地。”

首先,在与copy-assets.cmake相同的目录中创建CMake脚本文件CMakeLists.txt,内容是(类似于Ethan McTague的回答)

file(COPY ${CMAKE_CURRENT_LIST_DIR}/assets DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

然后在您的CMakeLists.txt中添加以下内容:

add_custom_target(copy_assets
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/copy-resources.cmake
)
add_dependencies(mytarget copy_assets)

答案 2 :(得分:0)

以上使用add_custom_target的解决方案适用于大多数情况,但存在一些问题。

  • 不支持从属生成器表达式(例如$
  • 重新复制每个版本(对于大量文件来说速度很慢)
  • 不是特别可读,尤其是从多个位置复制时

相反,我一直在使用file GENERATE

set(ASSETS
    assetfile
    ...)
foreach(ASSET ${ASSETS})
    file(GENERATE OUTPUT ${ASSET} INPUT ${ASSET})
endforeach()

注意,我还不需要生成器表达式,但是看起来最新版本的CMake(3.19)向该函数添加了生成器表达式支持。