58 votes

Quelle est la fonction d'un symbole de pourcentage dans un fichier makefile ?

J'ai un fichier makefile qui ressemble à ceci :

include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS))

%-test: 
       Something here

Je comprends ce à quoi il est destiné dans la ligne de règlement cible. Qu'est-ce que la % signe fait dans la première ligne ? Est-ce que cela a quelque chose à voir avec le signe du pourcentage dans la ligne de la règle cible ?

Lorsque j'écris make sometarget Les lignes du makefile qui ne sont pas écrites dans le cadre d'une règle (comme la première ligne de ce makefile) sont-elles exécutées ? Si oui, quel est l'ordre d'exécution ?

51voto

eriktous Points 4170

Comme vous pouvez le lire dans le manuel GNU Make le pourcentage agit comme un joker. Le premier argument de la fonction patsubst fonction forme le modèle. Chaque élément/mot du dernier argument est comparé à ce motif et, s'il correspond, il est remplacé par le deuxième argument. Si le motif contient un symbole joker (%), celui-ci correspondra à n'importe quel nombre de caractères, qui seront copiés dans la chaîne de remplacement à la place du % dans le deuxième argument.

Dans votre exemple, le motif est simplement le symbole du joker, il correspondra donc à n'importe quel mot du dernier argument de la fonction, et ce mot sera copié dans la chaîne de remplacement (le deuxième argument) à la place du %.

Un exemple peut rendre les choses plus claires. Supposons que TEST_SUBDIRS contient deux noms.

TEST_SUBDIRS := test1 test2
include $(patsubst %,$(src)/%/Make.tests, $(TEST_SUBDIRS))

Cela équivaut alors à ce qui suit.

include $(src)/test1/Make.tests $(src)/test2/Make.tests

Un fichier makefile est traité séquentiellement, ligne par ligne. Les affectations de variables sont "internalisées" et les instructions "include" entraînent l'insertion littérale du contenu d'autres fichiers à cet emplacement, après quoi ce contenu est traité dans le cadre du fichier makefile.
Un graphe de dépendance est formé à partir des règles au fur et à mesure de leur lecture et, après le traitement de l'ensemble du fichier, les recettes nécessaires sont exécutées pour mettre à jour la cible demandée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X