Hi all, At Matthias's suggestion, I'm attaching here a script that I've been using in Ubuntu to trigger library package transitions for the g++5 ABI change. It needs a bit of tuning to be usable in Debian (for instance, you probably don't want to pull the source package from Ubuntu... or try to write transition files to the Ubuntu instance of the release team transition tracker, as checked out on my local machine... or upload a source package to the Debian archive without building/testing/including binaries), but hopefully it's a useful starting point for maintainers (or NMUers) who need to update their packages for this ABI change. Hope that helps, -- Steve Langasek Give me a lever long enough and a Free OS Debian Developer to set it on, and I can move the world. Ubuntu Developer http://www.debian.org/ slangasek@ubuntu.com vorlon@debian.org
#!/bin/sh
set -e
bendir=/home/vorlon/devel/canonical/ubuntu-transition-tracker-configs/monitor/ongoing
dry_run=false
no_update=false
while [ $# -gt 0 ]; do
case $1 in
--dry-run)
dry_run=:
;;
--no-update)
no_update=:
;;
*)
echo "Unknown argument: $1"
exit 1
;;
esac
shift
done
sudo apt-get install wget ubuntu-dev-tools grep-dctrl devscripts equivs dput
rename_package() {
oldpkg="$1"
newpkg="$2"
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Error: rename_package called with args '$@'"
return 1
fi
# warning: sed can be hazardous to your mental health.
sed -i -e"s/\([ |,=/]\)$oldpkg\([ |,:]\|$\)/\1$newpkg\2/g" \
debian/control debian/control.in debian/rules
if sed -n -e"/^Package:[[:space:]]*$newpkg[[:space:]]*\$/,/^Package:/p" debian/control \
| grep -q Conflicts:
then
sed -i -e"/^Package:[[:space:]]*$newpkg[[:space:]]*\$/,/^Package:/ { s/^Conflicts:/& $oldpkg,/; }" \
debian/control debian/control.in
else
sed -i -e"/^Package:[[:space:]]*$newpkg[[:space:]]*\$/,/^Package:/ { /^Description:/i\\" \
-e "Conflicts: $oldpkg" -e '}' \
debian/control debian/control.in
fi
if sed -n -e"/^Package:[[:space:]]*$newpkg[[:space:]]*\$/,/^Package:/p" debian/control \
| grep -q Replaces:
then
sed -i -e"/^Package:[[:space:]]*$newpkg[[:space:]]*\$/,/^Package:/ { s/^Replaces:/& $oldpkg,/; }" \
debian/control debian/control.in
else
sed -i -e"/^Package:[[:space:]]*$newpkg[[:space:]]*\$/,/^Package:/ { /^Description:/i\\" \
-e "Replaces: $oldpkg" -e '}' \
debian/control debian/control.in
fi
for dh_old in debian/$oldpkg.*; do
if [ -e "$dh_old" ]; then
dh_new=$(echo $dh_old | sed -e"s/$oldpkg/$newpkg/")
mv -v $dh_old $dh_new
sed -i -e"s/\(^\|[ |,/]\)$oldpkg\([ |,:/]\|$\)/\1$newpkg\2/g" $dh_new
fi
done
}
if ! $no_update; then
echo '========== Downloading Debian build logs =========='
wget -q --mirror -nH --cut-dirs=3 -np -R '*index.html*' -P "debian-build-logs" \
https://people.debian.org/~doko/logs/gcc5-20150701/
fi
echo '=============== Rebuilding packages ==============='
# change this if you want to force a package name change for a
# particular package
for F in debian-build-logs/*.log
#for F in flightcrew
do
binpkgs=
#binpkgs=libflightcrew0
srcpkg=$(basename ${F%%_*})
echo "Source package: $srcpkg"
if [ -e blacklist.txt ] && grep -q "^$srcpkg\$" blacklist.txt
then
echo " package blacklisted; skipping"
continue
fi
if [ -z "$binpkgs" ] \
&& ! binpkgs=$(awk '/===== BEGIN GCC CXX11 symbols/ { print $6 }' $F | grep -v DEBIAN/symbols | sort -u)
then
echo "Error: no binary packages found in log for $srcpkg"
continue
fi
if nonnumpkgs=$(echo "$binpkgs" | grep -vE '[0-9](\+\+)?(c2a?)?$'); then
echo "Skipping non-numeric bin packages: $nonnumpkgs"
fi
if ! binpkgs=$(echo "$binpkgs" | grep -E '[0-9](\+\+)?(c2a?)?$'); then
continue
fi
binpkgs=$(echo $binpkgs)
# Find the most recent available source package known to us and check
# its binaries. Better done with launchpadlib, but requires switching
# to python (which is probably sensible anyway, but grep-dctrl)
# But it can definitely give a wrong answer relative to pull-lp-source.
# hopefully sort's -V comparison gives us the right answer in most cases
latestver=$(apt-cache showsrc "$srcpkg" 2>/dev/null | grep-dctrl -n -FPackage -X "$srcpkg" -sVersion -n | sort -V | tail -n1)
if [ -z "$latestver" ]; then
echo "Source package $srcpkg does not exist in Ubuntu, skipping"
continue
fi
latestbinlist=$(apt-cache showsrc "$srcpkg" | grep-dctrl -FPackage -X "$srcpkg" -a -FVersion -X "$latestver" -sBinary -n)
rename_needed=false
for binpkg in $binpkgs; do
if echo $latestbinlist | grep -q "\(^\| \)$binpkg\(, \|$\)"; then
echo "$binpkg still present in latest source, update needed."
rename_needed=:
break
fi
done
if ! $rename_needed; then
echo "$srcpkg has already been transitioned (old binaries: $binpkgs; current binaries: $latestbinlist)"
continue
fi
echo "Rebuilding $srcpkg"
if $dry_run; then
continue
fi
pull-lp-source $srcpkg
build_failed=false
(cd ${srcpkg}-*
dch 'Rename library packages for g++5 ABI transition.'
for binpkg in $binpkgs; do
case $binpkg in
*[0-9]c2|*[0-9]c2a)
newpkg=${binpkg%c2*}v5
;;
*)
newpkg=${binpkg}v5
;;
esac
rename_package "$binpkg" "$newpkg"
case $latestbinlist in
*${binpkg}-dbg*)
rename_package "${binpkg}-dbg" "${newpkg}-dbg"
;;
*) ;;
esac
done
update-maintainer
dch -r -D wily ''
sudo mk-build-deps -i -r -t 'apt-get --no-install-recommends -y'
debuild -S
) || build_failed=:
if $build_failed; then
rm -r ${srcpkg}[-_]*
continue
fi
fname="$bendir/${srcpkg}-g++5.ben"
affected=
good=
bad=
for binpkg in $binpkgs; do
oldpkg=$(echo $binpkg | sed -e's/\+/\\+/g')
case $oldpkg in
*[0-9]c2|*[0-9]c2a)
newpkg=${oldpkg%c2*}v5
;;
*)
newpkg=${oldpkg}v5
;;
esac
affected="$affected${affected:+|}$oldpkg|$newpkg"
good="$good${good:+|}$newpkg"
bad="$bad${bad:+|}$oldpkg"
case $latestbinlist in
*${binpkg}-dbg*)
oldpkg=$(echo $binpkg | sed -e's/\+/\\+/g')-dbg
case $oldpkg in
*[0-9]c2|*[0-9]c2a)
newpkg=${oldpkg%c2*}v5-dbg
;;
*)
newpkg=${oldpkg}v5-dbg
;;
esac
affected="$affected${affected:+|}$oldpkg|$newpkg"
good="$good${good:+|}$newpkg"
bad="$bad${bad:+|}$oldpkg"
;;
*) ;;
esac
done
echo 'title = "'"$srcpkg g++5 ABI transition"'";' > $fname
echo "is_affected = .depends ~ /(^| )($affected)\s*([,(:]|$)/;" >> $fname
echo "is_good = .depends ~ /(^| )($good)\s*([,(:]|$)/;" >> $fname
echo "is_bad = .depends ~ /(^| )($bad)\s*([,(:]|$)/;" >> $fname
(cd $bendir; bzr add $(basename $fname))
if [ -n "$(find ${srcpkg}-*/debian -maxdepth 1 -name '*.symbols*' -print)" ]
then
echo "Error: package $srcpkg uses symbols files, needs manual attention."
exit 1
fi
dput ${srcpkg}*_source.changes
rm -r ${srcpkg}[-_]*
done
# bug closed by Debian maintainer as no transition required cld2 cln concordance cppdb curlpp elektra exempi ffms2 geographiclib gromacs libabigail libcsfml libopendbx librevisa libsass libsbsms mp4v2 pgmodeler qt4-x11 simple-tpm-pk11 sleuthkit # removed from Debian, needs removed from Ubuntu... dirac libmath++ net6 # manually transitioned; no package name change for jackd2 binary jackd2 # just-merged version has new soname vs. wily libecap # sort -V can't figure out which end is up libmusicbrainz5 # should skip llvm-toolchain-snapshot qtwebkit-opensource-src qttools-opensource-src qt-gstreamer # exclude until we know what's going on kdepimlibs # symbols files, and qt4+boost libktorrent # symbols files, skipping these.
Attachment:
signature.asc
Description: Digital signature