Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: andrew.k от Сентябрь 21, 2015, 17:11



Название: Динамически формируемый ресурс
Отправлено: andrew.k от Сентябрь 21, 2015, 17:11
Некоторый файл, должен быть сформирован во время компиляции проекта и добавлен в ресурс приложения. В качестве примера может быть файл перевода (*.qm) формируемый из исходных TS-файлов.

Проблема в том, что qmake при первом запуске встречая в проекте файл ресурсов (*.qrc), проверяет, все ли ресурсы доступны.
А так как на этом этапе файл переводов еще не скомпилися, то RCC выдает ошибку
Код
Bash
RCC: Error in '../../src/res/resources.qrc': Cannot find file '../ts/cksmon_ru.qm'

И соответственно сборка проекта заканчивается ошибкой.
Но повторная компиляция конечно решает проблему, но это "неаккуратненько как-то".

У кого есть элегантное решение?


Название: Re: Динамически формируемый ресурс
Отправлено: Alex Custov от Сентябрь 21, 2015, 17:52
С qmake - нет. Такие дела, да.


Название: Re: Динамически формируемый ресурс
Отправлено: __Heaven__ от Сентябрь 22, 2015, 10:32
Быть может перед qmake добавить этап сборки, который будет отвечать за создание файла?


Название: Re: Динамически формируемый ресурс
Отправлено: Racheengel от Сентябрь 22, 2015, 11:08
Делить на 2 проекта, один будет генерить файлы, другой собирать ресурсы.


Название: Re: Динамически формируемый ресурс
Отправлено: qate от Сентябрь 22, 2015, 11:08
скрип, все равно же его писать
и делать релиз под отдельной чистой ОС, в виртуалке


Название: Re: Динамически формируемый ресурс
Отправлено: andrew.k от Сентябрь 22, 2015, 12:09
Делить на 2 проекта, один будет генерить файлы, другой собирать ресурсы.
Я так пробовал. Это не работает, поскольку qmake проходит по всем подпроектам сразу и получается тот же результат.


Название: Re: Динамически формируемый ресурс
Отправлено: andrew.k от Сентябрь 22, 2015, 12:10
Быть может перед qmake добавить этап сборки, который будет отвечать за создание файла?
Как это сделать? Если речь о QMAKE_EXTRA_TARGETS, то если кратко, то тоже не получается.


Название: Re: Динамически формируемый ресурс
Отправлено: andrew.k от Сентябрь 22, 2015, 12:10
скрип, все равно же его писать
и делать релиз под отдельной чистой ОС, в виртуалке

Что?


Название: Re: Динамически формируемый ресурс
Отправлено: __Heaven__ от Сентябрь 22, 2015, 15:27
Build Steps


Название: Re: Динамически формируемый ресурс
Отправлено: qate от Сентябрь 22, 2015, 16:07
скрип, все равно же его писать
и делать релиз под отдельной чистой ОС, в виртуалке

Что?


1. писать скипт, где сначала вызывать лингвист, а затем сборку основного проекта

2. скрипт все равно понадобится для итоговой сборки, которую удобно делать на другой машине https://ru.wikipedia.org/wiki/Непрерывная_интеграция


Название: Re: Динамически формируемый ресурс
Отправлено: andrew.k от Сентябрь 23, 2015, 02:04
Build Steps
Это будет работать только в креаторе. Не интересно.
И зачем делать еще один лишний командный файл, если все нужные команды можно указать в этапах сборки? Но все равно не интересно)


Название: Re: Динамически формируемый ресурс
Отправлено: andrew.k от Сентябрь 23, 2015, 02:05
скрип, все равно же его писать
и делать релиз под отдельной чистой ОС, в виртуалке

Что?


1. писать скипт, где сначала вызывать лингвист, а затем сборку основного проекта

2. скрипт все равно понадобится для итоговой сборки, которую удобно делать на другой машине https://ru.wikipedia.org/wiki/Непрерывная_интеграция
То есть элегантное решение это скрипт на две команды? Думаешь это я искал?  ???

Еще можно сделать алиас для make
Код
Bash
alias make="lupdate *.pro 1>/dev/null &2>1; make"
 
Решение ваще огонь!


Название: Re: Динамически формируемый ресурс
Отправлено: qate от Сентябрь 23, 2015, 08:35
То есть элегантное решение это скрипт на две команды? Думаешь это я искал?  ???

это пока две )

именно средствами qmake не знаю как это сделать


Название: Re: Динамически формируемый ресурс
Отправлено: Alex Custov от Сентябрь 23, 2015, 17:54
именно средствами qmake не знаю как это сделать

qmake для такого не приспособлен. Я тоже когда-то пытался сделать всё мегауниверсально, чтобы само всё находилось и т.д., но решением стало только наличие внешнего скрипта, который запускается вручную.


Название: Re: Динамически формируемый ресурс
Отправлено: andrew.k от Сентябрь 24, 2015, 19:18
именно средствами qmake не знаю как это сделать

qmake для такого не приспособлен. Я тоже когда-то пытался сделать всё мегауниверсально, чтобы само всё находилось и т.д., но решением стало только наличие внешнего скрипта, который запускается вручную.
Описанную проблему удалось решить.
Пока получилось сделать вот так. Под linux работает. Проверьте под win кто-нибудь, пожалуйста.

Теперь qmake не ругается на отсутствующий файл. Поскольку он генерится самим qmake.
Файлы переводов обновляются при изменении, т.к. для них заданы дополнительные правила.
Внешний скрипт не используется. Все запихано в один подключаемый к проекту файл.

Ваши мнения? То что это изврат и CMake круто и так понятно)

Листинг translations.pri
Код
C++ (Qt)
isEmpty(QMAKE_LRELEASE) {
       win32: QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe
       else: QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease
}
 
#system($$QMAKE_LRELEASE $$_PRO_FILE_)
 
# Compiling translations by qmake for to make RCC happy
for(TS, TRANSLATIONS){
BN=$$basename(TS)
QM=$$$$section(BN, .,0,-2).qm
QMPATH=$$clean_path($$_PRO_FILE_PWD_/$$dirname(TS))
QMTMP=$${QMPATH}/$${QM}.tmp
QMNEW=$$QMPATH/$${QM}
system($$QMAKE_LRELEASE $$_PRO_FILE_PWD_/$$TS -qm $${QMTMP} 1>/dev/null)
win32: system(fc $${QMNEW} $${QMTMP} >NUL \
   && del $${QMTMP} \
   || (move $${QMTMP} $${QMNEW};echo Translation $${QM} compiled))
else: system(diff $${QMNEW} $${QMTMP} 1>/dev/null 2>/dev/null \
   && rm -f $${QMTMP} \
   || (mv -f $${QMTMP} $${QMNEW};echo Translation $${QM} compiled))
 
QMAKE_CLEAN += $$QMPATH/$${QM}
}
 
# Normal way to compile translations by make
updateqm.input = TRANSLATIONS
updateqm.output = ${QMAKE_FILE_BASE}.qm
updateqm.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_PATH}/${QMAKE_FILE_BASE}.qm
updateqm.CONFIG += no_link target_predeps
 
QMAKE_EXTRA_COMPILERS += updateqm