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