#!/bin/sh # $NetBSD: mkdatabase,v 1.11 2018/08/22 20:48:37 maya 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. # # 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 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 "" } ###################################################################### # # 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 here=`pwd` tmp1=`dirname "$here"` pkgcat=`basename "$tmp1"` pkg=`basename "$here"` pkgpath=$pkgcat/$pkg 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. 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}" o=`${BMAKE} show-options | ${AWK} -f ../../mk/scripts/htmloptions.awk` echo "htmloptions ${pkgpath} $o" > ${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