2010-03-03 16 views
33

Je suis en train d'affecter la sortie de cette commande (qui est dans mon makefile) au makefile HEADER var comme dans cette ligne de code suivante:Affecter une valeur de variable makefile à un résultat de commande bash?

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

Le problème est que si j'imprimer dans mon HEADER makefile 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 je lance cette commande directement dans la console, et directement où mon makefile est:

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

Donc, je reçois 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?

Répondre

61

Vous devez-échapper au caractère $ au sein de la commande shell:

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

Le problème est que faire ici va essayer d'élargir $f comme variable, et puisqu'elle 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.

L'ajout de $$ demande à make de placer un seul $ à cette position, ce qui fait que la commande shell ressemble exactement à ce que vous voulez.

+0

Très belle réponse :), je le fais de cette façon parce que dans ma boucle for, j'effectue des choses plus complexes, donc je viens de poster un petit extrait ici. Merci beaucoup @ e.James. – Goles

14

Pourquoi ne pas simplement faire

HEADER = $(shell find . -name '*.h') 
4

Le makefile tutorial 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) 
+2

Ceci n'est pas vraiment équivalent au code de la question. La substitution générique a lieu pendant que le Makefile est analysé, alors que par exemple les commandes shell ne peuvent avoir lieu qu'une fois qu'une règle Makefile est exécutée. Cela fait une différence lors du test de l'existence de fichiers générés par le Makefile. –

Questions connexes