#!/bin/sh # $NetBSD: printdepends,v 1.23 2006/01/15 23:33:23 rillig Exp $ # # Copyright (c) 1999, 2000 Hubert Feyrer # All rights reserved. # # 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 Hubert Feyrer for # the NetBSD Project. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. # # usage: printdepends [brokenfile [bulkfilesdir]] # # Generates a list of package dependencies suitable for tsort(1) on # stdout. Each line of the output has two fields: the package directory # of the dependency and the package directory of the depending package # (both in the form category/package). # # If is given, package-specific errors are logged to # /${pkgdir}/. Otherwise no additional logging # takes place. # # The default for is the pkgsrc directory itself. If # differs from the pkgsrc directory, all directories # that are needed for the log files are created automatically. # # Note: printdepends must be called from a pkgsrc root directory. set -e # Pull in PKGLIST if [ -f "$BULK_BUILD_CONF" ]; then . $BULK_BUILD_CONF else . `dirname $0`/build.conf fi # # Global variables # # The brokenfile_flag variable tells whether we want package-specific # log files at all. If it is set to "yes", the mkdirs_flag # variable tells whether the directories of the package-specific log # files are created if necessary. brokenfile_flag="yes" mkdirs_flag="no" pkgsrcdir="${PWD}" bulkfilesdir="${pkgsrcdir}" brokenfile="" # # Command line parsing # case $# in 0) brokenfile_flag="no" ;; 1) brokenfile="$1" ;; 2) brokenfile="$1" bulkfilesdir="$2" if [ "${bulkfilesdir}" != "${pkgsrcdir}" ]; then mkdirs_flag="yes" fi ;; *) echo "usage: $0 [brokenfile [bulkfilesdir]]" 1>&2 exit 1 ;; esac # # Sanity checks # case ${BMAKE-""} in "") echo "$0: error: BMAKE must be set and non-empty." 1>&2 exit 1;; esac case ${bulkfilesdir} in /*) ;; *) echo "$0: error: The argument must be absolute." 1>&2 exit 1;; esac case ${brokenfile} in */*) echo "$0: error: The argument must not contain a slash." 1>&2 exit 1;; esac # # Get additional system information # cd "${pkgsrcdir}/pkgtools/pkglint" GREP=`${BMAKE} show-var VARNAME=GREP USE_TOOLS=grep` MKDIR=`${BMAKE} show-var VARNAME=MKDIR USE_TOOLS=mkdir` SED=`${BMAKE} show-var VARNAME=SED USE_TOOLS=sed` cd "${pkgsrcdir}" case $mkdirs_flag in yes) mkbulkdir="${MKDIR}";; *) mkbulkdir=":";; esac case ${PKGLIST} in "") # List of all packages, from pkgsrc/*/Makefile list=`${GREP} '^SUBDIR+=' */Makefile | ${GREP} -v '^regress/' | ${SED} -e 's,/Makefile:SUBDIR+=[[:space:]]*,/,' -e 's,#.*,,'` ;; *) list="${PKGLIST}" ;; esac for pkgdir in $list; do if cd "${pkgsrcdir}/${pkgdir}"; then if deps=`${BMAKE} show-depends-dirs`; then case ${deps} in "") # Make the package depend on itself. # Otherwise it would not show up in the # dependency graph. echo "${pkgdir} ${pkgdir}";; *) for dep in $deps; do echo "${dep} ${pkgdir}" done;; esac else echo "$0: error: could not extract dependencies for ${pkgdir} -- skipping." 1>&2 case $brokenfile_flag in no) continue;; esac ${mkbulkdir} "${bulkfilesdir}/${pkgdir}" { echo "[printdepends] command failed: ${BMAKE} show-depends-dirs" ( ${BMAKE} show-depends-dirs ) || true } >> "${bulkfilesdir}/${pkgdir}/${brokenfile}" 2>&1 fi else ${mkbulkdir} "${bulkfilesdir}" { echo "[printdepends] command failed: cd ${pkgsrcdir}/${pkgdir}" ( cd "${pkgsrcdir}/${pkgdir}" ) || true } 1>&2 fi done