Comandos possíveis para gerar uma soma de verificação
Infelizmente, não há um utilitário padrão para gerar uma soma de verificação criptográfica. Existe um utilitário padrão para gerar um CRC: cksum
; isso pode ser suficiente para o propósito de detectar alterações em um ambiente não hostil.
Eu recomendaria o uso de SHA1 em vez de MD5. Não há muitos sistemas que possuam um utilitário MD5, mas nenhum SHA1, e se você for usar somas de verificação criptográficas, é melhor usar um algoritmo sem método conhecido para encontrar colisões (supondo que você também verifique o tamanho). / p>
Uma ferramenta que não é padrão, mas é comum e pode calcular resumos, é OpenSSL . Está disponível para Cygwin, Debian e OSX, mas infelizmente não faz parte da instalação padrão do OSX.
openssl dgst -sha1
No OSX 10.6, há uma shasum
utilitário, que também está presente no Debian (é parte do pacote perl
) e eu acredito no Cygwin também. Este é um script em Perl. A maioria dos sistemas unix tem Perl instalado, então você pode empacotar esse script junto com seu makefile se estiver preocupado com o fato deste script não estar disponível em todos os lugares.
Selecionando o comando certo para o seu sistema
Ok, digamos que você não consegue encontrar um comando que funcione em todos os lugares.
No shell
Use o type
integrado 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
make do GNU
Você pode usar a shell
function para executar um snippet de shell quando o makefile é carregado e armazena a saída em uma variável.
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
Portable (POSIX) make
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 as linhas separadas nas regras são avaliadas de forma independente. Lembre-se também que $
sinais que devem ser passados para o shell precisam ser escapados para $$
.
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