211 lines
6.1 KiB
Bash
Executable file
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
|