#!/bin/sh # $NetBSD: mkdatabase,v 1.4 2003/05/06 17:42:05 jmmv Exp $ # # Script for generating a database with complete dependency information # for a particular package # # Copyright (c) 2003 The NetBSD Foundation, Inc. # All rights reserved. # # This code is derived from software contributed to The NetBSD Foundation # by Dan McMahill. # # 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. # TMPDIR=${TMPDIR:-/tmp} BMAKE=${BMAKE:-make} AWK=${AWK:-/usr/bin/awk} DATABASE=${DATABASE:-${TMPDIR}/pkgdb.$$} EXPR=${EXPR:-expr} # as of 2003-01-04, metapkgs/gnome gets to pass #6 so # it is very likely that if you reach 25, something is broken MAX_PASS=${MAX_PASS:-25} prog=$0 usage(){ echo "$prog - Generates a complete dependency tree for a particular package" echo "Usage: $prog [-a|--append] [-d|--debug] [-f|--database database]" echo " " echo " $prog -h|--help" echo " " echo " $prog -v|--version" echo " " echo "The options supported by $prog are: " echo " " echo " -a|--append Append to the database rather than overwriting it" echo " " echo " -d|--debug Enables debugging output" echo " " echo " -f|--database Writes the database into file specified by " echo " " echo " -h|--help Displays this help message" echo " " echo " -v|--version Displays the version of this script and exits." echo " " echo "Example: cd /usr/pkgsrc/graphics/gimp && $prog -d /tmp/gimp_database" echo " " } clean_and_exit(){ exit 1 } ###################################################################### # # Handle command line options # ###################################################################### DEBUG= append=no while test -n "$1" do case "$1" in # Append to the database -a|--append) append=yes shift ;; # Turn on debugging -d|--debug) DEBUG=yes shift ;; # Use the specified database file -f|--database) DATABASE=$2 shift 2 ;; # Help -h|--help) usage exit 0 ;; # Version -v|--version) ${AWK} '/^#[ \t]*\$NetBSD/ {gsub(/,v/,"",$3);printf("%s: Version %s, %s\n",$3,$4,$5); exit 0;}' $prog exit 0 ;; -*) echo "$prog: ERROR: $1 is not a valid option" usage clean_and_exit ;; *) break ;; esac done if [ "x$DEBUG" = "xyes" ]; then set -v fi if [ ! -d $TMPDIR ]; then mkdir -p $TMPDIR fi prompt="----> " case ${DATABASE} in /*) # we already have the absolute path to the database file # so do nothing ;; *) # make sure we have the full path to the database file DATABASE=`pwd`/${DATABASE} ;; esac if [ "X$append" = "Xyes" ]; then echo "$prompt Appending to database in ${DATABASE}" if [ ! -f ${DATABASE} ]; then touch ${DATABASE} fi # make sure we haven't already been listed before # appending ourselves. here=`pwd` tmp1=`dirname $here` pkgcat=`basename $tmp1` pkg=`basename $here` pkgpath=$pkgcat/$pkg if [ "x$DEBUG" = "xyes" ]; then echo "Looking for $pkgpath before appending" fi if grep "^index $pkgpath " ${DATABASE} >/dev/null 2>&1 ; then echo "$prompt $pkgpath has already been depended. Skipping..." exit 0 else ${BMAKE} print-summary-data >> ${DATABASE} || exit 1 fi else echo "$prompt Creating new database in ${DATABASE}" ${BMAKE} print-summary-data > ${DATABASE} || exit 1 fi here=`pwd` echo "$prompt Depending in $here (pass #1)" dirs=`${AWK} -f ../../mk/scripts/chkdatabase.awk debug=${DEBUG} ${DATABASE}` pass=2 while [ ! -z "$dirs" -a $pass -lt ${MAX_PASS} ]; do for d in $dirs ; do echo "$prompt Depending in ../../$d (pass #$pass)" ;\ cd ../../$d && ${BMAKE} print-summary-data >> ${DATABASE} || exit 1 cd $here done dirs=`${AWK} -f ../../mk/scripts/chkdatabase.awk debug=${DEBUG} ${DATABASE}` pass=`${EXPR} $pass + 1` done if [ $pass -eq ${MAX_PASS} ]; then echo "ERROR: You have reached $pass times through the dependency tree" echo " and _still_ not finished. This is probably due to a broken" echo " set of dependencies. You may wish to examine the partial" echo " database left in ${DATABASE}" exit 1 else echo "Complete dependency database left in ${DATABASE}" fi