Можливі команди для генерації контрольної суми
На жаль, не існує стандартної утиліти для створення криптографічної контрольної суми. Існує стандартна утиліта для генерації CRC: cksum
; це може бути достатньо для ваших цілей виявлення змін у неприязному середовищі.
Я рекомендую використовувати SHA1, а не MD5. Існує не так багато систем, у яких є утиліта MD5, але немає SHA1, і якщо ви збираєтеся використовувати криптографічні контрольні суми, ви також можете використовувати алгоритм без відомих методів пошуку зіткнень (якщо ви також перевірите розмір).
Один інструмент, який не є стандартним, але поширеним і може обчислювати дайджести, - OpenSSL . Він доступний для Cygwin, Debian та OSX, але, на жаль, не є частиною встановлення за замовчуванням на OSX.
openssl dgst -sha1
На OSX 10.6 є shasum
утиліта, яка також присутня на Debian (це частина perl
пакета), і я вірю і в Cygwin. Це сценарій Perl. У більшості систем Unix встановлено Perl, тому ви можете поєднати цей скрипт поряд із вашим makefile, якщо ви переживаєте, що цей сценарій недоступний скрізь.
Вибір правильної команди для вашої системи
Добре, скажімо, ви дійсно не можете знайти команду, яка працює скрізь.
В оболонці
Використовуйте 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
функцію для запуску фрагмента оболонки під час завантаження makefile та зберігання результатів у змінній.
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