Incluya el hash de confirmación de Git y / o el nombre de sucursal en la fuente C / C ++

Me gustaría saber cómo puede get un hash de confirmación de Git y / u otra información en los contenidos de una variable de C ++ en el binary comstackdo sin que forme parte de la fuente rastreada por Git.

Necesito hacer un seguimiento de la información de lanzamiento del firmware en un ejecutable comstackdo que se ejecuta en un procesador integrado. Los medios para identificar la versión particular del firmware binary, como nombres de file significativos, sums de comprobación MD5 o incluso marcas de date / hora, no están disponibles en este entorno cerrado (es decir, no hay un sistema de files).

Un enfoque es hacer que la salida de la console del dispositivo produzca text de identificación, como 'Release 1.2.3', 'commit hash 1bc123 …', o similar. La información de liberación del firmware solo le interesa al personal de mantenimiento, por lo que un operador capacitado podría examinar la salida de la console. Para implementar esto, podría implicar la edición manual de una cadena de versión, que luego se comstack en el código y se envía a la console al inicio del progtwig.

Esto es aceptable para las versiones principales en las que se utiliza un flujo de trabajo de firma para verificar que la información de la versión sea correcta. Sin embargo, al tratarse de un process manual, es inherentemente poco confiable. Por ejemplo, ¿qué sucede si el desarrollador olvida actualizar la información de la versión? – Ahora hay una desconnection entre el código comstackdo y su cadena de versión informada.

Un flujo de trabajo donde el código se comstack y descarga recientemente cada vez que el usuario desea probar el hardware no es práctico en la situación en cuestión, es decir, es bastante oneroso actualizar el firmware.

Por lo tanto, se requiere una forma automática de identificar la versión del código. En la situación en cuestión, se usa Git, y los desarrolladores regularmente comprometen su trabajo a contar con sucursales. Mostrar el hash de confirmación de Git, y quizás también si hay o no cambios sin grabar, sería una forma de identificar el estado del código fuente utilizado para comstackr el firmware.

El requisito es que me gustaría que mi aplicación tenga información disponible para que pueda mostrar: "Git commit: [01abcdef … etc], branch: experimentalStuffDoNotRelease"

Por lo tanto, me gustaría include automáticamente información de Git, como commit hash y branch, en el código C y / o C ++ comstackdo.

El entorno de desarrollo tiene desarrolladores que usan Windows y Linux, y usa Eclipse CDT con un flujo de trabajo relativamente sencillo: check-out; comstackr; download al hardware.

Yo uso un file MAKE, así:

GIT_HASH=`git rev-parse HEAD` COMPILE_TIME=`date -u +'%Y-%m-%d %H:%M:%S UTC'` GIT_BRANCH=`git branch | grep "^\*" | sed 's/^..//'` export VERSION_FLAGS=-DGIT_HASH="\"$(GIT_HASH)\"" -DCOMPILE_TIME="\"$(COMPILE_TIME)\"" -DGIT_BRANCH="\"$(GIT_BRANCH)\"" all: g++ main.cpp $(VERSION_FLAGS) 

Cuando se ejecuta el file MAKE, el hash git y el momento de la compilation se cargan en macros accesibles dentro de la fuente, así:

 #include <iostream> int main(){ std::cerr<<"hash="<<GIT_HASH<<", time="<<COMPILE_TIME<<", branch="<<GIT_BRANCH<<std::endl; } 

Que da salida como:

 hash=35f531bf1c959626e1b95f2d3e1a7d1e4c58e5ec, time=2017-05-18 04:17:25 UTC, branch=master 

En Eclipse CDT, use un paso de preconstrucción para generar un file de inclusión que contenga la información relevante, y una inclusión condicional para verificar que el file se haya creado:

  1. Haga clic derecho en el proyecto
  2. Seleccionar properties
  3. Expanda la compilation de C / C ++
  4. Seleccione Configuración en la pestaña Pasos de compilation
  5. Ingrese lo siguiente en el textbox de command:

     git log --pretty=format:'#define GIT_INFO_PRESENT%n static const char* 

    GIT_INFO = "Información de versión = [% H,% d] \ r \ n"; ' -n 1> ../src/gitcommit.h

    Esto, una vez creado, creará un file gitcommit.h que se includeá en el código fuente. Para personalizarlo, ajuste la cadena a sus necesidades. (Ver https://git-scm.com/docs/pretty-formats )

Como ejemplo, produzco un resultado de debugging al principio de la rutina principal para informar al usuario de la confirmación y la twig (no es estrictamente necesario conocer la confirmación, pero sin duda es útil):

  1. Pon esto en el file, probablemente en la parte superior

     #if __has_include("gitcommit.h") #include "gitcommit.h" #else static const char* GIT_INFO = "Git version information not present.\r\n"; #endif 
  2. Para mostrar la información en algún lugar de tu código, haz algo similar a esto:

     printf(GIT_INFO); 

Tenga en count que no he hecho, en este caso, que el paso de precompilation sea un script de shell o un file .bat Windows / DOS, ya que trabajo frecuentemente en Linux o Windows.

Tenga en count que esto no se testing en Windows.

En ambos casos, 'git' debe ser ejecutable desde la línea de command estándar.

Existe una dependencia en la provisión de __has_include . Esto fue pensado para proporcionar simplicidad para que no sea necesario proporcionar un file de inclusión pnetworkingeterminado.

Tenga en count que la gitcommit.h file gitcommit.h debe ser gitcommit.h por el comstackdor.

Normalmente, como parte de tu compilation, ejecutas un command que genera algo así. Por ejemplo, git describe te da algo que puedes usar:

 echo // auto generated version: > version.h git describe > echo // auto generated version: > version.h echo -e "#define VERSION " >> version.h git describe >> version.h 

Por ejemplo x264 usa este script simple para generarlo:

 if [ -d .git ] && command -v git >/dev/null 2>&1 ; then localver="$(($(git rev-list HEAD | wc -l)))" if [ "$localver" -gt 1 ] ; then ver_diff="$(($(git rev-list origin/master..HEAD | wc -l)))" ver="$((localver-ver_diff))" echo "#define X264_REV $ver" echo "#define X264_REV_DIFF $ver_diff" if [ "$ver_diff" -ne 0 ] ; then ver="$ver+$ver_diff" fi if git status | grep -q "modified:" ; then ver="${ver}M" fi ver="$ver $(git rev-list -n 1 HEAD | cut -c 1-7)" version=" r$ver" fi fi echo "#define X264_VERSION \"$version\"" echo "#define X264_POINTVER \"0.$ver\"" 

Esto generará algo así como:

 #define X264_VERSION " r2708 86b7198" #define X264_POINTVER "0.148.2708 86b7198"