Внесение меркурийных изменений в качестве информации о версии в исполняемом файле 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.
Ответ 3
См. страницу wiki управление версиями с make