#!/bin/sh # # culldeps # # Filter redundant dependencies. # # Emit all the dependencies on the standard input to the standard # output EXCEPT the dependencies which can be derived from other # dependencies by the transitive rule. For example, omit both A C # and A D from # # A B # B C # C D # A C # A D # # because A C can be derived from A B and B C by transitivity, # and A D can be derived from A B, B C, C D by transitivity. # SCRATCH=$(${MKTEMP} -d /var/tmp/$0.XXXXXX) NEXTLEFTOVERS=$SCRATCH/leftovers0 LASTJOIN=$SCRATCH/join0 NEXTJOIN=$SCRATCH/join1 TAB=" " ${SORT} -k 1 > $LASTJOIN LEFTOVERS=$LASTJOIN while [ $(${WC} -l $LASTJOIN | ${AWK} '{ print $1; }') -ne 0 ]; do # # From dependencies X-requires-Y in $LEFTOVERS and Y-requires-Z in # $LASTJOIN, produce dependencies X-requires-Z and write them to # $NEXTJOIN. # ${SORT} -k 2 < $LEFTOVERS | ${JOIN} -1 2 -2 1 -o '1.1 2.2' - $LASTJOIN | \ ${SORT} -u > $NEXTJOIN if [ ${DEBUG:-0} -gt 0 ]; then echo "### filtered ###" 1>&2 ${JOIN} -t "$TAB" $NEXTJOIN $LEFTOVERS | ${SORT} 1>&2 echo "###" 1>&2 fi # # Filter out of $LEFTOVERS all of the dependencies X-requires-Z, which # were produced in the previous step. Write the new leftovers to # $NEXTLEFTOVERS. # ${JOIN} -v 2 -t "$TAB" $NEXTJOIN $LEFTOVERS | ${SORT} -u > $NEXTLEFTOVERS # # Swap output files before repeating. # LASTJOIN=$NEXTJOIN if [ $(basename $NEXTJOIN) = join0 ]; then NEXTJOIN=$SCRATCH/join1 else NEXTJOIN=$SCRATCH/join0 fi LEFTOVERS=$NEXTLEFTOVERS if [ $(basename $NEXTLEFTOVERS) = leftovers0 ]; then NEXTLEFTOVERS=$SCRATCH/leftovers1 else NEXTLEFTOVERS=$SCRATCH/leftovers0 fi done # # Output all of the dependencies that were not culled and clean up. # cat $LEFTOVERS rm -r $SCRATCH