Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: Гурман от Ноябрь 26, 2014, 16:40



Название: Удаление и копирование файлов при сборке сложного проекта
Отправлено: Гурман от Ноябрь 26, 2014, 16:40
При сборке проекта (в любом месте, можно в конце) надо удалять копии одних целевых файлов сборки (буквально TARGET, но с добавлением числового префикса к имени) и создавать автоматически копии других, тоже с добавлением префиксов. Читал, как это делается в файле проекта, чего-то написал, но оно не заработало, потому что макроимена оказались не определены. Кто-нибудь может показать похожие действия в своих файлах проектов? Речь именно о создании копий и удалении почти одноименных целевой сборке. Собираются динамические библиотеки, соответственно, файлы должны иметь правильные суффиксы в разных ОС. Ковырять варианты сейчас нет возможности - надо делать сам проект, там вагон работы. Плз, подскажите варианты правильных строк для файла проекта, а то сейчас при каждой отладочной сборке приходится все файлы (до 8 штук) удалять и копировать вручную.


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: alex312 от Ноябрь 26, 2014, 18:32
Я сильно над файлами проекта не издеваюсь. Если мне нужны дополнительные действия после сборки - пишу батничек.


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: Гурман от Ноябрь 26, 2014, 19:01
Я сильно над файлами проекта не издеваюсь. Если мне нужны дополнительные действия после сборки - пишу батничек.

этот вариант не приемлем - для всех целевых ОС батнички придется писать, хотя всё по идее, в проекте можно сделать, но что-то не получается, переменные оказываются пустыми


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: alex312 от Ноябрь 26, 2014, 20:35
этот вариант не приемлем - для всех целевых ОС батнички придется писать, хотя всё по идее, в проекте можно сделать, но что-то не получается, переменные оказываются пустыми
Да, для разных платформ прийдется писать свои батнички, или использовать какой-нить скриптовый язык (Python например). Но и для проектного файла вам надо будет писать врианты для разных OS, потому как удаление файла система сборики не делает сама, она для этого использует системные команды. Тоже касается и переименования.


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: Гурман от Ноябрь 26, 2014, 21:24
Да, для разных платформ прийдется писать свои батнички, или использовать какой-нить скриптовый язык (Python например). Но и для проектного файла вам надо будет писать врианты для разных OS, потому как удаление файла система сборики не делает сама, она для этого использует системные команды. Тоже касается и переименования.

Ничего не придётся писать, если всё сделать в файле проекта. Там команды ОС автоматически настраиваются, ну да ладно. Проблема не в этом. Я не могу  получить имена выходных файлов, но сама команда генерится правильно.

Собственно, я застрял на этом

Код:
QMAKE_POST_LINK = $$QMAKE_COPY $$DESTDIR/$$(TARGET).$$(TARGET_EXT) "$$DESTDIR/1_$$(TARGET).$$(TARGET_EXT)"

что генерит команду

Код:
copy /y ../mydir/. ../mydir/1_.

то есть, почему-то TARGET_EXT и даже TARGET оказываются пустыми, хотя в начале проекта написано

Код:
TARGET = cicontrol
TEMPLATE = lib

Вот и вопрос - что я сделал неправильно, и как сделать правильно? Просьба ответить тем, кто точно знает ответ.
 


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: Igors от Ноябрь 27, 2014, 11:47
Просьба ответить тем, кто точно знает ответ.
Ответ точно не знаю. т.к. не работаю с Creator. Но месяца 2 назад тоже долбался со скрипами в др IDE. Оказалось после доллара нужны фигурные скобки, а я недоглядел и лепил круглые


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: Гурман от Ноябрь 27, 2014, 12:00
А-ха... таким макаром TARGET-имя оно подставило, но TARGET_EXT нифига. Вопрос меняется следующим образом - как правильно в файле проекта получить расширение для создаваемой динамической библиотеки, при том, что включено TEMPLATE=lib?


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: Igors от Ноябрь 27, 2014, 13:08
Да, и у меня дело пошло намного быстрее когда я научился печатать переменные


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: kuzulis от Ноябрь 27, 2014, 13:35
Мы в serial port (для Qt4) используем что-то типа такого:

Код:
TARGET = $$qtLibraryTarget(QtSerialPort$$QT_LIBINFIX)

но вроде оно не для расширения. Возможно есть еще какой-то макрос для указания расширения.. Я не в курсе.

ЗЫ: Проше все переписать на QBS :)



Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: Гурман от Ноябрь 27, 2014, 13:49
Мы в serial port (для Qt4) используем что-то типа такого:

Код:
TARGET = $$qtLibraryTarget(QtSerialPort$$QT_LIBINFIX)

но вроде оно не для расширения. Возможно есть еще какой-то макрос для указания расширения.. Я не в курсе.

ЗЫ: Проше все переписать на QBS :)

Сейчас уже не проще, и вообще не с руки менять инструментарий. Проще всего руками копировать и удалять, хотя это доставляет.


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: kambala от Ноябрь 27, 2014, 13:56
почему переменные в скобках? там просто два доллара и имя


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: vregess от Ноябрь 27, 2014, 14:15
Не особо разбираюсь в qmake, да и стараюсь его стороной обходить, если возможно, но судя по документации TARGET_EXT предназначен для переопределения системного расширения, т.е. если значение пустое, то используется расширение по дефолту.

Можно либо самому создавать переменную с расширением, в зависимости от платформы:
Код:
win32 {
  EXT=..
}
unix {
  EXT=..
}

либо попробовать custom targets, там вроде можно узнать расширение.
Код:
mytarget.input = QMAKE_TARGET
mytarget.output = ${QMAKE_FILE_IN_BASE}_1${QMAKE_FILE_EXT}
mytarget.commands = copy /y ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
mytarget.depends = ${TARGET}
QMAKE_EXTRA_TARGETS += mytarget

не совсем уверен, как прописать .input - устанавливает переменную, которая содержит входной файл (абсолютный путь) и .depends - таргет, от которого зависит mytarget, должен указывать на цель, которая собирает библиотеку.

Затем по идее можно собирать make mytarget. Сначала скомпилится библиотека, а потом должен запуститься mytarget.

Тут подробнее http://www.qtcentre.org/wiki/index.php?title=Undocumented_qmake (http://www.qtcentre.org/wiki/index.php?title=Undocumented_qmake) + документация qmake (Adding Custom Targets).

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


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: Гурман от Ноябрь 27, 2014, 16:07
почему переменные в скобках? там просто два доллара и имя

Да я как только не пробовал... Без разницы. Также точно пусто вместо них в командной строке.


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: Гурман от Ноябрь 27, 2014, 16:12
Можно либо самому создавать переменную с расширением, в зависимости от платформы:

Да это понятно, что можно самому, но это костыль, поскольку QMake расширения знает. Мало ли на какой платформе надо будет генерить.

В undcumented про расширение target ничего не нашёл. Только про input.


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: vregess от Ноябрь 27, 2014, 16:45
В undcumented про расширение target ничего не нашёл. Только про input.

А если в input положить target?

QMake расширения знает

Знать-то он знает, но не факт, что он тебе скажет. Может он просто не отдает такую информацию (ну или не во всех контекстах) во вне.


Название: Re: Удаление и копирование файлов при сборке сложного проекта
Отправлено: Гурман от Ноябрь 27, 2014, 16:56
А если в input положить target?

Под input имеются в виду данные текущего входного файла при генерации Makefile. Никакого смысла туда "класть" target нет.