Сборка Perl 5.18.1

05 сен 2013 07:04


Завершилось обновление Perl до версии 5.18.1 в репозитории ALTLinux Sisyphus.

Как обычно, при смене мажорной версии Perl происходит изменение API libperl, что означает, что требуется пересборка всех программ и модулей слинкованых с libperl.so. В отличии от многих других вендоров в ALTLinux нельзя просто так взять и обновить библиотеку, сломав сотни зависимых программ. Чтобы новая библиотека прошла в репозиторий для разработчиков, должна быть создана транзакция в сборочной системе, в рамках которой происходит сборка новой библиотеки и выполняется пересборка всех зависимых приложений. В случае с Perl 5.18.1 такая транзакция состояла из 320 пакетов.

Как обычно, процесс пересборки начинается с мучительного вспоминания, а как проходит эта процедура и с чего начинать. Поэтому я решил сделать подробную заметку о деталях сборки для тех, кто будет в будущем собирать версию 5.20 и последующие.

↓↓↓↓↓↓↓↓

Порядок сборки пакетов

Самой сложной задачей было определить в каком порядке начинать сборку, чтобы сначала были собраны пакеты, которые имеют наименьшее число зависимостей (только модули из базового Perl), и т.д., чтобы не получилось так, что собирается модуль, зависимости которого ещё не собраны под новый Perl. Эта работа была проделана ещё при сборке Perl 5.12, с тех пор порядок собираемых пакетов зафиксирован и сильно не меняется.

Список последовательности сборки в последней транзакции доступен

здесь .

Обновление Perl

Gear-репозиторий Perl ведётся в git и для обновления исходных кодов Perl достаточно указать внешний репозиторий апстрима Perl

# клонируем gear-репозиторий
$ git clone git://git.altlinux.org/gears/p/perl.git
$ cd perl

# устанавливаем внешний репозиторий
$ git remote add upstream git://perl5.git.perl.org/perl.git

# получаем всё из апстрима
$ git fetch upstream

# создаём новую локальную ветку perl-5.18,
# в которую извлекаем нужный стабильный релиз
$ git checkout -b perl-5.18 v5.18.1

Алексей Турбин создал несколько патчей для Perl, которые исправляют определённые проблемы сборки и добавляют некоторые особенности в сборку Perl в ALTLinux, которые надо знать и учитывать при сборке следующих версий.

Для Perl 5.18.1 эти патчи можно увидеть в виде последовательности коммитов ca0bd0b .. 159f665d .

Прокомментирую наболее важные патчи:

 ca0bd0bf - устанавливается имя разделяемой библиотеки в виде libperl-5.18.so (добавляется мажорная версия в имя), чтобы на файловом уровне привязать зависимые программы к версии API libperl.

 35294468 - все XS-модули явно линкуются с libperl и libpthread, это полезно, если такой модуль подгружается не из perl процесса, а через вызов dlopen в процессе, в котором ещё не подгружен libperl.

 842aab6a - модуль Cwd использует вызов realpath из libc, а не встроенную реализацию bsd_realpath. Это, кстати, порождает несовместимость: функция abs_path начинает возвращать undef, если указанный путь не существует, в то время как bsd_realpath всё равно пытается вычислить абсолютный путь и возвращает возможный результат. Такое поведение может иметь потенциальные проблемы с безопасностью.

 b2e4a169 - отключены предупреждения об устаревших core-модулях. Это связано с тем, что в сборке perl в ALTLinux vendorlib и privlib указывают на один и тот же каталог /usr/share/perl5, т.е. не выделяется отдельно каталог для core-модулей.

Таким образом, после извлечения новой стабильной версии все эти коммиты переносятся с помощью серии cherry-pick'ов, при этом возможно разрешая образовавшиеся конфликты:

$ git cherry-pick -x ca0bd0b
...
$ git cherry-pick -x 159f665d

Кроме этого, в 5.18.1 потребовалось поправить тест dist/threads/t/join.t (коммит 00a65403 ). Поскольку в сборочной системе не монтируется каталог /proc, то попытка получить информацию о процессах, через команду ps приводит к ошибке.

После того как в текущей ветке применены все патчи извлекаются файлы perl.spec и .gear/rules от предыдущего релиза Perl

$ git checkout origin/perl-5.16 perl.spec .gear/rules

Обновляется версия и релиз, добавляется запись в changelog спека.

После чего делается коммит и создатся сборочный тег:

$ git commit -m "5.18.1-alt1"
$ git tag -s -m 5.18.1-alt1 5.18.1-alt1

Пакет можно отправлять на сборку.

В будущем может возникнуть потребность обновлять модули, которые идут в составе Perl. Это удобно делать с помощью всё того же cherry-pick из основного репозитория perl (возможно даже из blead), где периодически происходит обновление core-модулей, как правило, одним коммитом. Так было и в этом релизе, когда дополнительно потребовалось обновить модуль Text::Tabs до версии 2013.0523 (коммит 95f27eeb )

Обновление rpm-build-perl

rpm-build-perl отвечает за корректную сборку rpm-пакетов с Perl-модулями. Это ключевая программа, которая ищет и фиксирует зависимости на Perl-модули, а также определяет какие модули предоставляет собираемый пакет.

Начиная с релиза 0.82-alt1 rpm-build-perl перестал быть noarch-пакетом. Фактически это означает, что стало невозможно собрать ни один пакет с новым Perl без предварительного бутстрапа rpm-build-perl.

Довольно забавный комментарий, который описывает это изменение, можно увидеть здесь

Чтобы упростить задачу я добавил в спек rpm-build-perl ключ bootstrap. Теперь перед сборкой нового perl собирается bootstrap-версия rpm-build-perl (он снова становится noarch), указав в начале спека:

%def_with bootstrap

А после сборки зависимостей: perl, perl-Filter и perl-Encode, проводится сборка с

%def_without bootstrap

Чтобы вернуть полный функционал пакета

Модули требующие bootstrap

Помимо rpm-build-perl есть ещё ряд модулей, которые из-за циклических зависимостей должны собираться в урезанном виде, а после того как сборочная транзакция Perl пройдёт - пересобираться в нормальном виде.

 • perl-Math-BigInt - должна быть удалена зависимость на perl-Math-BigInt-FastCalc

 • perl-XML-LibXML - зависимость от perl-XML-SAX заменяется на perl-XML-SAX-Base

 • perl-DateTime-TimeZone - удаляется зависимость на perl-DateTime

 • perl-Date-Calc-XS - удаляется зависимость на perl-Date-Calc

 • perl-Readonly - удаляется зависимость на perl-Readonly-XS

 • perl-Moose - разрывается циклическая зависимость на perl-Specio (который ещё даже не собран)

Исправление ошибок

Как правило, не все модули спокойно переживают обновление на новую версию Perl. Поэтому всегда имеет смысл подождать выхода очередной минорной версии Perl. За это время многие модули, имеющие проблемы с новой версией Perl, исправляются. В случае Perl 5.18 разлом был минимален.

 • perl-GTK - древний модуль обвязки к GTK1 собирается с новым Perl после исправления использования макроса SvUPGRADE()

 • perl-Time-Format_XS - ошибка синтаксиса в тестах (qw больше не формирует список)

 • perl-B-C - традиционно не поспевает за релизами Perl, более менее рабочий вариант доступен в master ветке git'а разработчика

 • perl-Net-SSH2 - принудительно устанавливает CCFLAGS, что ломает сборку на x86

 • perl-KyotoCabinet - похоже немного сломан, пока нет идей по исправлению (отключены сломавшиеся тесты)

 • perl-Sys-Guestfs - потребовал обновления core-модуля Text::Tabs до версии 2013.0523

 • perl-Tk - версия 804.031 использует pkgconfig для получения списка библиотек для линковки с libpng, при этом теряется информация о неявных зависимостях (zlib), что приводит к тому, что Tk::PNG не собирается.

 • apache2-mod_perl - на архитектуре i586 в сборочной системе возникли странные ошибки в тесте t/apr/finfo.t. Воспроизвести локально не получилось, поэтому тест пришлось отключить.

После того как новый Perl попадает в нестабильный репозиторий, очередная пересборка всех пакетов выявляет какие ещё модули перестали работать. Такие разломы исправляется по мере поступления, но это уже отдельная история...

Теги: perl ALT

Обновлён: 2013-09-05 07:04


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