Получить номер версии в VS с помощью qmake

Мой текущий рабочий процесс:

  1. hg update (или что-то другое, что используется для извлечения версии)
  2. MyProject.proqmakeMyProject.vcproj
  3. Откройте Visual Studio, отредактируйте файлы
  4. Построить проект

Как на этапе сборки обновить файл заголовка config.h информацией из системы контроля версий (например, hg id)?

MyProject.vcproj создается qmake, поэтому мне не нужно редактировать его вручную.


person Andrew T    schedule 08.10.2009    source источник


Ответы (4)


Вы можете выполнять внешние команды изнутри qmake. Самый простой способ сделать информацию доступной в ваших источниках — использовать определение:

HGID = $$system(hg id)
DEFINES += HGID=\\\"$$HGID\\\"

Я не уверен, что вы можете редактировать внешний файл из qmake. Вы можете использовать внешний инструмент, но в Windows у вас обычно нет таких вещей, как sed, поэтому это может быть немного более проблематично.

person Lukáš Lalinský    schedule 08.10.2009
comment
Эта команда будет выполнена во время запуска qmake. Я хочу выполнить его непосредственно перед компиляцией исходного кода. Кажется, нет простого способа сделать это. - person Andrew T; 08.10.2009

Вы можете сделать это, используя пользовательскую цель сборки и ключевое слово PRE_TARGETDEPS. Предполагая, что config.h.in имеет следующий формат:

#define HGID $HGID

Вы можете определить пользовательскую цель сборки, которая будет обрабатывать hgid.h.in и выводить в hgid.h перед созданием основной цели следующим образом:

hgid.target = hgid
hgid.commands = sed s/\\\$$HGID/`hg id`/ hgid.h.in > hgid.h
QMAKE_EXTRA_TARGETS += hgid
PRE_TARGETDEPS += hgid
person Ton van den Heuvel    schedule 09.10.2009
comment
Я не могу заставить его работать после преобразования в проект Visual Studio (с помощью qmake). Кажется, исчезает. Если та же самая команда добавлена ​​к QMAKE_POST_LINK, то она правильно отображается на этапе пост-сборки. (Тем не менее, для этого варианта использования это слишком поздно.) - person Adam Badura; 06.02.2013

Один из вариантов — включить расширение ключевых слов. Поместите что-то вроде этого в свой hgrc (или Mercurial.ini, если вам это нравится):

[extensions]
hgext.keyword=

[keyword]
config.h =

[keywordmaps]
HGREV = {node}

Затем в config.h поместите:

#define HGREV "$HGREV$"

Возможно, вам потребуется разобрать шестнадцатеричное значение из «$HGREV: deadbeefdeadbeef $», которое вы получите, но это легко сделать любым кодом, обращающимся к определению HGREV.

person Ry4an Brase    schedule 09.10.2009

В дополнение к комментарию Lukáš Lalinský и goodrone, я хотел бы отметить, что qmake может ссылаться непосредственно на скрипт, а не только на его вывод. Так что можно сказать

DEFINES += REPO_ID=\\\"`./setlocalversion.sh`\\\"

и скрипт будет заново выполняться для каждой отдельной цели.

person marvin2k    schedule 05.07.2010
comment
Это не работает, если команда оболочки содержит пробелы, так как qmake вставляет -D в команду. Вы должны окружить это ': '\\\"`./setlocalversion.sh --some --parameters`\\\"' (Что за побег из ада: SO-разметка, qmake, make, shell...) - person iliis; 03.06.2014
comment
И как еще одно осложнение: если вывод вашей команды также содержит пробелы, вам нужен еще один слой двойных кавычек. Но тогда вы больше не сможете выполнять код с обратными кавычками и должны использовать $(shell): см. stackoverflow.com/a/24010395/211520 подробности. - person iliis; 03.06.2014