diff options
author | jlam <jlam@pkgsrc.org> | 2006-07-13 14:02:34 +0000 |
---|---|---|
committer | jlam <jlam@pkgsrc.org> | 2006-07-13 14:02:34 +0000 |
commit | 7a2c97d53fecacc96925c6584dd0b8db8ae097b9 (patch) | |
tree | 054a4952b111d37e6eb8aaa78c0125d125c86d9a /mk/checksum | |
parent | 41a963b660aed13cb035a75bf5ee4bb41beaf95a (diff) | |
download | pkgsrc-7a2c97d53fecacc96925c6584dd0b8db8ae097b9.tar.gz |
* Add a new stage "bootstrap-depends" that happens before all other
stages, and that installs dependencies listed in BOOTSTRAP_DEPENDS.
The bootstrap-depends step works just like the normal depends step
and honors the value of DEPENDS_TARGET. It's now possible to add
dependencies solely to facilitate fetching the distfiles, e.g.
BOOTSTRAP_DEPENDS+= curl-[0-9]*:../../www/curl
* Teach the tools framework about ":bootstrap" as a tools modifier
which indicates the tool should be added as a dependency via
BOOTSTRAP_DEPENDS.
* Add "digest" to the tools framework.
* Use USE_TOOLS+=digest:bootstrap to force pkgsrc to install digest
before anything else. Get rid of unused "uptodate-digest" target
and related digest version-checking code.
* Finish the refactoring work: split checksum-related code out of
bsd.pkg.mk and into pkgsrc/mk/checksum and replace the "checksum"
target command list with a script that does all the real work.
* Make DIGEST_ALGORITHMS and PATCH_DIGEST_ALGORITHM into private
variables by prepending them with an underscore. Also, rename
_PATCH_DIGEST_ALGORITHM to _PATCH_DIGEST_ALGORITHMS and adjust the
makepatchsum target to allow that variable to contain a list of
algorithms, all of which are used when creating the patch checksums
for ${DISTINFO_FILE}.
Diffstat (limited to 'mk/checksum')
-rw-r--r-- | mk/checksum/bsd.checksum-vars.mk | 12 | ||||
-rw-r--r-- | mk/checksum/bsd.checksum.mk | 41 | ||||
-rwxr-xr-x | mk/checksum/checksum | 179 | ||||
-rw-r--r-- | mk/checksum/checksum.mk | 116 |
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 |