Comandos possíveis para gerar uma soma de verificação
Infelizmente, não há utilitário padrão para gerar uma soma de verificação criptográfica. Há um utilitário padrão para gerar um CRC: cksum
; isso pode ser suficiente para o seu objetivo de detectar alterações em um ambiente não hostil.
Eu recomendaria o uso do SHA1 em vez do MD5. Não há muitos sistemas que possuem um utilitário MD5, mas não o SHA1, e se você usar somas de verificação criptográficas, use um algoritmo sem método conhecido para encontrar colisões (assumindo que você também verifique o tamanho).
Uma ferramenta que não é padrão, mas comum e pode calcular resumos é o OpenSSL . Está disponível para Cygwin, Debian e OSX, mas infelizmente não faz parte da instalação padrão no OSX.
openssl dgst -sha1
No OSX 10.6, existe um shasum
utilitário, que também está presente no Debian (faz parte do perl
pacote) e acredito no Cygwin também. Este é um script Perl. A maioria dos sistemas unix possui o Perl instalado, então você pode agrupar esse script junto com o makefile se estiver preocupado com esse script não estar disponível em todos os lugares.
Selecionando o comando certo para o seu sistema
Ok, digamos que você realmente não consiga encontrar um comando que funcione em qualquer lugar.
Na concha
Use o type
built-in para ver se um comando está disponível.
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
Você pode usar a shell
função para executar um snippet de shell quando o makefile for carregado e armazenar a saída em uma variável.
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
Portátil (POSIX) marca
Você só pode executar comandos shell na regra, portanto, cada regra que calcula uma soma de verificação deve conter o código de pesquisa. Você pode colocar o trecho em uma variável. Lembre-se de que linhas separadas nas regras são avaliadas independentemente. Lembre-se também de que os $
sinais que devem ser passados para o shell precisam ser escapados $$
.
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