LINUX.ORG.RU

Как в qmake заставить перекомпилиться файл, в котором используется изменяемая DEFINE-переменная ?

 , , , ,


0

1

В корне каталога проекта имеется файл version.txt, он автоматически обновляется по определенным требованиям.

Содержимое этого файла передается в DEFINE-переменную:

# Установка qmake переменной с номером версии
SOFTWARE_VERSION = "$$cat(version.txt)"

# Проброс qmake переменной в C/C++
DEFINES += "SOFTWARE_VERSION=\"$$SOFTWARE_VERSION\""


Проблема в том, что если изменяется version.txt, то меняется и DEFINE-переменная SOFTWARE_VERSION. Однако исходные файлы проекта при этом, само собой, никак не меняются.

И проект не пересобирается, потому что изменений в проекте ведь нету. А он должен собраться с новой версией, установленной в version.txt. Причем не обязательно, чтобы пересобирался весь проект. Достаточно собрать с учетом того, что изменился один файл, в котором используется DEFINE-переменная SOFTWARE_VERSION.

Вопрос: как заставить собираться проект с новым значением, если изменился номер версии в файле version.txt?

Ограничение 1: проект большой, полная пересборка - это оверхед.

Ограничение 2: все должно конфижиться через *.pro-файл проекта, никаких дополнительных скриптов быть не должно.

★★★★★

Последнее исправление: Xintrea (всего исправлений: 3)

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

Как надо сделать - заинклудить version.txt в один .cpp’шник где определяется extern константа с версией. Тогда и его изменение будет стандартным образом обнаружено зависимостями по инклудам, и пересборки лишней не потребует, нужно будет пересобрать только один .cpp и перелинковать бинарник.

anonymous
()

А почему бы не делать вместо version.txt сгенерированный и уже готовый version.h и добавлять в HEADERS именно его?

Это ещё и позволит избавится как от дефайна, так и от дополнительных конструкций в *.pro файле. И пересобираться будет именно то, куда заинклудится этот версионный хедер.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от Beewek

Хотя вот сейчас подумал, что в этом случае qmake может и не весь проект пересобрать. Скорее только ресурсы пересоберёт и слинкует.

Так что поддержу EXL, его идея оптимальная.

Beewek ★★
()