Que fait un symbole de pourcentage dans un fichier Make?

J’ai un 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 la règle cible. Que fait le signe % sur la première ligne? Y a-t-il quelque chose à faire dans la ligne de la règle cible?

Lorsque j’écris make sometarget , les lignes du make sometarget makefile qui ne sont écrites dans aucune règle (comme la première ligne de ce fichier makefile) sont-elles exécutées? Si oui, alors quel est l’ordre d’exécution?

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

Dans votre exemple, le modèle est simplement le symbole joker, donc il correspondra à 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)) 

Ceci est alors équivalent à 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 include entraînent l’insertion littérale du contenu des autres fichiers à cet emplacement, après quoi ce contenu est traité dans le cadre du fichier Make.
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.