use less fifo but direct file writing instead

This commit is contained in:
josch 2014-06-23 12:05:08 +02:00
parent f4cf179b6d
commit bc22cc62dd
2 changed files with 78 additions and 85 deletions

View file

@ -3,93 +3,59 @@
# #
# sbuild --chroot-setup-commands='/home/prebuildcmd.sh chroot-setup' --pre-realbuild-commands='/home/prebuildcmd.sh pre-realbuild' --post-realbuild-commands='/home/prebuildcmd.sh post-realbuild' # sbuild --chroot-setup-commands='/home/prebuildcmd.sh chroot-setup' --pre-realbuild-commands='/home/prebuildcmd.sh pre-realbuild' --post-realbuild-commands='/home/prebuildcmd.sh post-realbuild'
if [ "$#" -eq 0 ]; then if [ "$#" -eq 1 ]; then
rm -rf /home/myfifo /home/myfifo2 /tmp/pkglists tmpdir="$1"
# fifo to receive data # once something is written to the fifo, it indicates that fatrace should start
mkfifo /home/myfifo SCHROOT_SESSION_ID=`cat "${tmpdir}/myfifo"`;
# fifo to acknowledge reception # change to the schroot mount
mkfifo /home/myfifo2 cd /var/lib/schroot/mount/$SCHROOT_SESSION_ID
# make sure the sbuild user can write to the fifos
chmod a+w /home/myfifo
chmod a+w /home/myfifo2
mkdir -p /tmp/pkglists
# strip the architecture qualifier
cat /home/myfifo | sort > initialselection.list
echo > /home/myfifo2
cat /home/myfifo | sort > fullselection.list
echo > /home/myfifo2
# get all packages that were installed on top of the base packages
comm -13 initialselection.list fullselection.list > bdselection.list
while true; do
pkgnamever=`cat /home/myfifo`
echo > /home/myfifo2
# end loop when packagename is empty
[ -z "$pkgnamever" ] && break
# check if the package was installed as its build dependencies
if grep --line-regexp $pkgnamever bdselection.list; then
cat /home/myfifo | sort > "/tmp/pkglists/$pkgnamever"
else
cat /home/myfifo > /dev/null
fi
echo > /home/myfifo2
done
cat /home/myfifo | sed 's/, \+/\n/'g \
| sed 's/\([a-zA-Z0-9][a-zA-Z0-9+.-]*\).*/\1/' \
> /tmp/sbuild-dummy-depends
echo > /home/myfifo2
SCHROOT_SESSION_ID=`cat /home/myfifo`;
echo > /home/myfifo2
# start fatrace in the mounted directory # start fatrace in the mounted directory
( fatrace --current-mount > "${tmpdir}/fatrace.log" &
cd /var/lib/schroot/mount/$SCHROOT_SESSION_ID; FATRACE_PID=$!
fatrace --current-mount > /home/fatrace.log & # give fatrace some time to set up (value is arbitrary)
FATRACE_PID=$!; sleep 5
cat /home/myfifo > /dev/null; # signal that fatrace was started
echo > /home/myfifo2 echo > "${tmpdir}/myfifo"
kill $FATRACE_PID; # wait for build to finish
) cat "${tmpdir}/myfifo" > /dev/null
kill $FATRACE_PID
# clean up the fatrace log to only include unique paths # clean up the fatrace log to only include unique paths
sed 's/\/var\/lib\/schroot\/mount\/[^\/]\+//' /home/fatrace.log \ sed 's/\/var\/lib\/schroot\/mount\/[^\/]\+//' "${tmpdir}/fatrace.log" \
| awk '{ print $3; }' \ | awk '{ print $3; }' \
| grep -v ^/build \ | grep -v ^/build \
| sort \ | sort \
| uniq \ | uniq \
> accessed.log > "${tmpdir}/accessed.log"
# now get all packages in /tmp/pkglists that have files that never appear in the collected trace # now get all packages in /tmp/pkglists that have files that never appear in the collected trace
while read namever; do while read namever; do
name=`echo $namever | cut -d '=' -f 1 | cut -d ':' -f 1` name=`echo $namever | cut -d '=' -f 1 | cut -d ':' -f 1`
# FIXME: the following cannot handle dependencies on virtual packages # FIXME: the following cannot handle dependencies on virtual packages
if [ -z "`comm -12 accessed.log /tmp/pkglists/$namever`" ] \ if [ -z `comm -12 "${tmpdir}/accessed.log" "${tmpdir}/$namever"` ] \
&& grep --line-regexp "$name" /tmp/sbuild-dummy-depends > /dev/null; then && grep --line-regexp "$name" "${tmpdir}/sbuild-dummy-depends" > /dev/null; then
echo $namever echo $namever
fi fi
done > unneededdepends.list < bdselection.list done > "${tmpdir}/unneededdepends.list" < "${tmpdir}/bdselection.list"
else elif [ "$#" -eq 2 ]; then
case "$1" in case "$1" in
chroot-setup) chroot-setup)
env tmpdir="$2"
dpkg --list | awk '$1 == "ii" { print $2"="$3 }' > /home/myfifo dpkg --list | awk '$1 == "ii" { print $2"="$3 }' | sort > "${tmpdir}/initialselection.list"
cat /home/myfifo2 > /dev/null
;; ;;
pre-realbuild) pre-realbuild)
tmpdir="$2"
# get the current selection so that the parent script can find the additional packages that were installed # get the current selection so that the parent script can find the additional packages that were installed
dpkg --list | awk '$1 == "ii" { print $2"="$3 }' > /home/myfifo dpkg --list | awk '$1 == "ii" { print $2"="$3 }' | sort > "${tmpdir}/fullselection.list"
cat /home/myfifo2 > /dev/null # get all packages that were installed on top of the base packages
comm -13 "${tmpdir}/initialselection.list" "${tmpdir}/fullselection.list" > "${tmpdir}/bdselection.list"
# output the files belonging to all packages # output the files belonging to all packages
dpkg --list | awk '$1 == "ii" { print $2, $3 }' | while read namever; do dpkg --list | awk '$1 == "ii" { print $2, $3 }' | while read namever; do
set -- $namever set -- $namever
name=$1 name=$1
ver=$2 ver=$2
echo "${name}=${ver}" > /home/myfifo if grep --line-regexp $pkgnamever "${tmpdir}/bdselection.list"; then
cat /home/myfifo2 > /dev/null dpkg -L $name > "${tmpdir}/${name}=${ver}"
dpkg -L $name > /home/myfifo fi
cat /home/myfifo2 > /dev/null
done done
# output an empty line to indicate the end
echo > /home/myfifo
cat /home/myfifo2 > /dev/null
# output the dependencies of the sbuild dummy package # output the dependencies of the sbuild dummy package
dpkg --get-selections | awk '{ print $1; }' \ dpkg --get-selections | awk '{ print $1; }' \
| grep sbuild-build-depends \ | grep sbuild-build-depends \
@ -97,15 +63,18 @@ else
| grep -v sbuild-build-depends-essential-dummy \ | grep -v sbuild-build-depends-essential-dummy \
| grep -v sbuild-build-depends-lintian-dummy \ | grep -v sbuild-build-depends-lintian-dummy \
| xargs -I {} dpkg-query --showformat='${Depends}\n' --show {} \ | xargs -I {} dpkg-query --showformat='${Depends}\n' --show {} \
> /home/myfifo | sed 's/, \+/\n/'g \
cat /home/myfifo2 > /dev/null | sed 's/\([a-zA-Z0-9][a-zA-Z0-9+.-]*\).*/\1/' \
> "${tmpdir}/sbuild-dummy-depends"
# output the schroot id to start tracing # output the schroot id to start tracing
echo $SCHROOT_SESSION_ID > /home/myfifo echo $SCHROOT_SESSION_ID > "${tmpdir}/myfifo"
cat /home/myfifo2 > /dev/null # wait for fatrace to be forked
cat "${tmpdir}/myfifo" > /dev/null
;; ;;
post-realbuild) post-realbuild)
echo "done" > /home/myfifo tmpdir="$2"
cat /home/myfifo2 > /dev/null # signal that the build is done
echo > "${tmpdir}/myfifo"
;; ;;
equivs) equivs)
namever="$2" namever="$2"
@ -130,4 +99,10 @@ else
echo "invalid argument: $1" >&2 echo "invalid argument: $1" >&2
;; ;;
esac esac
else
echo "usage: " >&2
echo " $0 tmpdir"
echo " $0 [chroot-setup|pre-realbuild|post-realbuild] tmpdir"
echo " $0 equivs pkgname"
exit 1
fi fi

48
run.sh
View file

@ -5,26 +5,31 @@ if [ $# -eq 0 ]; then
exit 1 exit 1
fi fi
echo > buildsuccess.list build () {
for dsc in $1; do dsc="$1"
echo $dsc archall="$2"
/home/findunusedbd.sh & tmpdir=`mktemp -d --tmpdir=/home`
sbuild --no-arch-all \ mkfifo "${tmpdir}/myfifo"
--chroot-setup-commands='/home/findunusedbd.sh chroot-setup' \ chmod a+w "${tmpdir}/myfifo"
--pre-realbuild-commands='/home/findunusedbd.sh pre-realbuild' \ /home/findunusedbd.sh "$tmpdir" &
--post-realbuild-commands='/home/findunusedbd.sh post-realbuild' \ sbuild --$archall \
--chroot-setup-commands="/home/findunusedbd.sh $tmpdir chroot-setup" \
--pre-realbuild-commands="/home/findunusedbd.sh $tmpdir pre-realbuild" \
--post-realbuild-commands="/home/findunusedbd.sh $tmpdir post-realbuild" \
"$dsc" "$dsc"
ret=$? ret=$?
rm -f *.deb *.udeb *.changes rm -f *.deb *.udeb *.changes
if [ $ret -eq 0 ] && [ -s unneededdepends.list ]; then if [ $ret -eq 0 ] && [ -s unneededdepends.list ]; then
mv unneededdepends.list `basename $dsc .dsc`.unusedbd mv "${tmpdir}/unneededdepends.list" `basename $dsc .dsc`.${archall}.unusedbd
echo $dsc >> buildsuccess.list echo $dsc >> buildsuccess.${archall}.list
fi fi
done rm -rf "$tmpdir"
}
while read dscname; do check () {
echo $dscname dscname="$1"
unusedbdname=`basename $dscname .dsc`.unusedbd archall="$2"
unusedbdname=`basename $dscname .dsc`.${archall}.unusedbd
while read bd; do while read bd; do
# now run sbuild with "findunusedbd.sh equivs" creating a fake equivs package # now run sbuild with "findunusedbd.sh equivs" creating a fake equivs package
sbuild --no-arch-all \ sbuild --no-arch-all \
@ -35,4 +40,17 @@ while read dscname; do
fi fi
rm -f *.deb *.udeb *.changes rm -f *.deb *.udeb *.changes
done < $unusedbdname done < $unusedbdname
done < buildsuccess.list }
for a in "arch-all" "no-arch-all"; do
echo > buildsuccess.${a}.list
for dsc in $@; do
echo $dsc
build "$dsc" "$a"
done
while read dscname; do
echo $dscname
check $dscname "$a"
done < buildsuccess.${a}.list
done