makefile exécute une autre cible

J’ai un makefile structuré comme ceci:

all : comstack executable clean : rm -f *.o $(EXEC) 

Je me suis rendu compte que je courais systématiquement “make clean” suivi de “clear” dans mon terminal avant de lancer “make all”. J’aime avoir un terminal propre avant de passer au crible les erreurs de compilation C ++. J’ai donc essayé d’append une 3ème cible:

 fresh : rm -f *.o $(EXEC) clear make all 

Cela fonctionne, mais cela exécute une deuxième instance de make (je crois). Existe-t-il une bonne manière d’obtenir la même fonctionnalité sans exécuter une 2ème instance de make?

En fait, vous avez raison: il lance une autre instance de make. Une solution possible serait:

 .PHONY : clearscr fresh clean all all : comstack executable clean : rm -f *.o $(EXEC) fresh : clean clearscr all clearscr: clear 

En appelant make fresh vous obtenez d’abord la cible clean , puis l’ clearscreen clear qui s’exécute et enfin all ce qui fait l’affaire.

MODIFIER

Que se passe-t-il dans le cas de builds parallèles avec l’option -j de make? Il y a un moyen de régler la commande. À partir du manuel de fabrication, section 4.2:

Cependant, il arrive parfois que vous souhaitiez imposer un ordre spécifique aux règles à invoquer sans forcer la mise à jour de la cible si l’une de ces règles est exécutée. Dans ce cas, vous souhaitez définir des conditions préalables à la commande uniquement. Les prérequirejs d’ordre unique peuvent être spécifiés en plaçant un symbole de canal (|) dans la liste des prérequirejs: tous les prérequirejs à gauche du symbole de canal sont normaux; les conditions préalables à droite sont les suivantes: cibles: conditions préalables normales | prérequirejs uniquement

La section des conditions préalables normales peut bien sûr être vide. En outre, vous pouvez toujours déclarer plusieurs lignes de conditions préalables pour la même cible: elles sont ajoutées de manière appropriée. Notez que si vous déclarez que le même fichier est à la fois un prérequirejs normal et un prérequirejs d’ordre unique, le prérequirejs normal est prioritaire (puisqu’il s’agit d’un surensemble complet du comportement d’une condition préalable à la commande uniquement).

Par conséquent, le makefile devient

 .PHONY : clearscr fresh clean all all : comstack executable clean : rm -f *.o $(EXEC) fresh : | clean clearscr all clearscr: clear 

Si vous supprimez la ligne make all de votre cible “fraîche”:

 fresh : rm -f *.o $(EXEC) clear 

Vous pouvez simplement exécuter la commande make fresh all , qui s’exécutera comme make fresh; make all make fresh; make all

Certains pourraient considérer cela comme une seconde instance de make, mais ce n’est certainement pas une sous-instance de make (une marque à l’intérieur d’une marque), ce que votre tentative semblait aboutir.

À l’invite de commande linux: effacer et créer