web-dev-qa-db-fra.com

Attribuer une valeur de variable makefile à un résultat de commande bash?

J'essaie d'assigner la sortie de cette commande (qui est dans mon makefile) à la var HEADER makefile comme dans cette ligne de code suivante:

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

Le problème est que si j'imprime HEADER dans mon makefile en utilisant:

print:
    @echo $(HEADER)

Je reçois

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

Et si j'exécute cette commande directement dans la console, et directement où se trouve mon makefile:

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
....

Je reçois donc tous mes fichiers d'en-tête. Je fais cela pour éviter de spécifier manuellement tous mes fichiers .h manuellement dans mon makefile.

Des idées ?

40
Goles

Vous devrez double-échapper au $ caractère dans la commande Shell:

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

Le problème ici est que make essaiera de développer $f en tant que variable, et comme il ne trouve rien, il le remplace simplement par "". Cela laisse votre commande Shell avec rien d'autre que echo ile, ce qu'il fait fidèlement.

Ajouter $$ indique à make de placer un seul $ à cette position, ce qui donne à la commande Shell un aspect exactement comme vous le souhaitez.

72
e.James

Pourquoi ne pas simplement faire

HEADER = $(Shell find . -name '*.h')
14
Sorpigal

Le tutoriel makefile a suggéré d'utiliser wildcard pour obtenir la liste des fichiers dans un répertoire. Dans votre cas, cela signifie ceci:

HEADERS=$(wildcard *.h)
7
BЈовић