syspkgdeps revision 1.11
11.1Sdyoung#!/bin/sh
21.1Sdyoung#
31.1Sdyoung# syspkgdeps [-a arch] [-m machine] [-s setsdir] [-p prefix] sets
41.1Sdyoung#
51.1Sdyoung# Compute naive package dependencies based on file & directory
61.1Sdyoung# nesting. E.g., if pkg P contains /foo/bar and Q contains /foo,
71.1Sdyoung# then Q is considered a dependency of P.
81.1Sdyoung#
91.1Sdyoung
101.1Sdyoung#set -u
111.1Sdyoung
121.10Sapbprog="${0##*/}"
131.7Sapbrundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
141.7Sapb. "${rundir}/sets.subr"
151.7Sapb
161.10Sapb#
171.10Sapb# set defaults
181.10Sapb#
191.10Sapbprefix=/
201.1Sdyoung
211.3Slukemusage()
221.3Slukem{
231.3Slukem	cat 1>&2 <<USAGE
241.3SlukemUsage: ${0##*/} [-a arch] [-m machine] [-s setsdir] [-p prefix] setname [...]
251.9Sapb	-a arch		set arch (e.g, m68k, mips, powerpc)	[${MACHINE_ARCH}]
261.9Sapb	-m machine	set machine (e.g, amiga, i386, macppc)	[${MACHINE}]
271.9Sapb	-s setsdir	directory to find sets			[${setsdir}]
281.9Sapb	-p prefix	prefix for created plist		[${prefix}]
291.3Slukem	setname [...]	sets to find dependencies for
301.3SlukemUSAGE
311.3Slukem	exit 1
321.1Sdyoung}
331.1Sdyoung
341.1Sdyoung# parse arguments
351.10Sapbwhile getopts a:m:p:s: ch; do
361.3Slukem	case ${ch} in
371.3Slukem	a)
381.9Sapb		MACHINE_ARCH="${OPTARG}"
391.9Sapb		MACHINE_CPU="$(arch_to_cpu "${OPTARG}")"
401.1Sdyoung		;;
411.3Slukem	m)
421.9Sapb		MACHINE="${OPTARG}"
431.1Sdyoung		;;
441.3Slukem	p)
451.9Sapb		prefix="${OPTARG}"
461.1Sdyoung		;;
471.3Slukem	s)
481.9Sapb		setsdir="${OPTARG}"
491.1Sdyoung		;;
501.3Slukem	*)
511.1Sdyoung		usage
521.1Sdyoung		;;
531.1Sdyoung	esac
541.1Sdyoungdone
551.3Slukemshift $((${OPTIND} - 1))
561.1Sdyoungif [ $# -lt 1 ]; then
571.1Sdyoung	usage
581.1Sdyoungfi
591.1Sdyoung
601.9Sapbsets="$*"
611.10Sapbcase "${sets}" in
621.10Sapball)	sets="${nlists}" ;;
631.10Sapbesac
641.1Sdyoung
651.1Sdyoung# TBD clean up
661.10SapbSCRATCH="$(${MKTEMP} -d "/var/tmp/${prog}.XXXXXX")"
671.1Sdyoung
681.11Sapbif [ $? -ne 0 ]; then
691.11Sapb	echo >&2 "${prog}: Could not create scratch directory."
701.11Sapb	exit 1
711.11Sapbfi
721.1Sdyoung
731.9SapbPATH_MEMBERSHIP="${SCRATCH}/path-membership"
741.9SapbPATH_TO_PKGNAME="${SCRATCH}/pathpkg.db"
751.9SapbPARENT_PKGNAMES="${SCRATCH}/parent-pkgnames"
761.9SapbPARENT_PATHNAMES="${SCRATCH}/parent-pathnames"
771.1Sdyoung
781.11Sapbecho >&2 "${prog}: indexing packages by pathnames"
791.1Sdyoung
801.9Sapblist_set_files ${sets} | ${SED} 's/^\.\///' | \
811.9Sapb${ENV_CMD} PREFIX="${prefix}" ${AWK} '{
821.1Sdyoung	if ($1 == ".") {
831.1Sdyoung		print ENVIRON["PREFIX"] " " $2;
841.1Sdyoung	} else {
851.1Sdyoung		print ENVIRON["PREFIX"] $1 " " $2;
861.1Sdyoung	}
871.9Sapb}' | ${SORT} -k 1 -u > "${PATH_MEMBERSHIP}"
881.1Sdyoung
891.11Sapb${DB} -q -w -f - btree "${PATH_TO_PKGNAME}" < "${PATH_MEMBERSHIP}"
901.11Sapb
911.11Sapbif [ $? -ne 0 ]; then
921.11Sapb	echo >&2 "${prog}: error creating database, aborting"
931.11Sapb	exit 1
941.11Sapbfi
951.1Sdyoung
961.11Sapbecho >&2 "${prog}: computing parent pathnames"
971.1Sdyoung
981.1Sdyoungwhile read pathname pkgname; do
991.10Sapb	# print parent pathname.
1001.10Sapb	# (This uses a cheap implementation of dirname from sets.subr.)
1011.10Sapb	dirname "${pathname}"
1021.9Sapbdone < "${PATH_MEMBERSHIP}" > "${PARENT_PATHNAMES}"
1031.1Sdyoung
1041.11Sapbecho >&2 "${prog}: selecting parent packages using parent pathnames"
1051.1Sdyoung
1061.9Sapb${DB} -q -f - btree "${PATH_TO_PKGNAME}" < "${PARENT_PATHNAMES}" | \
1071.9Sapb	${PASTE} "${PATH_MEMBERSHIP}" - | \
1081.8Sapb	${AWK} '{ if ($2 != $4) print $2 " " $4; }' | \
1091.8Sapb	${SORT} -u | \
1101.10Sapb	${HOST_SH} "${rundir}/culldeps"
1111.1Sdyoung
1121.1Sdyoungif [ $? -ne 0 ]; then
1131.11Sapb	echo >&2 "${prog}: error in parent-directory lookup, aborting"
1141.1Sdyoung	exit 1
1151.1Sdyoungfi
116