LINUX.ORG.RU

Дополнительные файлы в Qt-проекте

 , ,


0

1

Доброго времени суток!

Вопрос дурацкий и простой до безобразия: как добавить дополнительных файлов в qt-проект? В качестве ide использую qtcreator. Мне нужен механизм по которому возможно выполнить следующий объём требований:

  1. Возможность добавить в проект несколько файлов неопределённого содержания, структурно организованных в дерево (обычные каталоги, короче).
  2. Возможность сослаться в коде на каталог с этими файлами. Либо отдельной функцией (QString getDirWithMyFiles()), либо макросом (MY_PROJECT_FILES) — не суть важно, как именно. Причём это должен быть путь в файловой системе.
  3. Автоматическая установка этих файлов вместе со всем остальным проектом при «make install».
  4. Возможность дебажиться без предварительной установки.
  5. Желательна заявляемая qt'шниками кроссплатфомернность.

Требования 1 и 2 накладываются тем, что некоторые из этих файлов надо подсовывать библитеке сторонней. Это, кстати, перечёркивает использование qt resources с их странным путями типа ":/mydir/myfile.png".

Требования 3 и 4 из соображений удобства разработки. Требование 5 нужно для того, чтобы соблазн подставлять костыли был минимальным. Чтобы не городить кучу scopes типа win32 { ... }, linux { ... } и прочее.

Почитал кучу хрени про qmake, ничего путного не нашёл, поэтому пришёл сюда за советом. Совсем нет желания фигачить QMAKE_POST_LINK и руками делать закат солнца вручную. INSTALLS — тоже закат солнца вручную, но причём ещё дополнительная куча гемора с требованием 4. DISTFILES — только Unix, ахринеть, блин. Как так жить-то? Заранее спасибо.

P.S. Проблема-то простая. Она же возникает, например, при включении сопроводительной документации в проект. Либо при использовании библиотек, которым нужно подсунуть определённым образом организованный каталог с данными для работы.

Требования 1 и 2 накладываются тем, что некоторые из этих файлов надо подсовывать библитеке сторонней. Это, кстати, перечёркивает использование qt resources с их странным путями типа ":/mydir/myfile.png".

Скармливай библиотеке буффер с файлом. Почитай доки про кутишные ресурсы, там все написано.

a1batross ★★★★★
()
Ответ на: комментарий от a1batross

Библиотека не файл жрёт, библиотеке каталог нужен. Если бы ей файлы по одиночке нужны были, я бы конечно qt resources использовал.

nezamudich ★★
() автор топика
Ответ на: комментарий от a1batross

Стыдно говорить, билиотека JSBSim. Для программного запуска своих моделей надо их подсовывать в правильно организованном каталоге. Если кому интересно, основной API можно здесь посмотреть: http://sourceforge.net/p/jsbsim/code/ci/master/tree/src/FGFDMExec.h

nezamudich ★★
() автор топика

Пока не поздно, переходи на cmake :) Для qmake выход - кастомные таргеты + INSTALLS

1) qtcreator умеет добавлять в проект файлы общего типа. Посмотрите каким при этом образом он изменяет проект и сделайте также.

2) Эти файлы во время разработки надо брать из проекта, а после установки из места установки, но при этом функция/макрос пути один и тот же? Нужно копировать этот каталог вместе с содержимым в каталог сборки и использовать относительные пути. Кастомный таргет + указать в проекте специальный этап сборки в виде этого таргета.

3,5) кастомный таргет, либо INSTALLS.

4) Дебажишься ты в каталоге сборки, а не проекта, поэтому см. п.2

tekilla
()
Ответ на: комментарий от anonymous

OTHER_FILES — хороший токен для гугла, много интересного находится. При этом в официальной документации про них нет ничего, от слова «вообще». Попробовал добавить файлов в OTHER_FILES, на итоговом мейкфайле они никак не отразились, тоже от слова «вообще». Подозрительная хрень получается.

nezamudich ★★
() автор топика
Ответ на: комментарий от tekilla

tekilla

1) qtcreator умеет добавлять в проект файлы общего типа. Посмотрите каким при этом образом он изменяет проект и сделайте также.

Вот этот пункт сейчас проверил. Добавил в проект файлов пару общего типа. В pro-файл от этого добавилось DISTFILES += myfiles. Но там два кривых момента получилось.

  1. В доках про DISTFILES нопейсано, мол работают только в UnixMake.
  2. В генерируемом Makefile DISTFILES нужны только для правила dist, которое делает... (барабанная дробь)... запакованный архив с исходниками :)

Остальные рекомендации ещё не проработал.

nezamudich ★★
() автор топика
Ответ на: комментарий от nezamudich

P.S. Попутно обнаружил баг. Правило для dist в Makefile не экранирует пробелы в путях.

nezamudich ★★
() автор топика
Ответ на: комментарий от anonymous

Я правильно понимаю, что читать правила следует так?

target.path = /run
INSTALLS += target

inifile.path = /run
inifile.files = $$PWD/settings.ini
INSTALLS += inifile

Так они же создадут каталог /run и туда положат setting.ini. Это совершенно нерабочий вариант.

nezamudich ★★
() автор топика
Ответ на: комментарий от tekilla

Очень тяжело получается, проще действительно каждый раз при запуске приложения из ресурсов вытаскивать файлы во временную директорию. Криво, конечно, зато целиком предсказуемое поведение. Благо файлы там все лёгкие, нескольо xml'ников.

nezamudich ★★
() автор топика
Ответ на: комментарий от fluorite

Натыкался на эту ссылку, но только после твоего коммента решил попробовать-таки. Увы, эта мантра уже не работает. Цель copydata создаётся, а вот зависимость от неё в first не пролезает. qmake версии 3.0, qt 5.5.0, такие дела.

Даже если этот вариант доведётся до рабочего состояния, это решит только часть проблемы. Всё равно придётся ещё что-то писать для установки этих дополнительных файлов в процессе «make install».

nezamudich ★★
() автор топика

Всем спасибо. В этот раз подопру костылём «скопировать нужные файлы во временный каталог», а в следующий раз попробую CMake. Чтобы познать всю глубину истинной боли и искреннего отчаяния.

nezamudich ★★
() автор топика
Ответ на: комментарий от fluorite

Там руками надо придумывать destination. Придётся scope'ы всякие городить, для линуксов $PREFIX/share/myapp (и то не всегда), а для венды там %APPDATA% какой-то (уже не помню). Что для маков писать я вообще не знаю. Нормально переносимо сделать практически нереально.

nezamudich ★★
() автор топика

Стандартными средствами - никак.

Можно добавить сами файлы в какую-нибудь QMAKE_VARIABLE, потом внутри qmake'ом самому все разруливать.

Кста, подумай о том, как ты это будешь распространять. Тут тебе на помощь придет пакетирование, стандартные пути, конфигурационные файлы для нестандартных путей.

В винде можно попробовать инсталятор заставить прописывать дефолтные пути в реестр или еще куда. Слышал, что эти извращенца именно так поступают. Ну а вообще винданинужна-виндасосет.

trex6 ★★★★★
()
Ответ на: комментарий от nezamudich

Или с использованием этого механизма. Почти копипаст!

DATA_FILES = readme

copy_data.input  = DATA_FILES
copy_data.output = ${QMAKE_FILE_BASE}
copy_data.commands = cp ${PWD}/data/${QMAKE_FILE_NAME} ${OUT_PWD}/data/${QMAKE_FILE_OUT}

QMAKE_EXTRA_COMPILERS += new_moc

п.с. Пробовал что-то подобное делать года 4 назад для реализации пакетирования rpm/deb/nsis внутри *pro. Естественно, ничего не вышло :)

tekilla
()
Ответ на: комментарий от tekilla

А еще проще рекурсивное копирование должно реализоваться с использованием этого.

tekilla
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.