pkgsrc/mk/scripts/mkdatabase

211 lines
6.1 KiB
Bash
Executable file

#!/bin/sh
# $NetBSD: mkdatabase,v 1.9 2005/11/18 11:07:27 rillig 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.
#
#
# Global variables, based on environment variables
#
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}
#
# Global variables
#
prog=$0
append_flag=no
debug_flag="" # meaning "no"
#
# Helper functions
#
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 ""
}
######################################################################
#
# Handle command line options
#
######################################################################
while test $# -gt 0; do
case $1 in
# Append to the database
-a|--append)
append_flag=yes
shift
;;
# Turn on debugging
-d|--debug)
debug_flag=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
exit 1
;;
esac
done
case $debug_flag in
yes) set -v;;
esac
if [ ! -d "$TMPDIR" ]; then
# FIXME: wouldn't it be better to fail in this case?
mkdir -p "$TMPDIR"
fi
prompt="----> "
case ${DATABASE} in
/*)
# we already have the absolute path to the database file
# so do nothing
;;
*)
# FIXME: wouldn't it be better to fail in this case?
# make sure we have the full path to the database file
DATABASE=`pwd`/${DATABASE}
;;
esac
if [ $append_flag = yes ]; 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
case $debug_flag in
yes) echo "Looking for $pkgpath before appending";;
esac
# FIXME: $pkgpath may contain special regex characters.
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_flag} "${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_flag} ${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