2009-10-08 2 views
4

Мой текущий рабочий процесс:Получить номер версии в VS с QMAKE

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

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

MyProject.vcprojqmake, поэтому я не должен редактировать его вручную.

ответ

4

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

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

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

+2

Эта команда будет выполнена во время прогона qmake. Я хочу выполнить его непосредственно перед компиляцией исходного кода. Кажется, нет простого способа сделать это. –

1

Один оппонент должен включить Keyword Extension. Положите что-то подобное в вашем hgrc (или Mercurial.ini, если это ваше дело):

[extensions] 
hgext.keyword= 

[keyword] 
config.h = 

[keywordmaps] 
HGREV = {node} 

Тогда в config.h сайте:

#define HGREV "$HGREV$" 

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

4

Вы можете выполнить это с использованием пользовательской цели сборки и ключевого слова 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 
+0

Я не могу заставить его работать после преобразования в проект Visual Studio (с qmake). Кажется, он исчезает. Если эта же команда добавлена ​​в 'QMAKE_POST_LINK', то она отображается правильно в post post step.(Тем не менее для этого случая использования очень поздно). –

1

В дополнении к Лукасу Лалински и комментарий Goodrone, я хотел бы упомянуть, что qmake может напрямую ссылаться на скрипт, а не только на его вывод. Таким образом, можно сказать

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

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

+0

Это не работает, если команда оболочки содержит пробелы, так как qmake вставляет '-D' в команду. Вы должны окружить это '' ': ' '\\\" \ './setlocalversion.sh --some --parameters \' \\\ '' ' (Что такое побег ад: SO разметки, qmake, make, shell ...) – iliis

+0

И как еще одно осложнение: если вывод вашей команды содержит пробелы, вам нужен еще один слой двойных кавычек. Но тогда вы больше не можете выполнять код с обратными записями, и вы должны использовать '$ (shell)': подробнее см. Http://stackoverflow.com/a/24010395/211520. – iliis