我正在尝试用C ++编写一个练习游戏。我正在使用CMake,我的项目由IDE自动构建在一个单独的构建目录中。但是,我的assets
文件夹不被复制到新目录。
目前,我正尝试使用以下方法解决此问题:
add_custom_command(TARGET ${PROJECT_NAME}
POST_BUILD
COMMAND cp -r ${PROJECT_SOURCE_DIR}/assets ${CMAKE_BINARY_DIR}
)
但是,这似乎对结果没有任何影响,资产目录仍然不存在于我的构建目录中。
如何将此资产目录复制到我的构建位置?有没有更聪明的方法将我的程序指向我的资产位置(也许还可以使用/ usr / share中的资产?)
答案 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)向该函数添加了生成器表达式支持。