У меня есть проект CMake, который содержит код и несколько файлов данных (точнее, изображений).
Моя структура каталогов такая:
src содержит исходный код, данные файлы данных. CMake предлагает исходящие сборки, поэтому, когда я вызываю make , у меня есть исполняемая программа, но нет файлов данных, поэтому я не могу выполнить программу.
Конечно, make install скопирует мои файлы данных в требуемое место и заставит его работать, поэтому я сейчас развиваюсь так:
<редактировать исходный код>
Это нормально, если я работаю с командной строкой и редактором, но недавно я решил перейти на Eclipse CDT. Генерация проекта Eclipse из CMake работает отлично, но ручное выполнение цели install из Eclipse не так хорошо.
Как вы, люди, решаете эту проблему? Есть ли у вашей программы какие-нибудь умные алгоритмы, чтобы попытаться найти ее каталог данных, даже если он не там, где находится бинарный файл? Или вы не используете сборки из исходного кода?
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})
И если копирование файлов занимает слишком много времени (это изображения...), вы можете сделать это еще лучше, создав "пользовательский" data_header.h с configure_file, который содержит пути к данным, находящимся в вашем исходном каталоге.
Вот что я делаю: У меня есть файл "global_build_config.h.in" в моем исходнике, содержащий следующее:
const char* const global_testdatapath = "@Test_Data_Path@";
и затем использую configure_file в CMake:
# 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/ )
Затем я могу #include "Global_Build_Config.h" в моих cpp-файлах и ссылаюсь на фиксированный путь.