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?
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 patsubst
fonction 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.