2011-02-03 15 views
7

Se trata de una escritura del golpe que solía construir un programa:c makefile con comandos de shell y variables

dateString=$(date +%Y/%m/%d\ %H:%M:%S) 
revision=(`svn info | grep Revision | tr -d [:alpha:]':'`) 
echo "#define VERSION_DATE \"$dateString\""  > version.h 
echo "#define VERSION_REVISION \"$revision\"" >> version.h 

pasé de usar el build.sh a un makefile:

version.h: 
    dateString=$$(date +%Y/%m/%d\ %H:%M:%S) 
    revision=(`svn info | grep Revision | tr -d [:alpha:]':'`) 
    echo "#define VERSION_DATE \"$dateString\"" > version.h.tmp 
    echo "#define VERSION_REVISION \"$revision\"" >> version.h.tmp 
    mv version.h.tmp version.h 

Pero el archivo version.h termina así:

#define VERSION_DATE "\ateString" 
#define VERSION_REVISION "\evision" 

Parece que no puedo obtener las variables de shell correctamente. Creo que es porque terminan siendo vars Makefile. Si alguien sabe cómo hacerlo, no me importaría saber cómo. Muchas gracias.

Respuesta

9

Recuerde que cada comando se ejecuta en su propio shell, por lo que dateString y la revisión se desarmará en los comandos tercero y cuarto.

Así que usa punto y coma y barras diagonales inversas en cada extremo de la línea para hacer que sea un comando. También necesita usar $$ para referirse a $ de shell.

O no use variables intermedias, entonces no necesitará que sea un comando. Algo como esto:

version.h: 
    echo \#define VERSION_DATE \"$$(date +%Y/%m/%d\ %H:%M:%S)\" > version.h.tmp 
    echo \#define VERSION_REVISION \"$$(svn info | grep Revision | tr -d [:alpha:]:)\" >> version.h.tmp 
    mv version.h.tmp version.h 
+0

Excelente, eso ha hecho el trabajo, gracias pooh. Gracias a Paul también por la respuesta. –

+0

Tenga en cuenta que esta versión del script no es "internacional". En francés, por ejemplo, debe grep para "Révision" (observe el acento). – Gui13

+0

Si tiene el ejecutable 'svnversion', puede reemplazar directamente su larga' svn info | grep ... 'por él. Te da la revisión directamente. – Gui13

Cuestiones relacionadas