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

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

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

Спасибо!

Setjmp

Ответ 1

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

Ответ 2

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

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

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

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

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

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