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