perl-Upgrade unter FreeBSD
Ganz egal ob es sich um ein major upgrade handelt, also von perl-5.8 auf 5.10 oder 5.12 oder ein minor update, wie zum Beispiel 5.12.1 auf 5.12.2, eine solche Aktualisierung ist je nach Umfang der Installation immer mit Vorsicht vorzunehmen. Aber im Gegensatz zu den ganzen binary package weenies, kann man ueberhaupt nach Belieben updaten, wann und auf welche (major) Version man will.
Es gibt zwar ein Script namens perl-after-upgrade, aber das behandelt nur einen Teil der moeglichen Abhaengigkeiten.
In /usr/ports/UPDATING wird auch immer wieder vorgeschlagen, man moege einfach stur alles rebuilden, zum Beispiel mit portmaster perl-. Ich halte davon ueberhaupt nichts, denn erstens rebuildet es perl selbst noch ein mal (ja, das kann man umgehen), zweitens rebuildet es ports, die perl-after-upgrade bereits ordentlich behandelt hat, man verliert also Zeit und drittens "merkt" sich der Prozess nicht, was bereits erledigt wurde, um im Falle eines Abbruchs und Wiederaufnahme der Prozedur nicht von vorne anfangen zu muessen, was schon wieder enorm Zeit kosten kann.
Darum behelfe ich mir mit folgendem simplen Script, das ich direkt nach dem portupgrade von perl ausfuehre (ports-mgmt/portupgrade muss installiert sein, wegen pkg_which):
#!/bin/sh
perl-after-upgrade
OLDVERSION=5.12.1
find /usr/local/lib/perl5/${OLDVERSION} /usr/local/lib/perl5/site_perl/${OLDVERSION} | xargs pkg_which | sort -u | fgrep -v \? > /root/perl-${OLDVERSION}.ports
Das Ergebnis kann man dann direkt einem portupgrade -f oder portmaster zum Frass vorwerfen, also zum Beispiel: portmaster `cat /root/perl-5.12.1.ports`
Wenn man das Script danach noch einmal ausfuehrt, sollte die Ausgabedatei leer sein. Jetzt sollte man unbedingt in den alten perl-Verzeichnissen nach Files suchen, die man haendisch installiert hat, bei mir ist das zum Beispiel /usr/local/lib/perl5/site_perl/5.12.2/Mail/SpamAssassin/Plugin/ocrtext.pm, diese Datei muss man dann eben von Hand umkopieren. Wenn man sich sicher ist, alles erledigt zu haben, sollte man sich der Verzeichnisse der alten Version mit rm -rf entledigen, so sieht man auch gleich, dass hier ein "sauberes" Upgrade gemacht wurde.
Ein Problem erkennt obiges Script nicht: Binaries, die gegen libperl.so gelinkt sind und keine Files in /usr/local/lib/perl5 hinterlassen, werden nicht aktualisiert. Solche Probleme erkenne ich mit Hilfe von libchk. irc/epic5 ist zum Beispiel so ein Kandidat. Wer aber den Output von perl-after-upgrade genau liest, wird ebenfalls auf dieses Problem hingewiesen.