Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: Гурман от Май 12, 2015, 22:32



Название: Формирование текстового файла в qmake проекте
Отправлено: Гурман от Май 12, 2015, 22:32
В стандартном qmake-проекте требуется формировать текстовый файл, в который надо записывать некий текст и подставлять в него имя TARGET, заданное в этом проекте. Решение должно быть мультиплатформенным, поэтому команд ОС типа "copy чего-то-там" необходимо избежать.

Подробнее - надо до сборки проекта формировать файл ресурсов, в который надо вкатать TARGET проекта, как префикс ресурса. То есть, надо в проекте создавать файл w.qrc, в который должен быть записан текст: <RCC><qresource prefix="/$$TARGET"><file>w.png</file></qresource></RCC> где $$TARGET - динамически подставляемое имя цели сборки проекта. То есть, если в начале проекта TARGET=widgetbutton, то в w.qrc должно записаться <RCC><qresource prefix="/widgetbutton"><file>w.png</file></qresource></RCC>

Может это другим способом можно сделать?


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: kambala от Май 13, 2015, 14:14
echo "ляляля" > w.qrc

в виндовой цмд вроде точно так же пишется. только кавычки экранировать надо.


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: Гурман от Май 13, 2015, 18:51
echo "ляляля" > w.qrc

в виндовой цмд вроде точно так же пишется. только кавычки экранировать надо.

Не хочется в проекте с командным процессором ОС связываться. Нужно что-то типа fprintf() но не видно.


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: Old от Май 13, 2015, 19:03
Не хочется в проекте с командным процессором ОС связываться.
qmake не очень навороченная система сборки, вы вряд ли обойдетесь без внешних инструментов.


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: Гурман от Май 13, 2015, 19:32
system(echo) тоже не работает...

system(echo "test" > t.txt) - записывает в файл
system(echo "\<RCC\>\<qresource prefix=\"/$${TARGET}\"\>\<file\>w.png\</file\>\</qresource\>\</RCC\>" > w.qrc) - ругается три раза на "устаревшие обратные слэши" и "неожиданный >", и ничего не записывает, добавление \  к / не помогает

ЗЫ и даже system(echo "\<RCC\>" > w.qrc) ничего не делает. Символы < и > в любом виде, хоть со слэшем, хоть без - колдобят парсер, команда не выполняется. Я даже не пробовал сначала, подозревал этот косяк, поэтому и говорю, что нужно иначе.

Можно, конечно, бинарник сваять, который будет создаваться первым в проекте, и запускаться той же командой system... Но как-то это криво уже.


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: kambala от Май 13, 2015, 23:10
Код:
createFileTarget.commands = echo \\<RCC\\>\\<qresource prefix=\\\"/$$TARGET\\\"\\>\\<file\\>w.png\\</file\\>\\</qresource\\>\\</RCC\\> > w.qrc
PRE_TARGETDEPS += createFileTarget
QMAKE_EXTRA_TARGETS += createFileTarget


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: Гурман от Май 13, 2015, 23:46
Код:
createFileTarget.commands = echo \\<RCC\\>\\<qresource prefix=\\\"/$$TARGET\\\"\\>\\<file\\>w.png\\</file\\>\\</qresource\\>\\</RCC\\> > w.qrc

Ya plakalЪ...

Спасибо, на самом деле, если заработает.


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: kambala от Май 14, 2015, 15:09
qmake такой qmake :)


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: Гурман от Май 15, 2015, 14:04
up

на самом деле, и так не работает...

Код:
createFileTarget.commands = echo \\<RCC\\>\\<qresource prefix=\\\"/$$TARGET\\\"\\>\\<file\\>w.png\\</file\\>\\</qresource\\>\\</RCC\\> > w.qrc
- ругается на неизвестную команду при выполнении командного процессора ОС

Код:
createFileTarget.commands = "echo \\"\\<RCC\\>\\<qresource prefix=\\\"/$$TARGET\\\"\\>\\<file\\>w.png\\</file\\>\\</qresource\\>\\</RCC\\>\\" > w.qrc"
- записывает файл w.qrc, но с кучей ненужных обратных слешей

Код:
createFileTarget.commands = "echo <RCC><qresource prefix="/$$TARGET"><file>w.png</file></qresource></RCC> > w.qrc"

- командный процессор ругается на неожиданный символ <

Код:
createFileTarget.commands = "echo \"<RCC><qresource prefix="/$$TARGET"><file>w.png</file></qresource></RCC>\" > w.qrc"

- записывает файл w.qrc, но с двойными кавычками в начале и конце строки, на что ругается компилятор ресурсов

Последний вариант - почти то, что надо, но не получается убрать двойные кавычки из записываемого файла. Это уже дебилизм разработчиков из Microsoft - при выполнении команды echo она печатает двойные кавычки вместе с текстом.


Название: Re: Формирование текстового файла в qmake проект
Отправлено: Johnik от Май 15, 2015, 14:13
записывает файл w.qrc, но с двойными кавычками в начале и конце строки, на что ругается компилятор ресурсов
попробуйте символ '<' и '>' esc'апить символом '^' - в bat файлах именно он предназначен для экранирования.


Название: Re: Формирование текстового файла в qmake проект
Отправлено: Гурман от Май 15, 2015, 14:28
записывает файл w.qrc, но с двойными кавычками в начале и конце строки, на что ругается компилятор ресурсов
попробуйте символ '<' и '>' esc'апить символом '^' - в bat файлах именно он предназначен для экранирования.

Мне нужен мультиплатформенный вариант.


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: Johnik от Май 15, 2015, 14:31
Код:
win32: {
...
} else {
...
}


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: kambala от Май 15, 2015, 19:47
я в мак ос с 4.8.5 тестировал, кури батманы


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: twp от Май 21, 2015, 13:09
Возможно QMAKE_SUBSTITUTES (https://wiki.qt.io/QMake-top-level-srcdir-and-builddir#Qt_4_based_solution) то что надо


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: Гурман от Май 21, 2015, 20:24
Возможно QMAKE_SUBSTITUTES (https://wiki.qt.io/QMake-top-level-srcdir-and-builddir#Qt_4_based_solution) то что надо

По описанию очень похоже... надо попробовать.

Не. Оно копирует в каталог сборки. А мне надо, чтобы попадало в каталог проекта. Если бы у этой команды параметр targetdir был, то было бы самое то.


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: twp от Май 21, 2015, 21:59
Оно, просто требовать от "замены по шаблону" еще и копирование файла шаблона уже слишком :)
А собственно в чем проблема задать копирование файла-шаблона в директорию проекта? Вот примерный вариант:

Код:
!exists($$OUT_PWD/template.qrc.in) {
    COPY_CMD = $$QMAKE_COPY <SOURCE_DIR>\template.qrc.in $$OUT_PWD/template.qrc.in
    system($$COPY_CMD)
}

QMAKE_SUBSTITUTES += $$OUT_PWD/template.qrc.in

P.S. Пути для копирования системно-зависимые, и для винды надо делать замену:

Код:
WIN_OUT_PWD = $$replace(OUT_PWD, /, \\)


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: Гурман от Май 21, 2015, 22:35
Только наоборот - после работы QMAKE_SUBSTITUTES результат без .in надо копировать в подкаталог проекта. И желательно удалять его в каталоге сборки. Иначе там будет болтаться файл с одинаковым именем, но с разным содержимым, относящийся к разным подпроектам... Такие вещи чреваты разными неожиданностями.


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: twp от Май 21, 2015, 23:24
Можно заменить вместо QMAKE_COPY на QMAKE_MOVE для переноса с удалением. Но вообще я не совсем понял манипуляции с каталогами. Пример как организовано в моем проекте: файл шаблона (допустим w.qrc.in) лежит в каком-то общем каталоге (не принадлежащему ни одному из проектов) под контролем версий и он используется как шаблон для генерации файлов в нескольких проектах. В каждом проекте в pro-файле прописано копирование файла-шаблона в каталог проекта и генерация собственно целевого файла. В итоге в каталоге сборки проекта будут находятся файлы w.qrc.in и сгенерированный w.qrc. Оба файла удаляются при полной очистке сборки через git clean -dfx.


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: Гурман от Май 22, 2015, 00:29
Можно заменить вместо QMAKE_COPY на QMAKE_MOVE для переноса с удалением. Но вообще я не совсем понял манипуляции с каталогами. Пример как организовано в моем проекте: файл шаблона (допустим w.qrc.in) лежит в каком-то общем каталоге (не принадлежащему ни одному из проектов) под контролем версий и он используется как шаблон для генерации файлов в нескольких проектах. В каждом проекте в pro-файле прописано копирование файла-шаблона в каталог проекта и генерация собственно целевого файла. В итоге в каталоге сборки проекта будут находятся файлы w.qrc.in и сгенерированный w.qrc. Оба файла удаляются при полной очистке сборки через git clean -dfx.

У меня у всех соответствующих подпроектов (TEMPLATE = subdirs) один и тот же target dir. Более того, у них один и тот же код сборки в файле .pro, который инклюдится из одного файла w.pri. Эти подпроекты - плагины, которые собираются сразу там, откуда их на отладку грузит папа-проект, а он грузит их из одного каталога app_path/plugins. А w.qrc при сборке каждого плагина должен находиться у каждого подпроекта в том же каталоге, где находится его w.pro. Ибо w.qrc - это специфичный ресурс плагина с его иконкой, которая тут же рядом лежит. Если у всех подпроектов QMAKE_SUBSTITUTES будет кидать w.qrc в каталог сборки - это значит, что он будет кидать его в один и тот же каталог, где вообще то он совершенно не нужен. И т.д. - после каждого вызова qmake для любого плагина, каждому плагину будет пришиваться один и тот же файл описания ресурсов. Чтобы этого не было, из общего каталога сборки, после QMAKE_SUBSTITUTES необходимо утаскивать полученный w.qrc в каталог исходников плагина. Муторно это всё как-то...


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: twp от Май 22, 2015, 19:44
Чтобы этого не было, из общего каталога сборки, после QMAKE_SUBSTITUTES необходимо утаскивать полученный w.qrc в каталог исходников плагина. Муторно это всё как-то...

А не проще ли скопировать w.qrc.in в каждую деректорию плагина к w.pro и уже там делать подмену параметров шаблона? Я так понимаю, что QMAKE_SUBSTITUTES прописывается в w.pri?


Название: Re: Формирование текстового файла в qmake проекте
Отправлено: Гурман от Май 24, 2015, 01:00
Чтобы этого не было, из общего каталога сборки, после QMAKE_SUBSTITUTES необходимо утаскивать полученный w.qrc в каталог исходников плагина. Муторно это всё как-то...

А не проще ли скопировать w.qrc.in в каждую деректорию плагина к w.pro и уже там делать подмену параметров шаблона? Я так понимаю, что QMAKE_SUBSTITUTES прописывается в w.pri?

w.qrc.in будет одинаковый для всех плагинов, нет особого смысла его размножать, тем более, что на необходимость копировать w.qrc это никак не влияет