[devel] perl-5.8.0-alt0.3 (important)
=?iso-8859-1?q?at_=CE=C1_turbinal=2Eorg?=
=?iso-8859-1?q?at_=CE=C1_turbinal=2Eorg?=
Ср Окт 16 05:45:57 MSD 2002
В incoming заливается perl-5.8.0-alt0.3.nosrc.rpm.
Следующий текст важнее некоторых других (моих).
TOC
Summary
0) update perl.req in your build environment
1) remove straight perl* dependencies
2) think of why your package wants something more than perl-base
3) soname changed
4) libperl.so* relocated
5) use of inc_version_list mechanism is finally deprecated
6) archlib name is i386-linux
7) clashes
8) charges
Summary: начинается переход на perl 5.8.
0) обратите внимание на то, что пересборку любых пакетов, которые так
или иначе требуют perl, нужно делать в среде с исправленным
/usr/lib/rpm/perl.req; иначе будут сведены на нет все усилия по
разведению зависимостей.
1) ПОЖАЛУЙСТА, уберите все прямые зависимости на perl* из ваших пакетов
(либо предоставьте доказательства того, что /usr/lib/rpm/*req*
отрабатывает некорректно). Особенно этим грешат пакеты php-*. php-gd:
PreReq: php-common = %version-%release, perl
нужно заменить на
PreReq: php-common = %version-%release
У меня сложилось ощущение, что многим из этих пакетов перл вообще не
нужен, а зависимость появилась методом copy-paste.
2) я сделал перемещение некоторых модулей из perl в perl-base и
perl-devel. Это требуется для более эффективного разведения перловых
зависимостей в масштабах дистрибутива. (В частности, ExtUtils уехали в
perl-devel, а вместе с ними и CPAN.pm; это и другие решения будут
казаться правильными, если над ними подумать.)
Расклад:
$ ls -s1 perl-*5.8.0-alt0.1.i686.rpm
6703 perl-5.8.0-alt0.1.i686.rpm
1273 perl-base-5.8.0-alt0.1.i686.rpm
2162 perl-devel-5.8.0-alt0.1.i686.rpm
40 perl-suidperl-5.8.0-alt0.1.i686.rpm
Приоритет пакетов (в смысле их необходимости в некоторых типичных/важных
случаях):
perl-base
perl-devel
Т.е. большинству пакетов с новым раскладом в конечном счете perl НЕ
ДОЛЖЕН быть нужен. В Junior нужно включить только perl-base. Возможно,
над этим придется дополнительно поработать.
Кроме того, я проверил функциональную замкнутость perl-base и perl-devel
относительно perl. Для этого я написал скрипт, который можно также
использовать для анализа перловых зависимостей других пакетов. Скрипт
прилагается (но он ни на что не претендует; желающие должны его
доработать и обязательно об этом сообщить). В результате удалось
предотвратить ряд ошибок, например таких:
file /usr/lib/perl5/File/Spec/Unix.pm
requires perl(Scalar/Util.pm) provided by perl-5.8.0-alt0.1
file /usr/lib/perl5/i386-linux-thread-multi/Data/Dumper.pm
requires perl(B/Deparse.pm) provided by perl-devel-5.8.0-alt0.1
Благодаря формальной независимости perl-base от perl* удалось отключить
AutoReq: yes, noperl. Теперь база RPM вырастет ещё раза в 2. :)
Другой пример:
$ perl depend.pl gnucash
file /usr/bin/update-finance-quote
requires perl(CPAN.pm) provided by perl-devel-5.8.0-alt0.1
Оказывается, что кроме учета частных средств, gnucash ещё умеет
устанавливать на машине перловый софт! Хорошо это или плохо, я не знаю.
Но для разведения зависимостей это killer, как и сам CPAN.pm.
3) soname changed: libperl.so.5.8; это сделано для явного указания
бинарной несовместимости с perl 5.6. К сожалению, большинство perl-*
пакетов сейчас собрано таким образом, что указать факт их бинарной
несовместимости с новым перлом никак нельзя. Для того, чтобы избежать
такой ситуации в будущем, в perl-* пакетах с бинарным кодом (*.so) я
предлагаю явно указывать soname:
PreReq: libperl.so.5.8
В пакетах без бинарного кода этого делать не нужно. В других пакетах, в
которых бинарный код явно линкуется с libperl.so, этого делать также не
нужно, т.к. эта зависимость должна быть обнаружена автоматически.
4) libperl.so* relocated to /usr/lib; у меня сложилось мнение, что
libperl.so* ничем не лучше и не хуже других *.so*. Сделано это следующим
образом:
%make_build CCDLFLAGS="-rdynamic"
$PERL -pi -e "s/,-rpath,[^\s,'\"]+//g && s/\s*-Wl(?!,)//g" $RPM_BUILD_ROOT%archlib/Config.pm
mkdir -p $RPM_BUILD_ROOT%_libdir
mv $RPM_BUILD_ROOT%archlib/CORE/libperl.so.%sover $RPM_BUILD_ROOT%_libdir
ln -sf libperl.so.%sover $RPM_BUILD_ROOT%_libdir/libperl.so
Последствия этого шага для других пакетов понятны мне не до конца,
однако проблем пока не замечено.
Вопрос: как правильно сделать non-lazy linking для /usr/bin/perl?
5) use of inc_version_list mechanism is finally deprecated. Default
values
Configure variable Default value
$privlib $prefix/lib/perl5/$version
$archlib $prefix/lib/perl5/$version/$archname
were changed to
$privlib $prefix/lib/perl5
$archlib $prefix/lib/perl5/$archname
by mhz on Tue May 29 2001. Default values
$sitelib $siteprefix/lib/perl5/site_perl/$version
$sitearch $siteprefix/lib/perl5/site_perl/$version/$archname
are changed to
$sitelib $siteprefix/lib/perl5/site_perl
$sitearch $siteprefix/lib/perl5/site_perl/$archname
since now.
Обоснование: создатели перла предусмотрели возможность иметь в системе
одновременно несколько версий перла, для каждого из которых существует
отдельное дерево библиотек. Дистрибутив такой возможности не
предусматривает; вернее, для этого есть /usr/local. В дистрибутиве есть
более надежные механизмы контроля версий и совместимости. Есть претензии
и по существу механизма: возможна ситуация, когда старое дерево
библиотек совместимо с новым перлом лишь частично. Это мы имеем сейчас в
связи с изменениями в ABI.
6) я подумал и решил оставть названия каталогов
/usr/lib/perl5/i386-linux
/usr/lib/perl5/site_perl/i386-linux
а не i386-linux-thread-multi, как делают RH и MDK. На это есть две
причины: а) теперь все сборки будут с тредами; во всяком случае, нужны
будут очень веские причины, чтобы отказаться от сборки с тредами б)
название каталога в любом случае условно и не всегда/не вполне
соответствует действительности.
7) Замечены как минимум следующие модули, которые входят в оригинальный
перл (некоторые из них появились только в 5.8). Есть соображения как за,
так и против того, чтобы продолжать собирать их из/в виде отдельных
пакетов. С ними лучше пока ничего не делать. Я ещё помедитирую.
perl-Time-HiRes
perl-Storable
perl-MIME-Base64
perl-CGI
perl-DB_File
perl-Digest-MD5
perl-libnet
perl-Parse-RecDescent
8) Пересборку пакетов
perl-libwww-perl
perl-HTML-Parser
я возьму на себя.
----------- следующая часть -----------
#!/usr/bin/perl
#
# check whether perl part of the package depends on perl-base only
#
use strict;
my @packages = @ARGV;
my $base = `rpm -q 'perl-base'`;
chomp $base;
foreach my $package (@packages) {
$package = `rpm -q '$package'`;
chomp $package;
$_= `rpm -ql '$package' '$base' | sort | uniq`;
my @files = split;
my $n = @files;
print "checking whether perl part of $package package ($n files) depends on $base only\n";
foreach my $file (@files) {
my @req = `/usr/lib/rpm/perl.req '$file'`;
@req = map { /perl\(.+?\)/ ? $& :() } @req;
foreach my $req (@req) {
$_ = `rpm -q --whatprovides '$req'`;
my @prov = split;
print "warning: $req is provided by @prov\n"
if @prov > 1;
print "file $file requires\n\t$req provided by @prov\n"
unless grep { "@prov" =~ /\Q$_/ } ($base, $package);
}
}
}
Подробная информация о списке рассылки Devel