我有一个包含代码和一些数据文件的CMake项目(图像准确无误)。
我的目录结构如下:
src包含源代码,数据包含数据文件。 CMake建议使用源代码构建,所以当我调用 make 时,我有可执行程序,但不是数据文件,因此我无法执行该程序。
当然, make install 会将我的数据文件复制到所需的位置并使其正常工作,因此我现在就这样开发:
<edit source code>
如果我正在使用命令行和编辑器,那没关系,但我最近决定转向Eclipse CDT。从CMake生成Eclipse项目效果很好,但是从Eclipse手动执行 install 目标并不是那么好。
你们是如何解决这个问题的?你的程序是否有一些聪明的算法来尝试找到它的数据目录,即使它不是二进制文件的位置?或者你不使用源代码构建?
答案 0 :(得分:17)
configure_file
应该解决这个问题。
我的数据目录中有一个CMakeLists.txt文件,其中包含以下内容:
configure_file(data_file ${CMAKE_CURRENT_BINARY_DIR}/data_file COPYONLY)
这会在调用cmake时将指定的文件复制到构建目录中,因此即使在源代码构建之外,它也可以在同一位置使用。
configure_file
不支持目录,但file
命令执行:
file(COPY assets DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
答案 1 :(得分:11)
如果复制文件需要花费太多时间(它们是图像......),你可以通过使用configure_file创建一个“自定义”data_header.h来实现更好的效果,configure_file包含仍在源目录中的数据的路径
这就是我的工作:我的源代码中有一个文件“global_build_config.h.in”,其中包含以下内容:
const char* const global_testdatapath = "@Test_Data_Path@";
然后在CMake中使用configure_file:
# Assume CMake knows a variable Test_Data_Path, it will be filled in automatically
# in the generated config/Global_Build_Config.h
configure_file( Global_Build_Config.h.in ${CMAKE_BINARY_DIR}/config/Global_Build_Config.h )
# The config directory should be added as a include-searchpath
include_directories( ${CMAKE_BINARY_DIR}/config/ )
然后我可以在我的cpp文件中#include“Global_Build_Config.h”并引用固定路径。
答案 2 :(得分:3)
你的问题有点陈旧,但如果你仍然感兴趣(或其他人),我有一个类似的场景,我将testdata复制到单元测试目标:
add_custom_command( TARGET ${UTEST_EXE_NAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E echo "Copying unit test data.."
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_HOME_DIRECTORY}/utest/testdata ${CMAKE_BINARY_DIR}
)
因此,主要思想是使用后构建目标,并在每次构建后执行。对我来说,数据并不多,而且文件系统会缓存它,所以我根本不会感觉到复制过程。您可以通过使用 copy_if_different 进行复制来增强此功能。但是,在这种情况下,您必须创建一个图像文件列表并编写一个循环,因为该命令是基于文件的。使用 GLOB 命令,如果需要,这应该不难做到。