Мне бы хотелось, чтобы исполняемые файлы проекта, над которым я работаю, записывали последние изменения в Mercurial, чтобы когда пользователь жаловался на некорректное поведение, я мог отслеживать, какую версию он использует. Некоторые из моих исполняемых файлов - это Python, а другие - скомпилированные C. Есть ли способ автоматизировать это, или вы можете указать мне на проекты, которые предлагают решения, на которые я могу посмотреть?
Я использую autoconf в своем проекте ... в случай, который облегчает решение.
Спасибо!
Setjmp
Добавьте это в 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
, если сборка производится из tar-архива.
Обычно это делается с помощью m4_esyscmd. Например, autoconf распространяет сценарий в build-aux, который генерирует номер версии из репозитория git и вызывает 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- описать, используйте любую команду, которую вы хотите сгенерировать номер версии. Одна важная деталь заключается в том, что он не должен иметь завершающую новую строку (отсюда tr после git-describe).
Основным недостатком этого метода является то, что номер версии генерируется только при запуске autoconf.