Russian Qt Forum
Ноябрь 23, 2024, 06:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамически формируемый ресурс  (Прочитано 7409 раз)
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'

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

У кого есть элегантное решение?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Сентябрь 21, 2015, 17:52 »

С qmake - нет. Такие дела, да.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Сентябрь 22, 2015, 10:32 »

Быть может перед qmake добавить этап сборки, который будет отвечать за создание файла?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Сентябрь 22, 2015, 11:08 »

Делить на 2 проекта, один будет генерить файлы, другой собирать ресурсы.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #4 : Сентябрь 22, 2015, 11:08 »

скрип, все равно же его писать
и делать релиз под отдельной чистой ОС, в виртуалке
Записан
andrew.k
Гость
« Ответ #5 : Сентябрь 22, 2015, 12:09 »

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

Быть может перед qmake добавить этап сборки, который будет отвечать за создание файла?
Как это сделать? Если речь о QMAKE_EXTRA_TARGETS, то если кратко, то тоже не получается.
« Последнее редактирование: Сентябрь 22, 2015, 12:19 от andrew.k » Записан
andrew.k
Гость
« Ответ #7 : Сентябрь 22, 2015, 12:10 »

скрип, все равно же его писать
и делать релиз под отдельной чистой ОС, в виртуалке

Что?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Сентябрь 22, 2015, 15:27 »

Build Steps
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #9 : Сентябрь 22, 2015, 16:07 »

скрип, все равно же его писать
и делать релиз под отдельной чистой ОС, в виртуалке

Что?


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

2. скрипт все равно понадобится для итоговой сборки, которую удобно делать на другой машине https://ru.wikipedia.org/wiki/Непрерывная_интеграция
Записан
andrew.k
Гость
« Ответ #10 : Сентябрь 23, 2015, 02:04 »

Build Steps
Это будет работать только в креаторе. Не интересно.
И зачем делать еще один лишний командный файл, если все нужные команды можно указать в этапах сборки? Но все равно не интересно)
« Последнее редактирование: Сентябрь 23, 2015, 02:08 от andrew.k » Записан
andrew.k
Гость
« Ответ #11 : Сентябрь 23, 2015, 02:05 »

скрип, все равно же его писать
и делать релиз под отдельной чистой ОС, в виртуалке

Что?


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

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

Еще можно сделать алиас для make
Код
Bash
alias make="lupdate *.pro 1>/dev/null &2>1; make"
 
Решение ваще огонь!
« Последнее редактирование: Сентябрь 23, 2015, 02:13 от andrew.k » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #12 : Сентябрь 23, 2015, 08:35 »

То есть элегантное решение это скрипт на две команды? Думаешь это я искал?  Непонимающий

это пока две )

именно средствами qmake не знаю как это сделать
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #13 : Сентябрь 23, 2015, 17:54 »

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

qmake для такого не приспособлен. Я тоже когда-то пытался сделать всё мегауниверсально, чтобы само всё находилось и т.д., но решением стало только наличие внешнего скрипта, который запускается вручную.
Записан
andrew.k
Гость
« Ответ #14 : Сентябрь 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
 
 
« Последнее редактирование: Сентябрь 24, 2015, 20:07 от andrew.k » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 23.