web-dev-qa-db-fra.com

Pourquoi les constructions incrémentielles de «faire» n'utilisent pas d'algorithmes de hachage?

Je suis un débutant avec make et je m'interroge sur quand utiliser make clean.

Un collègue m'a dit que des constructions incrémentielles avec make sont basées sur les horodatages de fichiers. Donc, si vous cédez une ancienne version d'un fichier dans votre VCS, elle aura un "ancien" horodatage et ce sera marqué comme "non nécessaire de recompiler ce fichier". Ensuite, ce fichier ne serait pas inclus dans la prochaine construction.
[.____] Selon ce même collègue, ce serait une raison d'utiliser make clean.

Quoi qu'il en soit, j'ai eu à peu près la réponse à la question "quand utiliser make clean "D'autres questions Stackexchange mais mon autre question est alors:

Pourquoi les constructions incrémentielles utilisant make s'appuient sur des fichiers horodatants 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é à l'aide du SHA-1.
Est-ce pour les problèmes de vitesse?

10
filaton

Un problème évident (et sans doute superficiel) serait que le système de construction devrait conserver l'enregistrement des hatupes des fichiers utilisés pour la dernière version. Bien que ce problème puisse certainement être résolu, il nécessiterait un stockage latéral lorsque les informations temporelles sont déjà présentes dans le système de fichiers.

Plus sérieusement, cependant, le hasch ne transmettrait pas la même sémantique. Si vous connaissez ce fichier T a été construit de dépendance  avec hachage H1 et puis découvre que  maintenant hachas à H2, devriez-vous re-construire T? Probablement oui, mais cela pourrait aussi être que H2 Fait réellement référence à un plus vieux Version du fichier. Les timbres temporels définissent une commande lorsque les hachages ne sont que comparables pour l'égalité.

Une fonctionnalité que la prise en charge de time-timbres est que vous pouvez simplement mettre à jour le timbre temporel (par exemple, à l'aide de l'utilitaire de ligne de commande POSIX touch ) afin de tordre make Pour penser qu'une dépendance a changé ou - plus intéressante - une cible est plus récente qu'elle ne l'est réellement. En jouant avec c'est une excellente occasion de vous tirer dessus dans le pied, il est utile de temps en temps. Dans un système basé sur HASH, vous auriez besoin de la prise en charge du système de construction lui-même pour mettre à jour sa base de données interne des hachages utilisés pour la dernière construction sans rien construire.

Bien qu'un argument puisse certainement être fait pour utiliser des hachages au fil des temps, mon point est que ce n'est 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 plus souhaitable pourrait être ouvert au débat.

7
5gon12eder

Quelques points sur HASHES VS Timestamps dans les systèmes de construction:

  1. Lorsque vous vérifiez un fichier, l'horodatage doit être mis à jour à l'heure actuelle, qui déclenche une reconstruction. Ce que votre collègue décrit n'est généralement pas un mode de défaillance des systèmes horodatamp.
  2. Les horodatages sont marginalement plus rapides que les hachages. Un système d'horodatage n'a à vérifier que l'horodatage, tandis qu'un système de hachage doit vérifier l'horodatage, puis potentiellement le hachage.
  3. Faire est conçu pour être léger et autonome. Pour surmonter (2), les systèmes basés sur HASHE exécuteront généralement un processus d'arrière-plan pour vérifier les hachages (par exemple, Facebook Watchman ). Ceci est contraire aux objectifs de conception (et à l'histoire) de la marque.
  4. Les hachages empêchent des reconstitutions inutiles lorsqu'un horodatage a changé mais pas le contenu. Souvent, cela compense le coût de calcul du hachage.
  5. Les hachages permettent de partager des caches artefact à travers des projets et sur un réseau. Encore une fois, cela plus que compensant le coût de l'informatique.
  6. Les systèmes de construction à base de hachage modernes incluent Bazel (Google) et Buck (Facebook).
  7. La plupart des développeurs devraient envisager d'utiliser un système à base de hachage, car ils n'ont pas les mêmes exigences que celles qui ont été conçues.
1
sdgfsdh

Hachage, un projet entier est très lent. Vous devez lire chaque octet de chaque fichier. Git ne hasard pas tous les fichiers à chaque fois que vous exécutez un git status Soit. Les checkouts de VCS ne définissent pas non plus de temps de modification d'un fichier à l'heure d'origine. Une restauration de sauvegarde serait que si vous prenez soin de le faire. Toute la raison Les systèmes de fichiers ont des horodatages sont destinés à des cas d'utilisation comme ceux-ci.

Un développeur fonctionne généralement make clean Lorsqu'une dépendance n'est pas directement suivie par les modifications de maquillage. Ironiquement, cela inclut généralement le maquillage lui-même. Il comprend généralement également des versions du compilateur. En fonction de la manière dont votre maquillage est écrit, il pourrait inclure des versions de la bibliothèque externe.

Ce sont les sortes de choses qui ont tendance à être mises à jour lorsque vous faites une mise à jour de contrôle de la version, la plupart des développeurs ont donc l'habitude de gérer un make clean Dans le même temps, vous savez que vous partez d'une ardoise propre. Vous pouvez vous échapper sans le faire beaucoup de temps, mais il est vraiment difficile de prédire les moments que vous ne pouvez pas.

1
Karl Bielefeldt