Внедрение набора изменений mercurial в качестве информации о версии в исполняемый файл C

Я хотел бы, чтобы исполняемые файлы для проекта, над которым я работаю, записывали последний набор изменений mercurial, чтобы, когда пользователь жалуется на ошибочное поведение, я мог отслеживать, какую версию он использует. Некоторые из моих исполняемых файлов написаны на Python, а другие скомпилированы на C. Есть ли способ автоматизировать это, или вы можете указать мне проекты, в которых представлены решения, на которые я могу взглянуть?

Я использую autoconf в своем проекте... на случай, если это упростит решение.

Спасибо!

Setjmp


person Setjmp    schedule 29.08.2010    source источник


Ответы (3)


Добавьте это к configure.ac:

AM_CONDITIONAL([IS_HG_REPO], [test -d "$srcdir/.hg"])

Добавьте следующие строки в Makefile.am:

if IS_HG_REPO
AM_CPPFLAGS = -DHGVERSION="\"$(PACKAGE) `hg parents --template 'hgid: {node|short}'`\""
else
AM_CPPFLAGS = -DHGVERSION=PACKAGE_STRING
endif

Это определит HGVERSION как строку формы APPNAME hgid: 24d0921ee4bd или APPNAME VERSION при сборке из архива выпуска.

person Jack Kelly    schedule 01.09.2010
comment
Это будет работать только в том случае, если информация о репозитории включена в архив. Если мы предположим, что используется automake, make dist не будет включать эту информацию, поэтому это решение не позволит вам создать пригодный для использования tarball. - person William Pursell; 02.09.2010
comment
@William: теперь я проверяю $srcdir/.hg и считаю, что избегаю проблемы, которую вы подняли. - person Jack Kelly; 03.09.2010

Обычно это делается с помощью m4_esyscmd. Например, autoconf распространяет скрипт в build-aux, который генерирует номер версии из репозитория git и вызывает AC_INIT как:

AC_INIT([GNU Autoconf], m4_esyscmd([build-aux/git-version-gen .tarball-version]), 
  [[email protected]])

Часто можно обойтись без распространения скрипта и сделать что-то простое, например:

AC_INIT([Package name], m4_esyscmd([git describe --dirty | tr -d '\012']), 
  [bug-report-address])

Вместо git-describe используйте любую команду, которую хотите сгенерировать номер версии. Одна важная деталь заключается в том, что он не должен иметь завершающую новую строку (отсюда tr после git-describe).

Основным недостатком этого метода является то, что номер версии генерируется только при запуске autoconf.

person William Pursell    schedule 31.08.2010
comment
Несколько лучшим вариантом было бы указать только реальные номера версий в AC_INIT, но использовать AC_DEFINE или AC_DEFINE_UNQUOTED для получения версии hg во время настройки, а не во время автоконференцсвязи. Еще лучше добавить строку в Makefile.am, чтобы во время сборки была определена правильная версия hg. - person Jack Kelly; 01.09.2010
comment
@Jack К сожалению, это будет работать только при сборке из репозитория. Если вы распакуете tar-архив и запустите configure, информация о репозитории будет отсутствовать (если только вы не создадите цель 'dist' для упаковки информации о репо в tar-архив, но это, вероятно, плохая идея). - person William Pursell; 02.09.2010
comment
Ваше наблюдение верно, но у меня есть альтернативное решение, которое использует AM_CONDITIONAL и проверяет $srcdir/.hg. Я обновил свой ответ. - person Jack Kelly; 03.09.2010

См. вики-страницу об управлении версиями с помощью make.

person Hasturkun    schedule 29.08.2010
comment
Страница man для heirloom make ничего не говорит о $(shell), что заставляет меня подозревать, что это GNU-изм. Я предложу альтернативное решение в отдельном ответе. - person Jack Kelly; 01.09.2010