Possibili comandi per generare un checksum
Sfortunatamente, non esiste un'utilità standard per generare un checksum crittografico. C'è un programma di utilità standard per generare un CRC: cksum
; questo può essere sufficiente per il tuo scopo di rilevare cambiamenti in un ambiente non ostile.
Consiglierei di utilizzare SHA1 anziché MD5. Non ci sono molti sistemi che dispongono di un'utilità MD5 ma non di SHA1, e se utilizzerai checksum crittografici, potresti anche utilizzare un algoritmo senza un metodo noto per trovare le collisioni (supponendo che tu controlli anche le dimensioni).
Uno strumento non standard ma comune e in grado di calcolare i digest è OpenSSL . È disponibile per Cygwin, Debian e OSX, ma sfortunatamente non fa parte dell'installazione predefinita su OSX.
openssl dgst -sha1
Su OSX 10.6, c'è shasum
un'utilità, che è presente anche su Debian (fa parte del perl
pacchetto) e credo anche su Cygwin. Questo è uno script Perl. La maggior parte dei sistemi unix hanno installato Perl, quindi potresti raggruppare quello script insieme al tuo makefile se sei preoccupato che questo script non sia disponibile ovunque.
Selezione del comando giusto per il tuo sistema
Ok, diciamo che davvero non riesci a trovare un comando che funzioni ovunque.
Nel guscio
Usa il type
built-in per vedere se un comando è disponibile.
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
GNU make
È possibile utilizzare la shell
funzione per eseguire uno snippet di shell quando viene caricato il makefile e archiviare l'output in una variabile.
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
Marca portatile (POSIX)
È possibile eseguire solo comandi shell nella regola, quindi ogni regola che calcola un checksum deve contenere il codice di ricerca. Puoi inserire lo snippet in una variabile. Ricorda che le righe separate nelle regole vengono valutate in modo indipendente. Ricorda inoltre $
che è necessario sfuggire ai segni che devono essere passati alla shell $$
.
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