Внедрение Mercurial Changeset в качестве информации о версии в исполняемом файле C - PullRequest
10 голосов
/ 29 августа 2010

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

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

Спасибо!

Setjmp

Ответы [ 3 ]

6 голосов
/ 31 августа 2010

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

AC_INIT([GNU Autoconf], m4_esyscmd([build-aux/git-version-gen .tarball-version]), 
  [bug-autoconf@gnu.org])

Вы часто можете уйти без распространения сценария и сделать что-то простое, например:

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

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

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

5 голосов
/ 01 сентября 2010

Добавьте это к 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, если строится из архива выпуска.

1 голос
/ 29 августа 2010

См. Вики-страницу на версиях с make

...