pkgsrc/mk/scripts/mkdatabase

212 lines
5.8 KiB
Bash
Executable file

#!/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 <file> Writes the database into file specified by <file>"
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