Возможные команды для генерации контрольной суммы
К сожалению, нет стандартной утилиты для генерации криптографической контрольной суммы. Существует стандартная утилита для генерации CRC: cksum
; этого может быть достаточно для обнаружения изменений в не враждебной среде.
Я бы рекомендовал использовать SHA1, а не MD5. Существует не так много систем, в которых есть утилита MD5, но нет SHA1, и если вы собираетесь использовать криптографические контрольные суммы, вы могли бы также использовать алгоритм без известного метода для обнаружения коллизий (при условии, что вы также проверяете размер).
OpenSSL - это инструмент, который не является стандартным, но распространенным и может рассчитывать дайджесты . Он доступен для Cygwin, Debian и OSX, но, к сожалению, не является частью установки по умолчанию на OSX.
openssl dgst -sha1
В OSX 10.6 есть shasum
утилита, которая также присутствует в Debian (она входит в perl
пакет), и я верю и в Cygwin. Это скрипт на Perl. В большинстве Unix-систем установлен Perl, поэтому вы можете связать этот скрипт с вашим make-файлом, если вы беспокоитесь о том, что этот скрипт не будет доступен везде.
Выбор правильной команды для вашей системы
Хорошо, скажем, вы действительно не можете найти команду, которая работает везде.
В оболочке
Используйте type
встроенный, чтобы увидеть, если команда доступна.
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
Вы можете использовать shell
функцию для запуска фрагмента оболочки при загрузке make-файла и сохранения результатов в переменной.
sum := $(shell { command -v sha1sum || command -v sha1 || command -v shasum; } 2>/dev/null)
%.sum: %
$(sum) $< >$@
Портативная (POSIX) марка
Вы можете запускать только команды оболочки в правиле, поэтому каждое правило, которое вычисляет контрольную сумму, должно содержать код поиска. Вы можете поместить фрагмент в переменную. Помните, что отдельные строки в правилах оцениваются независимо. Также помните, что $
знаки, которые должны быть переданы в оболочку, должны быть экранированы $$
.
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