Estoy tratando de asignar la salida de este comando ( que es en mi makefile ) para el makefile ENCABEZADO var como en la siguiente línea de código:

HEADER = $(shell for file in `find . -name *.h`;do echo $file; done)

El problema es que si puedo imprimir el ENCABEZADO en mi makefile uso:

print:
    @echo $(HEADER)

Puedo obtener

ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile ile

Y si ejecuto este comando directamente en la consola, y directamente donde mi makefile es:

myaccount$ for file in `find . -name *.h`;do echo $file; done
./engine/helper/crypto/tomcrypt/headers/._tomcrypt_pk.h
./engine/helper/crypto/tomcrypt/headers/tomcrypt.h
./engine/helper/crypto/tomcrypt/headers/tomcrypt_argchk.h
./engine/helper/crypto/tomcrypt/headers/tomcrypt_cfg.h
./engine/helper/crypto/tomcrypt/headers/tomcrypt_cipher.h
./engine/helper/crypto/tomcrypt/headers/tomcrypt_custom.h
./engine/helper/crypto/tomcrypt/headers/tomcrypt_hash.h
./engine/helper/crypto/tomcrypt/headers/tomcrypt_mac.h
....

Así que tengo todos mis archivos de encabezado. Estoy haciendo esto para evitar tener que especificar manualmente todos mis .h manualmente los archivos en mi makefile.

Alguna idea ?

  • Yo no creo que sea digno de una respuesta, porque no es realmente lo que estás preguntando, pero yo sólo puedo suponer que estás haciendo esto por las dependencias; si un encabezado de archivo es modificado por los respectivos archivos de origen se necesita recompilar? Si es así, podría encontrar el MM opción de cc (bueno, técnicamente cpp) de uso. Usted puede incluso hacer un Makefile para un directorio que se ha separado (no relacionados) archivos de origen. Esto es útil para la implementación del tabulador. Pero el valor de es que también genera dependencias de los archivos de origen (igual que si es un solo proyecto).
InformationsquelleAutor Goles | 2010-03-03

3 Comentarios

  1. 72

    Necesitará el doble de escape de la $ carácter dentro de la shell de comandos:

    HEADER = $(shell for file in `find . -name *.h`;do echo $$file; done)

    El problema aquí es que hacen que tratará de ampliar el $f como una variable, y al no encontrar nada, simplemente se reemplaza con «». Que sale de su comando de shell con nada pero echo ile, que fielmente lo hace.

    La adición de $$ dice que hacer para poner un único $ en esa posición, lo que resulta en el comando de shell buscando exactamente la manera que usted desea.

    • Muy bonito respuesta :), yo lo hago de esta manera porque en mi bucle for me en realidad llevar a cabo más cosas complejas, por lo que sólo he publicado un pequeño fragmento de aquí. Muchas gracias @e.James.
    • Se podría señalar que también tienen que hacerlo fuera de la concha builtin cuando se hace comandos de la shell, y en referencia a una variable, por ejemplo, en un bucle for (no siempre es necesario utilizar el shell builtin, después de todo).
  2. 7

    La makefile tutorial sugiere utilizar wildcard para obtener la lista de archivos en un directorio. En su caso, significa esto :

    HEADERS=$(wildcard *.h)
    • Esto no es realmente equivalente al código de la pregunta. El comodín de la sustitución se lleva a cabo mientras el Makefile se analiza, mientras que por ejemplo, los comandos de shell puede tener lugar sólo una vez en un Makefile regla se ejecuta. Esto hace una diferencia cuando se prueba por la existencia de los archivos generados por el Makefile.

Dejar respuesta

Please enter your comment!
Please enter your name here