Как я могу использовать AC_REVISION с Git? - PullRequest
9 голосов
/ 21 ноября 2011

При использовании Autoconf в проекте, управляемом с помощью Subversion , я бы поместил этот код в configure.ac:

AC_REVISION($Revision: 1234 $)

Если svn:keywords Revision, AC_REVISION вставит номер редакции configure.ac в сгенерированный сценарий configure.

Как мне сделать нечто подобное в проекте, управляемом с помощью Git ?

Git не имеет таких ключевых слов, как $Revision$, и не имеет номеров ревизий как таковых. Но у него есть SHA1 для коммитов и git describe. Я просто не уверен, как включить это в configure.ac.

Ответы [ 6 ]

4 голосов
/ 13 марта 2013

ответ ADL не совсем то, что я хотел, но оно указало мне в правильном направлении.Вот что я придумал:

Поместите это в configure.ac:

AC_REVISION([m4_esyscmd([./tools/configure.commit])])

Сохраните это как tools/configure.commit (и сделайте его исполняемым):

#! /bin/sh
# Display the SHA1 of the commit in which configure.ac was last modified.
# If it's not checked in yet, use the SHA1 of HEAD plus -dirty.

if [ ! -d .git ] ; then
  # if no .git directory, assume they're not using Git
  printf 'unknown commit'
elif git diff --quiet HEAD -- configure.ac ; then
  # configure.ac is not modified
  printf 'commit %s' `git rev-list --max-count=1 HEAD -- configure.ac`
else # configure.ac is modified
  printf 'commit %s-dirty' `git rev-parse HEAD`
fi

Эта комбинация поместит SHA-1 коммита, в котором configure.ac последний раз был изменен в configure, что я и искал.Но есть проблема.Git не трогает время модификации файлов, когда оно их фиксирует.Это означает, что configure будет продолжать содержать значение OLDSHA-dirty вместо обновления, потому что autoconf не поймет, что оно устарело.

Это можно решить с помощью ловушки после фиксации.Сохраните это как .git/hooks/post-commit (и убедитесь, что chmod это исполняемый файл, иначе он не запустится):

#!/bin/sh
#
# Copy this to .git/hooks/post-commit

# If configure.ac was just checked in, touch it,
# so that configure will be regenerated and
# AC_REVISION will reflect the new commit.
#
# For some reason, --quiet isn't actually quiet,
# so redirect output to /dev/null

git diff-tree --quiet HEAD -- configure.ac >/dev/null \
 || touch -c configure.ac
3 голосов
/ 23 ноября 2011

Вы можете фактически выполнить любую команду с M4 при запуске Autoconf. Таким образом, может быть, вы хотите что-то вроде:

AC_REVISION([m4_esyscmd_s([git describe --always])])

Обратите внимание, что в отличие от $Revision$ строк ваша configure.ac не будет меняться при каждом обновлении вашего дерева. Следовательно, configure не будет регенерироваться после каждого обновления, а версия, введенная в configure, будет просто последней версией, для которой было сгенерировано configure.

0 голосов
/ 04 июля 2018

Установленное решение autoconf для git использует build-aux/git-version-gen, см. например https://github.com/kergoth/autoconf/blob/master/build-aux/git-version-gen

и тогда вам просто нужно убедиться, что ваши теги используют тот же префикс (т.е. v), что и версия.

AC_INIT([GNU project], m4_esyscmd([build-aux/git-version-gen .tarball-version]), [bug-project@example])

Это работает с версиями git и non-git, где .version отслеживает версию .git dev и .tarball-version версию не git.

0 голосов
/ 02 ноября 2013

Я пытался добиться чего-то похожего на ОП;Я хотел вставить Git commit-id в строку версии Postgres.Код в файле configure.in Postgres, в той же строке, которую я намеревался изменить, уже имел пример.

Суть его в том, что вы можете встроить фрагмент оболочки в строковые литералы в configure.in, ирезультирующий файл configure (на самом деле оболочка, выполняющая скрипт оболочки) всегда будет выполнять этот фрагмент оболочки для построения результирующей строки.

Пожалуйста, смотрите патч .Ниже приведены исправления к configure.in и соответствующий раздел из результирующего файла configure.

AC_DEFINE_UNQUOTED(PG_VERSION_STR,
-                   ["PostgreSQL $PACKAGE_VERSION on $host, compiled by $cc_string, `expr $ac_cv_sizeof_void_p \* 8`-bit"],
+                   ["PostgreSQL $PACKAGE_VERSION (commit `cd $srcdir && git log -1 --format=format:%h`) on $host, compiled by $cc_string, `expr $ac_cv_sizeof_void_p \* 8`-bit"],
                    [A string containing the version number, platform, and C compiler])

Результирующий configure код:

 cat >>confdefs.h <<_ACEOF
-#define PG_VERSION_STR "PostgreSQL $PACKAGE_VERSION on $host, compiled by $cc_string, `expr $ac_cv_sizeof_void_p \* 8`-bit"
+#define PG_VERSION_STR "PostgreSQL $PACKAGE_VERSION (commit `cd $srcdir && git log -1 --format=format:%h`) on $host, compiled by $cc_string, `expr $ac_cv_sizeof_void_p \* 8`-bit"
 _ACEOF

Строка версии Postgres до и после исправления:

PostgreSQL 9.3.0 on x86_64-unknown-linux-gnu, compiled by  ...
PostgreSQL 9.3.0 (commit 2cf9dac) on x86_64-unknown-linux-gnu, compiled by ...
0 голосов
/ 21 ноября 2011
  • Старый, но полезный ответ о Git и ключевых словах
  • Pro Git , см. "Расширение ключевых слов" для получения справки по фильтрам (с хорошим примеромиспользование фильтров для построения ключевого слова $ Date $)
0 голосов
/ 21 ноября 2011

Git имеет нечто подобное, но вы должны специально включить его для соответствующих путей в файле .gitattributes.

   ident
       When the attribute ident is set for a path, git replaces $Id$ in
       the blob object with $Id:, followed by the 40-character hexadecimal
       blob object name, followed by a dollar sign $ upon checkout. Any
       byte sequence that begins with $Id: and ends with $ in the worktree
       file is replaced with $Id$ upon check-in.
...