понедельник, 8 июля 2013 г.

FreeBSD: обновляем perl с 5.10 до 5.16

В связи с тем, что 5.10 выпилен, лучше обновлять сразу на максимально свежую версию. И есть там ряд нюансов.


/usr/ports/UPDATING

2013-06-12
Affects: users of  lang/perl* and any port that depends on it
Author: az@FreeBSD.org
Reason:
  lang/perl5.12 has been upgraded from version 5.12.4 to 5.12.5
  lang/perl5.14 has been upgraded from version 5.14.2 to 5.14.4
  lang/perl5.16 has been upgraded from version 5.16.2 to 5.16.3

  The directory structure where Perl is installed has also been modified:
  "major.minor" is now used instead of "major.minor.patchlevel".

  The "perl-after-upgrade" script has been removed.

  Please rebuild all Perl ports and all ports that depend on it:

  # portmaster -r perl
    or
  # portupgrade -rf perl
    or
  # pkg install -fR perl

Что это значит?
1) Изменилась структура каталогов
Было 5.10.1, стало просто 5.16, поэтому при обновлении nginx например можно поймать
/usr/local/etc/rc.d/nginx reload
Performing sanity check on nginx configuration:
Can't locate nginx.pm in @INC (@INC contains: /usr/local/lib/perl5/5.10.1/BSDPAN /usr/local/lib/perl5/site_perl/5.10.1/mach /usr/local/lib/perl5/site_perl/5.10.1 /usr/local/lib/perl5/5.10.1/mach /usr/local/lib/perl5/5.10.1 .).
BEGIN failed--compilation aborted.
nginx: [alert] perl_parse() failed: 2
nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed

Тогда как сам модуль теперь оказывается в 
/usr/local/lib/perl5/site_perl/5.10/mach/nginx.pm

Совсем простое решение:
cd  /usr/local/lib/perl5/site_perl/5.10/
cp -rp 5.10/* 5.10.1/
rm -rf 5.10
ln -s 5.10.1 5.10

Или вариант чуть сложнее

cd /usr/ports
svn diff -c 320679 Mk/bsd.perl.mk > ~/patch-r320679
patch -R < ~/patch-r320679

после этого пересобрать nginx 

1а) Ну и как следствие, больше нету perl-after-upgrade

2) 5.8 и 5.10 убраны полностью (в марте еще)
поэтому для установки этих версий лучше использовать App::perlbrew + Carton для модулей, и зафиксировать версии модулей.

3) Как всегда, проблемы с переходом версий
3а) пока ничего не обновляли
Хоть и указано делать что-то типа portmaster -r perl, можно получить не ту версию которую хотели, поэтому будет правильнее сначала сделать
cd /usr/ports/lang/perl5.16 (например)
make

echo 'pkg_deinstall -f perl > ~/perl-up 2>&1' | sh
это универсальная конструкция, потому что например csh не умеет 2>&1 и штатно этого не сделать.

Хотя можно перед удалением просто
pkg_info -a -q -o | egrep "/p5-" > ~/perl-up

Эти варианты будут работать даже после ручного обновления перла, до этого можно еще сделать
pkg_info -Rq perl-\*
покажет все зависимости, и все эти пакеты надо будет пересобрать.

Можно попробовать в /etc/make.conf заменить версию перла на нужную, и после этого сделать portmaster -r perl

Есть ещё вариант
portmaster -o lang/perl5.16 lang/perl5.10
но у меня -о вызывает вечно какие-нибудь проблемы.

3б) если уже обновили lang/perl
pkg_info | grep "^p5-" | awk '{print $1}' | xargs portmaster -D

В любом случае нужно быть готовым к тому, что работы займут несколько часов и что-нибудь может сломаться.

Комментариев нет:

Отправить комментарий