2010-08-29 13 views
10

Me gustaría que los ejecutables de un proyecto en el que estoy trabajando tengan el último conjunto de cambios mercurial para que cuando un usuario se queja de comportamiento incorrecto, pueda rastrear qué versión están usando . Algunos de mis ejecutables son Python y otros están compilados. C. ¿Existe alguna manera de automatizar esto, o pueden dirigirme a proyectos que muestran soluciones que puedo ver?Inyectar conjunto de cambios mercurial como información de versión en un ejecutable C

Estoy usando autoconf en mi proyecto ... en caso de que la solución sea más fácil.

Gracias!

setjmp

Respuesta

5

Añadir esto a configure.ac:

AM_CONDITIONAL([IS_HG_REPO], [test -d "$srcdir/.hg"]) 

añadir las siguientes líneas a Makefile.am:

if IS_HG_REPO 
AM_CPPFLAGS = -DHGVERSION="\"$(PACKAGE) `hg parents --template 'hgid: {node|short}'`\"" 
else 
AM_CPPFLAGS = -DHGVERSION=PACKAGE_STRING 
endif 

Esto definirá HGVERSION como una cadena de la forma APPNAME hgid: 24d0921ee4bd o APPNAME VERSION, si la construcción de un archivo comprimido de liberación .

+0

Esto solo funcionará si la información del repositorio está incluida en el tarball. Si suponemos que automake está en uso, 'make dist' no incluirá esa información, por lo que esta solución no le permitirá generar un tarball utilizable. –

+0

@William: ahora compruebo para '$ srcdir/.hg' y creo que evito el problema que ha planteado. –

1

página wiki Ver en versioning with make

+0

La página de manual para heirloom make no dice nada sobre '$ (shell)', lo que me lleva a sospechar que se trata de un GNUism. Presentaré una solución alternativa en una respuesta separada. –

6

Una forma común de hacerlo es con m4_esyscmd. Por ejemplo, autoconf distribuye una secuencia de comandos en la acumulación de aux que genera un número de versión del repositorio git e invoca AC_INIT como:

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

A menudo se puede escapar sin distribuir el guión y hacer algo tan simple como:

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

En lugar de git-describe, use el comando que desee para generar el número de versión. Un detalle importante es que no debe tener una línea nueva posterior (de ahí el tr siguiente git-describe).

Un inconveniente principal de esta técnica es que el número de versión solo se genera cuando ejecuta autoconf.

+0

Una opción un poco mejor sería solo poner números de versión reales en 'AC_INIT', pero use' AC_DEFINE' o 'AC_DEFINE_UNQUOTED' para obtener la revisión de hg en el momento de configurar, en lugar de en tiempo de autoconf. Mejor aún es agregar una línea en 'Makefile.am', por lo que la versión correcta de hg se define en el momento de hacer. –

+0

@Jack Desafortunadamente, hacerlo solo funcionará cuando compile desde un repositorio. Si descomprime un tarball y ejecuta configure, la información del repositorio no aparece (a menos que construya el destino 'dist' para empaquetar la información del repos en el archivo tar, pero probablemente sea una mala idea.) –

+0

Su observación es correcta, pero tengo un solución alternativa que usa 'AM_CONDITIONAL' y busca' $ srcdir/.hg'. He actualizado mi respuesta. –

Cuestiones relacionadas