NetBSD/distrib/sets/culldeps

76 lines
1.7 KiB
Bash
Executable File

#!/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