web-dev-qa-db-fra.com

Que fait un symbole de pourcentage dans un makefile?

J'ai un makefile qui ressemble à ceci:

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

%-test: 
       Something here

Je comprends à quoi il est destiné dans la ligne de règle cible. Quel est le % signe faisant dans la première ligne? At-il quelque chose à faire pour cent signer dans la ligne de règle cible?

Quand 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?

45
AnkurVj

Comme vous pouvez le lire dans le GNU make manual , le pourcentage agit comme un caractère générique. Le premier argument de la patsubstfonction forme le modèle. Chaque élément/mot du dernier argument est comparé à ce modèle et s'il correspond, il est remplacé par le deuxième argument. S'il y a un symbole générique (%) dans le modèle, cela correspondra à tout nombre de caractères, et ces caractères sont copiés dans la chaîne de remplacement à la place du% dans le deuxième argument.

Dans votre exemple, le modèle n'est que le symbole générique, il correspondra donc à tout 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. Assumons 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 makefile est traité séquentiellement, ligne par ligne. Les affectations de variables sont "internalisées" et les instructions d'inclusion entraînent l'insertion littérale du contenu des autres fichiers à cet emplacement, après quoi ce contenu est traité dans le cadre du makefile.
Un graphique de dépendance est formé à partir des règles au fur et à mesure de leur lecture, et une fois le fichier entier traité, les recettes nécessaires sont exécutées pour mettre à jour la cible demandée.

40
eriktous