2010-07-20 7 views
5

Supongamos que hay un programa C, que almacena su versión en un archivo global char* en main.c. ¿Puede el sistema de compilación (gnu make) extraer de alguna manera el valor de esta variable en el tiempo de compilación, de modo que el ejecutable creado pueda tener el nombre de la versión exacta tal como aparece en el programa?¿Se pueden asignar variables de archivo make con valores leídos de archivos de origen?

Lo que me gustaría lograr es que dada la fuente:

char g_version[] = "Superprogram 1.32 build 1142"; 

la buildsystem generaría un ejecutable llamado Superprogram 1.32 build 1142.exe

Respuesta

5

El shell function le permite llamar a aplicaciones externas como sed que puede ser utilizado para analizar la fuente de los detalles requeridos.

+0

Aunque su cadena de versión se parece sospechosamente hechos a mano, también me he aconsejado para comprobar qué '' herramienta. Eso más 'shell' podría ser lo que está buscando. – Dummy00001

+0

Gracias por responder, esto en realidad podría funcionar, siempre que me ponga al día sobre mis habilidades en sed (y las otras utilidades, mencionadas a continuación por mouviciel) ... – Manjabes

1

Puede usar cualquier combinación de herramientas de texto de unix (grep, sed, awk, perl, tail, ...) en su Makefile para extraer esa información del archivo de origen.

5

Definir la variable de versión desde una macro:

char g_version[] = VERSION; 

luego haga su makefile puso un argumento -D en la línea de comandos al compilar

gcc hack.c -DVERSION=\"Superprogram\ 1.99\" 

Y, por supuesto, usted debe en su ejemplo el uso sed/grep/awk, etc. para generar su cadena de versión.

+0

Conozco la opción -D, pero eso no se puede aplicar en este caso. La cadena de versión debe permanecer donde está. – Manjabes

0

Por lo general, la versión se define como una composición de varios #define valores (como en el arv library por ejemplo).

Así que vamos a dar un simple y trabajando ejemplo:

// myversion.h 
#define __MY_MAJOR__ 1 
#define __MY_MINOR__ 8 

Luego, en su Makefile:

# Makefile 
source_file := myversion.h 
MAJOR_Identifier := __MY_MAJOR__ 
MINOR_Identifier := __MY_MINOR__ 

MAJOR := `cat $(source_file) | tr -s ' ' | grep "\#define $(MAJOR_Identifier)" | cut -d" " -f 3` 
MINOR := `cat $(source_file) | tr -s ' ' | grep '\#define $(MINOR_Identifier)' | cut -d" " -f 3` 

all: 
    @echo "From the Makefile we extract: MAJOR=$(MAJOR) MINOR=$(MINOR)" 

Explicación

Aquí he utilizado varias herramientas por lo que es más robusto:

  • tr -s ' ': para eliminar el espacio extra entre los elementos,
  • grep: para seleccionar la línea de juego únicos de nuestro propósito,
  • cut -d" " -f 3: para extraer el tercer elemento de la línea seleccionada, que es el valor objetivo!

Tenga en cuenta que los valores de definición pueden ser cualquier cosa (no solo numéricos).

Cuidado con utilizar := (no =) ver: https://stackoverflow.com/a/10081105/4716013

Cuestiones relacionadas