Je suis un débutant make
et je me demande quand l'utiliser make clean
.
Un collègue m'a dit que les versions incrémentielles make
sont basées sur les horodatages des fichiers. Donc, si vous extrayez une ancienne version d'un fichier dans votre VCS, il aura un "ancien" horodatage et il sera marqué comme "pas besoin de recompiler ce fichier". Ensuite, ce fichier ne serait pas inclus dans la prochaine génération.
Selon ce même collègue, ce serait une raison de l'utiliser make clean
.
Quoi qu'il en soit, j'ai à peu près obtenu la réponse à la question "quand l'utiliser make clean
" à partir d'autres questions StackExchange, mais mon autre question est alors:
Pourquoi les builds incrémentiels utilisant
make
s'appuient-ils sur des horodatages de fichiers et non sur SHA-1 par exemple? Git, par exemple, montre que nous pouvons déterminer avec succès si un fichier a été modifié en utilisant le SHA-1.
Est-ce pour des problèmes de vitesse?
make
a été créé dans les années 70. SHA-1 a été créé dans les années 90. Git a été créé dans les années 00. La dernière chose que vous voulez, c'est que certaines versions obscures qui fonctionnaient depuis 30 ans échouent soudainement parce que quelqu'un a décidé de passer à la modernité avec un système éprouvé.make
votre logiciel ne se cassera pas, maismake
fait plutôt un effort pour avoir une compatibilité descendante dans les nouvelles versions. Changer le comportement de base sans raison valable est à peu près le contraire. Et les dates montrent pourquoi il n'a pas été initialement conçu pour utiliser SHA-1, ou pourquoi il n'a pas été facile de le moderniser lorsqu'il est devenu disponible (ilmake
avait déjà des décennies à l'époque).Réponses:
Un problème évident (et sans doute superficiel) serait que le système de génération devrait garder une trace des hachages des fichiers qui ont été utilisés pour la dernière génération. Bien que ce problème puisse certainement être résolu, il nécessiterait un stockage latéral lorsque les informations d'horodatage sont déjà présentes dans le système de fichiers.
Plus sérieusement, cependant, le hachage ne véhiculerait pas la même sémantique. Si vous savez que le fichier T a été construit à partir de la dépendance D avec le hachage H 1 , puis découvrez que D est maintenant haché en H 2 , devriez-vous reconstruire T ? Probablement oui, mais il se pourrait aussi que H 2 fait référence à une ancienne version du fichier. Les horodatages définissent un ordre tandis que les hachages ne sont comparables que pour l'égalité.
Une fonctionnalité prise en charge par les horodatages est que vous pouvez simplement mettre à jour l'horodatage (par exemple, en utilisant l'utilitaire de ligne de commande POSIX
touch
) afin de vous fairemake
croire qu'une dépendance a changé ou - plus intéressant - une cible est plus récente qu'elle ne l'est réellement. Tout en jouant avec cela est une excellente occasion de vous tirer une balle dans le pied, il est utile de temps en temps. Dans un système basé sur le hachage, vous auriez besoin du support du système de build lui-même pour mettre à jour sa base de données interne des hachages utilisés pour la dernière build sans réellement construire quoi que ce soit.Bien qu'un argument puisse certainement être avancé pour utiliser des hachages sur des horodatages, mon point de vue est qu'ils ne sont pas une meilleure solution pour atteindre le même objectif mais une solution différente pour atteindre un objectif différent. Lequel de ces objectifs est le plus souhaitable pourrait être discuté.
la source
D
maintenant hachéH2
, et que vous n'avez pas de sortieT2
construite à partir deD@H2
, vous devez le produire et le stocker. Par la suite, quel que soit l'ordre dans lequelD
basculer entre les étatsH1
etH2
, vous pourrez utiliser la sortie mise en cache.Le hachage d'un projet entier est très lent. Vous devez lire chaque octet de chaque fichier. Git ne hache pas chaque fichier à chaque fois que vous exécutez un
git status
. Les extractions VCS ne définissent pas normalement l'heure de modification d'un fichier à l'heure d'origine. Une restauration de sauvegarde le ferait, si vous prenez soin de le faire. La raison pour laquelle les systèmes de fichiers ont des horodatages est pour des cas d'utilisation comme ceux-ci.Un développeur s'exécute généralement
make clean
lorsqu'une dépendance non directement suivie par les modifications du Makefile. Ironiquement, cela inclut généralement le Makefile lui-même. Il comprend généralement également des versions de compilateur. Selon la façon dont votre Makefile est écrit, il peut inclure des versions de bibliothèques externes.Ce sont les types de choses qui ont tendance à être mises à jour lorsque vous effectuez une mise à jour de contrôle de version, de sorte que la plupart des développeurs ont l'habitude d'exécuter un
make clean
en même temps, de sorte que vous savez que vous commencez à partir d'une table rase. Vous pouvez vous évader sans le faire la plupart du temps, mais il est vraiment difficile de prévoir les moments où vous ne le pouvez pas.la source
Quelques points sur les hachages par rapport aux horodatages dans les systèmes de build:
la source