culldeps revision 1.2
1#!/bin/sh 2# 3# culldeps 4# 5# Filter redundant dependencies. 6# 7# Emit all the dependencies on the standard input to the standard 8# output EXCEPT the dependencies which can be derived from other 9# dependencies by the transitive rule. For example, omit both A C 10# and A D from 11# 12# A B 13# B C 14# C D 15# A C 16# A D 17# 18# because A C can be derived from A B and B C by transitivity, 19# and A D can be derived from A B, B C, C D by transitivity. 20# 21 22SCRATCH=$(${MKTEMP} -d /var/tmp/$0.XXXXXX) 23NEXTLEFTOVERS=$SCRATCH/leftovers0 24LASTJOIN=$SCRATCH/join0 25NEXTJOIN=$SCRATCH/join1 26TAB=" " 27 28${SORT} -k 1 > $LASTJOIN 29 30LEFTOVERS=$LASTJOIN 31 32while [ $(${WC} -l $LASTJOIN | ${AWK} '{ print $1; }') -ne 0 ]; do 33 34 # 35 # From dependencies X-requires-Y in $LEFTOVERS and Y-requires-Z in 36 # $LASTJOIN, produce dependencies X-requires-Z and write them to 37 # $NEXTJOIN. 38 # 39 ${SORT} -k 2 < $LEFTOVERS | ${JOIN} -1 2 -2 1 -o '1.1 2.2' - $LASTJOIN | \ 40 ${SORT} -u > $NEXTJOIN 41 if [ ${DEBUG:-0} -gt 0 ]; then 42 echo "### filtered ###" 1>&2 43 ${JOIN} -t "$TAB" $NEXTJOIN $LEFTOVERS | ${SORT} 1>&2 44 echo "###" 1>&2 45 fi 46 47 # 48 # Filter out of $LEFTOVERS all of the dependencies X-requires-Z, which 49 # were produced in the previous step. Write the new leftovers to 50 # $NEXTLEFTOVERS. 51 # 52 ${JOIN} -v 2 -t "$TAB" $NEXTJOIN $LEFTOVERS | ${SORT} -u > $NEXTLEFTOVERS 53 54 # 55 # Swap output files before repeating. 56 # 57 LASTJOIN=$NEXTJOIN 58 if [ $(basename $NEXTJOIN) = join0 ]; then 59 NEXTJOIN=$SCRATCH/join1 60 else 61 NEXTJOIN=$SCRATCH/join0 62 fi 63 LEFTOVERS=$NEXTLEFTOVERS 64 if [ $(basename $NEXTLEFTOVERS) = leftovers0 ]; then 65 NEXTLEFTOVERS=$SCRATCH/leftovers1 66 else 67 NEXTLEFTOVERS=$SCRATCH/leftovers0 68 fi 69done 70 71# 72# Output all of the dependencies that were not culled and clean up. 73# 74cat $LEFTOVERS 75rm -r $SCRATCH 76