Je sais que je peux interrompre un make
processus à tout moment sans avoir à recompiler à nouveau l’arborescence source entière. Comme je le sais, make
ne compile une cible que si elle n'est pas encore compilée, ou si le code source est modifié après la dernière compilation.
Mais si j'interromps make
, il y aura sûrement un ou plusieurs binaires semi-prêts (selon le niveau de concurrence). Que fait-il avec eux la prochaine fois que je courrai make
? Ou termine-t-il la cible actuelle lorsque j'appuie sur Ctrl+ Cpour éviter les binaires partiellement compilés?
11
Réponses:
En termes simples, vous pouvez penser
make
à avoir un nombre (éventuellement important) d'étapes, où chaque étape prend un certain nombre de fichiers en entrée et crée un fichier en sortie.Une étape peut être «compiler
file.c
versfile.o
» ou «utiliserld
pour liermain.o
etfile.o
entrerprogram
». Si vous interrompezmake
avec CtrlC, alors l'étape en cours d'exécution sera terminée, ce qui supprimera (ou devrait supprimer) le fichier de sortie sur lequel il travaillait. Il n'y a généralement pas de "binaires à moitié prêts".Lorsque vous redémarrez
make
, il examinera les horodatages de tous les fichiers d'entrée et de sortie et réexécutera les étapes où:Cela signifie généralement que si une étape prend beaucoup de temps à s'exécuter (c'est rare sur les ordinateurs modernes, mais l'
ld
étape pour les gros programmes peut facilement prendre plusieurs minutes lorsqu'elle amake
été conçue), puis l'arrêt et le redémarragemake
recommenceront cette étape depuis le début.La réalité de votre moyenne
Makefile
est considérablement plus compliquée que la description ci-dessus, mais les fondamentaux sont les mêmes.la source
Ctrl+ Centraîne
SIGINT
l'envoi de a au processus en cours d'exécution. Ce signal peut être capté par le processus. Dans le code source de make, vous pouvez trouver un piège pour ce signal danscommands.c
:remove_intermediates()
est la fonction de nettoyage demake
, voir sa définition ici:Et plus tard dans la fonction que vous voyez, ils seront effectivement supprimés:
Conclusion: N'ayez généralement pas peur d'interrompre une compilation avec
make
. Si ce n'est pas un signal inaccessible (SIGKILL, SIGSEGV, SIGSTOP
), il fera un nettoyage des fichiers intermédiaires.la source
SIGSEGV
est capturable sur de nombreux Unices.Quand quelque chose s'arrête
make
(que ce soit ctrl-C, arrêt ou même une commande qui échoue), le travail déjà fait reste. Une fois reformulé,make
fait comme toujours: il détermine ce qui reste à faire (car un fichier a changé oumake
n'a jamais dû être traité, peu importe) et continue le travail.La description ci-dessus suppose clairement que les
Makefile
s pertinents décrivent les dépendances et les commandes à exécuter correctement, donc tout ce qui doit être (re) fait est.la source