¿Cómo puedo usar AC_REVISION con Git?

Al usar Autoconf en un proyecto administrado con Subversion , pondría este código en configure.ac :

 AC_REVISION($Revision: 1234 $) 

Con svn:keywords Revision , AC_REVISION insertía el número de revisión de configure.ac en el script de configure generado.

¿Cómo puedo hacer algo similar en un proyecto administrado con Git ?

Git no tiene palabras key como $Revision$ , y no tiene numbers de revisión como tales. Pero tiene SHA1 para commits, y git describe . Simplemente no estoy seguro de cómo incorporar eso en configure.ac .

En realidad, puede ejecutar cualquier command con M4 cuando se ejecuta Autoconf. Por lo tanto, tal vez quieras algo como:

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

Tenga en count que a diferencia de $Revision$ strings su configure.ac no cambiará cada vez que actualice su tree. Por lo tanto, configure no se regenerará después de cada actualización y la revisión que se configure será simplemente la última versión para la que se generó la configure .

La respuesta de Adl no era exactamente lo que yo quería, pero me indicó la dirección correcta. Esto es lo que se me ocurrió:

Pon esto en configure.ac :

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

Guarde esto como tools/configure.commit (y hágalo ejecutable):

 #! /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 

Esa combinación pondrá el SHA-1 de la confirmación en la que configure.ac fue modificado por última vez en configure , que es lo que estaba buscando. Pero hay un problema. Git no toca el time de modificación de los files cuando los comete. Esto significa que configure continuará conteniendo el valor OLDSHA-dirty lugar de actualizarse, porque autoconf no se dará count de que está desactualizado.

Puedes resolver eso con un gancho post-commit. .git/hooks/post-commit como .git/hooks/post-commit (y asegúrese de chmod como ejecutable o no se ejecutará):

 #!/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 networkingirect output to /dev/null git diff-tree --quiet HEAD -- configure.ac >/dev/null \ || touch -c configure.ac 

Git tiene algo similar, pero debes habilitarlo específicamente para las routes relevantes a través del file .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. 
  • Respuesta antigua, pero útil sobre Git y palabras key
  • Pro Git , consulte "Expansión de palabras key" para get ayuda con los filters (con un buen ejemplo de uso de filters para la construcción de $ Date $ keyword)

Intentaba lograr algo similar al OP; Quería incrustar Git commit-id en la cadena de versión de Postgres. El código en configure.in de Postgres, en la misma línea que intentaba modificar, ya tenía un ejemplo.

La esencia de esto es que puede incrustar un fragment de shell en literales de cadena en configure.in , y el file de configure resultante (el intérprete de commands que ejecuta el script de shell, en realidad) siempre ejecutará ese fragment de shell para build la cadena resultante.

Por favor mira el parche . Los siguientes son los parches para configure.in la sección relevante del file de configure resultante.

 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]) 

Código de configure resultante:

  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 

Cadena de versión de Postgres antes y después del parche:

 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 ...