Existe-t-il une règle générale pour savoir quand utiliser "make clean" au lieu de "make"?

11

J'écris un programme à plusieurs fichiers en ce moment, et apparemment, je ne lance que «make» (comme on pourrait penser intuitivement qu'il faut le faire dans la plupart des situations) pour une raison quelconque, mon programme échoue. Je suppose que je peux fournir plus de détails sur le problème, mais l'important est qu'il s'exécute lors de l'utilisation de «make clean». Je me demandais donc si quelqu'un connaissait la règle générale pour exécuter "make clean" au lieu de simplement "make"

Templier noir
la source

Réponses:

17

Vous exécutez make clean dans deux situations - lorsque vous souhaitez empaqueter le code source (et donc n'avez pas besoin / ne voulez pas les objets construits) OU lorsque vous avez des raisons de croire que les objets construits sont mauvais.

Dans votre cas, vous utilisez «make clean» pour résoudre un problème qui est probablement le résultat d'un Makefile bogué. Quelque chose là-dedans ne se recompile pas quand il le devrait, et cela fait que le binaire de sortie est mauvais.

Il existe de nombreuses raisons qui peuvent se produire, en fonction de la complexité de votre projet et de la façon dont vous avez utilisé make, mais l'essentiel est: vous devez passer du temps à déboguer votre Makefile.

Michael Kohne
la source
6
Vous oubliez "certains changements dans l'environnement de construction" comme le compilateur mis à niveau, les nouvelles versions des bibliothèques, etc. toujours une bonne idée de "nettoyer" dans ces cas juste pour vous assurer que tous les modules chantent à partir de la même feuille de chanson!
James Anderson
2
@JamesAnderson On pourrait dire que ce ne sont que des exemples de Makefiles bogués.
Kristof Provost
4
@KristofProvost: Je ne suis pas sûr que je classerais "New ABI" (éventuellement en introduisant une nouvelle version du compilateur) comme 'Makefile buggy'. C'est suffisamment en dehors de la portée de ce que je m'attendrais à voir.
Vatine
1
Certes, mais il est possible (et même pas si difficile) d'ajouter le compilateur aux makefiles comme condition préalable. C'est suffisant pour attraper le problème. Dans l'ensemble, ce n'est pas un gros problème et c'est très rare de toute façon. J'ai fait le point parce que j'ai utilisé (et écrit) des makefiles qui prennent en compte les drapeaux du compilateur et autres. C'est aussi assez rare dans les makefiles, mais très utile (plus que de vérifier le compilateur;)). Mes attentes en matière de bons makefiles bien écrits sont assez élevées. Mes attentes concernant le makefile moyen sont plutôt inférieures ...
Kristof Provost
8

Je suis d'accord avec la réponse de Michael Kohne en général. J'ajouterais que vous devez lire les documents d'installation pour savoir ce que fait "make clean". Il peut y avoir différents niveaux de nettoyage que vous devrez peut-être utiliser, tels que «make realclean» et «make distclean». Il existe des conventions informelles pour celles-ci, mais rien n'est gravé dans la pierre.

Bill Ruppert
la source
2
+1: "vous devez lire les documents d'installation pour savoir ce que" nettoyer "fait". Il n'y a pas de "règle générale". Vous devez réellement lire les documents.
S.Lott
5

Je comprends que c'est votre projet, c'est donc votre makefile. Mon objectif est d'avoir make toujours produit un build correct, s'il est possible d'en produire un. S'il make cleanest nécessaire de se remettre d'une condition, alors à mon avis, makefilec'est faux, et devrait être corrigé. Si vos dépendances ont été calculées correctement, alors un simple makedevrait recompiler tout ce qui doit être recompilé.

Kevin Cline
la source
2
Je suis d'accord. Ce n'est plus un problème en ces jours d'espace disque presque infini, mais je suis assez vieux pour me rappeler quand make clean et make realclean ont été utilisés principalement pour économiser de l'espace disque après la création de l'exécutable lié. Faire GCC, apache, perl, etc. a laissé beaucoup de choses autour.
Bill Ruppert du
1

Je lancerais "make clean" avant une version nocturne. Dans ce cas, le temps supplémentaire nécessaire pour faire une construction complète n'aura probablement pas beaucoup d'importance, mais la sécurité supplémentaire que vous obtiendrez en vous assurant que tout est dans la bonne version en vaut probablement la peine.

Zachary K
la source
Cela dépendra de la taille de votre projet. Là où j'utilise pour travailler, une construction incrémentielle prendrait de 2 à 4 heures avec les changements des autres sites entraînés pendant la nuit. Une construction propre peut prendre de 7 à 9 heures. En plus de cela, nous avions parfois 2 ou 3 succursales que nous voudrions construire. Même sur des machines rapides, les très grandes bases de code doivent être traitées différemment des plus petites.
TafT