如何使用CMake最好地处理数据文件?

时间:2010-08-07 16:24:08

标签: cmake eclipse-cdt

我有一个包含代码和一些数据文件的CMake项目(图像准确无误)。

我的目录结构如下:

  • SRC
  • 数据

src包含源代码,数据包含数据文件。 CMake建议使用源代码构建,所以当我调用 make 时,我有可执行程序,但不是数据文件,因此我无法执行该程序。

当然, make install 会将我的数据文件复制到所需的位置并使其正常工作,因此我现在就这样开发:

  1. cmake -DCMAKE_INSTALL_DIR = dist
  2. <edit source code>
  3. make install
  4. DIST / myprogram.exe
  5. 如果我正在使用命令行和编辑器,那没关系,但我最近决定转向Eclipse CDT。从CMake生成Eclipse项目效果很好,但是从Eclipse手动执行 install 目标并不是那么好。

    你们是如何解决这个问题的?你的程序是否有一些聪明的算法来尝试找到它的数据目录,即使它不是二进制文件的位置?或者你不使用源代码构建?

3 个答案:

答案 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 命令,如果需要,这应该不难做到。