Możliwe polecenia do wygenerowania sumy kontrolnej
Niestety nie ma standardowego narzędzia do generowania kryptograficznej sumy kontrolnej. Jest to standardowe narzędzie do generowania CRC: cksum
; może to być wystarczające do wykrycia zmian w nieprzyjaznym środowisku.
Polecam używanie SHA1 zamiast MD5. Nie ma wielu systemów, które mają narzędzie MD5, ale nie ma SHA1, a jeśli zamierzasz użyć kryptograficznych sum kontrolnych, równie dobrze możesz użyć algorytmu bez znanej metody znajdowania kolizji (zakładając, że również sprawdzasz rozmiar).
Jednym z nietypowych, ale powszechnych narzędzi, które mogą obliczać skróty, jest OpenSSL . Jest dostępny dla Cygwin, Debian i OSX, ale niestety nie jest częścią domyślnej instalacji w OSX.
openssl dgst -sha1
W OSX 10.6 jest shasum
narzędzie, które jest również obecne w Debianie (jest to część perl
pakietu) i wierzę również w Cygwin. To jest skrypt Perla. Większość systemów uniksowych ma zainstalowanego Perla, więc możesz spakować ten skrypt razem z plikiem makefile, jeśli martwisz się, że ten skrypt nie będzie dostępny wszędzie.
Wybór właściwego polecenia dla twojego systemu
Ok, powiedzmy, że naprawdę nie możesz znaleźć polecenia, które działa wszędzie.
W skorupce
Użyj type
wbudowanego, aby sprawdzić, czy polecenie jest dostępne.
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
Marka GNU
Możesz użyć tej shell
funkcji do uruchomienia fragmentu powłoki, gdy plik makefile jest załadowany i zapisać dane wyjściowe w zmiennej.
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
Marka przenośna (POSIX)
Komendy powłoki można uruchamiać tylko w regule, więc każda reguła obliczająca sumę kontrolną musi zawierać kod odnośnika. Możesz umieścić fragment kodu w zmiennej. Pamiętaj, że osobne wiersze w regułach są oceniane niezależnie. Pamiętaj również, że $
znaki, które mają być przekazane do powłoki, muszą być zabezpieczone $$
.
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