Commandes possibles pour générer une somme de contrôle
Malheureusement, il n'y a pas d'utilitaire standard pour générer une somme de contrôle cryptographique. Il est un utilitaire standard pour générer un CRC: cksum
; cela peut être suffisant pour détecter les changements dans un environnement non hostile.
Je recommanderais d'utiliser SHA1 plutôt que MD5. Il n'y a pas beaucoup de systèmes qui ont un utilitaire MD5 mais pas de SHA1, et si vous allez utiliser des sommes de contrôle cryptographiques, vous pourriez aussi bien utiliser un algorithme sans méthode connue pour trouver des collisions (en supposant que vous vérifiez également la taille).
OpenSSL est un outil qui n'est pas standard mais commun et qui peut calculer les résumés . Il est disponible pour Cygwin, Debian et OSX, mais ne fait malheureusement pas partie de l'installation par défaut sur OSX.
openssl dgst -sha1
Sur OSX 10.6, il y a un shasum
utilitaire, qui est également présent sur Debian (il fait partie du perl
paquet) et je crois aussi sur Cygwin. Ceci est un script Perl. La plupart des systèmes Unix ont installé Perl, vous pouvez donc regrouper ce script avec votre makefile si vous craignez que ce script ne soit pas disponible partout.
Sélection de la bonne commande pour votre système
Ok, disons que vous ne pouvez vraiment pas trouver une commande qui fonctionne partout.
Dans la coquille
Utilisez la fonction type
intégrée pour voir si une commande est disponible.
sum=
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do
if type "${x%% *}" >/dev/null 2>/dev/null; then sum=$x; break; fi
done
if [ -z "$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
$sum *.org
Marque GNU
Vous pouvez utiliser la shell
fonction pour exécuter un extrait de shell lorsque le makefile est chargé et stocker la sortie dans une variable.
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
Marque portable (POSIX)
Vous ne pouvez exécuter que des commandes shell dans la règle, de sorte que chaque règle qui calcule une somme de contrôle doit contenir le code de recherche. Vous pouvez mettre l'extrait de code dans une variable. N'oubliez pas que les lignes distinctes des règles sont évaluées indépendamment. Souvenez-vous également que les $
signes qui doivent être passés au shell doivent être échappés $$
.
determine_sum = \
sum=; \
for x in sha1sum sha1 shasum 'openssl dgst -sha1'; do \
if type "$${x%% *}" >/dev/null 2>/dev/null; then sum=$$x; break; fi; \
done; \
if [ -z "$$sum" ]; then echo 1>&2 "Unable to find a SHA1 utility"; exit 2; fi
checksums.dat: FORCE
$(determine_sum); \
$$sum *.org
autotools