summaryrefslogtreecommitdiff
path: root/mk/checksum
diff options
context:
space:
mode:
Diffstat (limited to 'mk/checksum')
-rw-r--r--mk/checksum/bsd.checksum-vars.mk12
-rw-r--r--mk/checksum/bsd.checksum.mk41
-rwxr-xr-xmk/checksum/checksum179
-rw-r--r--mk/checksum/checksum.mk116
4 files changed, 348 insertions, 0 deletions
diff --git a/mk/checksum/bsd.checksum-vars.mk b/mk/checksum/bsd.checksum-vars.mk
new file mode 100644
index 00000000000..24d69faab5b
--- /dev/null
+++ b/mk/checksum/bsd.checksum-vars.mk
@@ -0,0 +1,12 @@
+# $NetBSD: bsd.checksum-vars.mk,v 1.1 2006/07/13 14:02:34 jlam Exp $
+#
+# This Makefile fragment is included separately by bsd.pkg.mk and
+# defines some variables which must be defined earlier than where
+# bsd.checksum.mk is included.
+#
+# The following variables may be set in a package Makefile:
+#
+# DISTINFO_FILE is the path to file containing the checksums.
+#
+
+DISTINFO_FILE?= ${PKGDIR}/distinfo
diff --git a/mk/checksum/bsd.checksum.mk b/mk/checksum/bsd.checksum.mk
new file mode 100644
index 00000000000..d44a74a01f4
--- /dev/null
+++ b/mk/checksum/bsd.checksum.mk
@@ -0,0 +1,41 @@
+# $NetBSD: bsd.checksum.mk,v 1.1 2006/07/13 14:02:34 jlam Exp $
+#
+# This Makefile fragment is included by bsd.pkg.mk and defines the
+# relevant variables and targets for the "checksum" phase.
+#
+# The following are the "public" targets provided by this module:
+#
+# checksum, makesum, makepatchsum
+#
+
+######################################################################
+### checksum, makesum, makepatchsum (PUBLIC)
+######################################################################
+### checksum is a public target to checksum the fetched distfiles
+### for the package.
+###
+### makesum is a public target to add checksums of the distfiles for
+### the package to ${DISTINFO_FILE}.
+###
+### makepatchsum is a public target to add checksums of the patches
+### for the package to ${DISTINFO_FILE}.
+###
+.if defined(NO_CHECKSUM)
+.PHONY: checksum makesum makepatchsum
+checksum makesum makepatchsum:
+ @${DO_NADA}
+.else
+. include "${PKGSRCDIR}/mk/checksum/checksum.mk"
+.endif
+
+######################################################################
+### makedistinfo (PUBLIC)
+######################################################################
+### makedistinfo is a public target to create ${DISTINFO_FILE}.
+###
+makedistinfo: makepatchsum makesum
+ @${DO_NADA}
+
+# Some short aliases for "makepatchsum" and "makedistinfo".
+mps: makepatchsum
+mdi: makedistinfo
diff --git a/mk/checksum/checksum b/mk/checksum/checksum
new file mode 100755
index 00000000000..070b9792ced
--- /dev/null
+++ b/mk/checksum/checksum
@@ -0,0 +1,179 @@
+#!/bin/sh
+#
+# $NetBSD: checksum,v 1.1 2006/07/13 14:02:34 jlam Exp $
+#
+# Copyright (c) 2006 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Johnny C. Lam.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by the NetBSD
+# Foundation, Inc. and its contributors.
+# 4. Neither the name of The NetBSD Foundation nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+######################################################################
+#
+# NAME
+# checksum -- checksum files
+#
+# SYNOPSIS
+# checksum [options] distinfo [file ...]
+#
+# DESCRIPTION
+# checksum will verify the checksums in the distinfo file for each
+# of the files specified.
+#
+# OPTIONS
+# -a algorithm Only verify checksums for the specified algorithm.
+#
+######################################################################
+
+set -e # exit on errors
+
+: ${DIGEST:=digest}
+: ${CAT:=cat}
+: ${ECHO:=echo}
+: ${TEST:=test}
+
+self="${0##*/}"
+
+usage() {
+ ${ECHO} 1>&2 "usage: $self [-a algorithm] distinfo [file ...]"
+}
+
+# Process optional arguments
+algorithm=
+while ${TEST} $# -gt 0; do
+ case "$1" in
+ -a) algorithm="$2"; shift 2 ;;
+ --) shift; break ;;
+ -*) ${ECHO} 1>&2 "$self: unknown option -- ${1#-}"
+ usage
+ exit 1
+ ;;
+ *) break ;;
+ esac
+done
+
+# Process required arguments
+${TEST} $# -gt 0 || { usage; exit 1; }
+distinfo="$1"; shift
+
+if ${TEST} ! -f "$distinfo"; then
+ ${ECHO} 1>&2 "$self: distinfo file missing: $distinfo"
+ exit 1
+fi
+
+digestcmd=
+case ${DIGEST} in
+/*)
+ if ${TEST} -x "$i/${DIGEST}"; then
+ digestcmd="$i/${DIGEST}"
+ fi
+ ;;
+*)
+ SAVEIFS="$IFS"; IFS=:
+ for i in $PATH; do
+ if ${TEST} -x "$i/${DIGEST}"; then
+ digestcmd="$i/${DIGEST}"
+ break
+ fi
+ done
+ IFS="$SAVEIFS"
+ ;;
+esac
+
+if ${TEST} -z "$digestcmd"; then
+ ${ECHO} 1>&2 "$self: \`\`${DIGEST}'' is missing"
+ exit 1
+fi
+
+${CAT} $distinfo |
+{ exitcode=0
+ while read d_alg d_file d_equals d_checksum; do
+ case "$d_alg" in
+ "#"*) continue ;; # skip comments
+ "\$"*) continue ;; # skip RCS ID
+ "") continue ;; # skip empty lines
+ Size) continue ;; # skip lines holding filesizes, not checksums
+ esac
+
+ if ${TEST} -n "$algorithm"; then
+ ${TEST} "$d_alg" = "$algorithm" || continue
+ fi
+
+ eval "tmp=\$_alg_${d_alg}"
+ ${TEST} -n "$tmp" || eval "_alg_${d_alg}=\"$@\""
+
+ d_file="${d_file#(}"; d_file="${d_file%)}"
+ for file in "$@"; do
+ ${TEST} "$d_file" = "$file" || continue
+
+ eval "tmp=\$_alg_${d_alg}"
+ case "$tmp" in
+ "$file"|"$file "*) tmp_pre= ;;
+ *" $file") tmp_pre="${tmp%% $file}" ;;
+ *) tmp_pre="${tmp%% $file *} " ;;
+ esac
+ case "$tmp" in
+ "$file"|*" $file") tmp_post= ;;
+ "$file "*) tmp_post="${tmp##$file }" ;;
+ *) tmp_post="${tmp##* $file }" ;;
+ esac
+ tmp="${tmp_pre}${tmp_post}"
+ eval "_alg_${d_alg}=\"$tmp\""
+
+ if ${TEST} "$d_checksum" = "IGNORE"; then
+ ${ECHO} 1>&2 "WARNING: Ignoring checksum for $file"
+ continue
+ fi
+ checksum=`${DIGEST} $d_alg < $file`
+ if ${TEST} "$d_checksum" = "$checksum"; then
+ ${ECHO} "=> Checksum $d_alg OK for $file"
+ else
+ ${ECHO} 1>&2 "ERROR: Checksum $d_alg mismatch for $file"
+ exitcode=1
+ fi
+ break
+ done
+
+ eval "tmp=\$_alg_${d_alg}"
+ ${TEST} -n "$tmp" || eval "_alg_${d_alg}=DONE"
+ done
+ if ${TEST} -n "$algorithm"; then
+ eval "tmp=\$_alg_${algorithm}"
+ ${TEST} -n "$tmp" || tmp="$@"
+ if ${TEST} "$tmp" != DONE; then
+ for file in $tmp; do
+ ${ECHO} 1>&2 "ERROR: No $algorithm checksum recorded for $file"
+ exitcode=1
+ done
+ fi
+ fi
+ exit $exitcode; }
diff --git a/mk/checksum/checksum.mk b/mk/checksum/checksum.mk
new file mode 100644
index 00000000000..6215738d5e6
--- /dev/null
+++ b/mk/checksum/checksum.mk
@@ -0,0 +1,116 @@
+# $NetBSD: checksum.mk,v 1.1 2006/07/13 14:02:34 jlam Exp $
+
+_DIGEST_ALGORITHMS?= SHA1 RMD160
+_PATCH_DIGEST_ALGORITHMS?= SHA1
+
+# These variables are set by pkgsrc/mk/fetch/fetch.mk.
+#_CKSUMFILES?= # empty
+#_IGNOREFILES?= # empty
+
+######################################################################
+### checksum (PUBLIC)
+######################################################################
+### checksum is a public target to checksum the fetched distfiles
+### for the package.
+###
+_CHECKSUM_CMD= \
+ ${SETENV} DIGEST=${TOOLS_DIGEST:Q} CAT=${TOOLS_CAT:Q} \
+ ECHO=${TOOLS_ECHO:Q} TEST=${TOOLS_TEST:Q} \
+ ${SH} ${PKGSRCDIR}/mk/checksum/checksum \
+
+.PHONY: checksum
+checksum: fetch
+.for _alg_ in ${_DIGEST_ALGORITHMS}
+ ${_PKG_SILENT}${_PKG_DEBUG} \
+ if cd ${DISTDIR} && ${_CHECKSUM_CMD} -a ${_alg_:Q} \
+ ${DISTINFO_FILE} ${_CKSUMFILES}; then \
+ ${TRUE}; \
+ else \
+ ${ERROR_MSG} "Make sure the Makefile and checksum file (${DISTINFO_FILE})"; \
+ ${ERROR_MSG} "are up to date. If you want to override this check, type"; \
+ ${ERROR_MSG} "\"${MAKE} NO_CHECKSUM=yes [other args]\"."; \
+ exit 1; \
+ fi
+.endfor
+
+######################################################################
+### makesum (PUBLIC)
+######################################################################
+### makesum is a public target to add checksums of the distfiles for
+### the package to ${DISTINFO_FILE}.
+###
+.PHONY: makesum
+makesum: fetch
+ ${_PKG_SILENT}${_PKG_DEBUG}set -e; \
+ newfile=${DISTINFO_FILE}.$$$$; \
+ if ${TEST} -f ${DISTINFO_FILE}; then \
+ { ${GREP} '^.NetBSD' ${DISTINFO_FILE} || \
+ ${ECHO} "$$""NetBSD""$$"; } > $$newfile; \
+ else \
+ ${ECHO} "$$""NetBSD""$$" > $$newfile; \
+ fi; \
+ ${ECHO} "" >> $$newfile; \
+ cd ${DISTDIR}; \
+ for sumfile in "" ${_CKSUMFILES}; do \
+ ${TEST} -n "$$sumfile" || continue; \
+ for a in "" ${_DIGEST_ALGORITHMS}; do \
+ ${TEST} -n "$$a" || continue; \
+ ${TOOLS_DIGEST} $$a $$sumfile >> $$newfile; \
+ done; \
+ ${WC} -c $$sumfile | \
+ ${AWK} '{ print "Size (" $$2 ") = " $$1 " bytes" }' \
+ >> $$newfile; \
+ done; \
+ for ignore in "" ${_IGNOREFILES}; do \
+ ${TEST} -n "$$ignore" || continue; \
+ for a in "" ${_DIGEST_ALGORITHMS}; do \
+ ${TEST} -n "$$a" || continue; \
+ ${ECHO} "$$a ($$ignore) = IGNORE" >> $$newfile; \
+ done; \
+ done; \
+ if ${TEST} -f ${DISTINFO_FILE}; then \
+ ${AWK} '$$2 ~ /\(patch-[a-z0-9]+\)/ { print $$0 }' \
+ < ${DISTINFO_FILE} >> $$newfile; \
+ fi; \
+ if ${CMP} -s $$newfile ${DISTINFO_FILE}; then \
+ ${RM} -f $$newfile; \
+ ${ECHO_MSG} "=> distinfo: distfiles part unchanged."; \
+ else \
+ ${MV} -f $$newfile ${DISTINFO_FILE}; \
+ fi
+
+######################################################################
+### makepatchsum (PUBLIC)
+######################################################################
+### makepatchsum is a public target to add checksums of the patches
+### for the package to ${DISTINFO_FILE}.
+###
+makepatchsum:
+ ${_PKG_SILENT}${_PKG_DEBUG}set -e; \
+ newfile=${DISTINFO_FILE}.$$$$; \
+ if ${TEST} -f ${DISTINFO_FILE}; then \
+ ${AWK} '$$2 !~ /\(patch-[a-z0-9]+\)/ { print $$0 }' \
+ < ${DISTINFO_FILE} >> $$newfile; \
+ else \
+ ${ECHO} "$$""NetBSD""$$" > $$newfile; \
+ ${ECHO} "" >> $$newfile; \
+ fi; \
+ if ${TEST} -d ${PATCHDIR}; then \
+ ( cd ${PATCHDIR}; \
+ for sumfile in "" patch-*; do \
+ case "$$sumfile" in \
+ ""|"patch-*") continue ;; \
+ patch-local-*|*.orig|*.rej|*~) continue ;; \
+ esac; \
+ for a in "" ${_PATCH_DIGEST_ALGORITHMS}; do \
+ ${TEST} -n "$$a" || continue; \
+ ${ECHO} "$$a ($$sumfile) = `${SED} -e '/\$$NetBSD.*/d' $$sumfile | ${TOOLS_DIGEST} $$a`" >> $$newfile; \
+ done; \
+ done ); \
+ fi; \
+ if ${CMP} -s $$newfile ${DISTINFO_FILE}; then \
+ ${RM} -f $$newfile; \
+ ${ECHO_MSG} "=> distinfo: patches part unchanged."; \
+ else \
+ ${MV} $$newfile ${DISTINFO_FILE}; \
+ fi