Pull to refresh

Собираем RPM-пакет для CentOS 6.4 x64

Reading time 3 min
Views 37K
Всех категорически приветствую! :)

Хочу поделиться опытом сборки RPM-пакетов в CentOS 6.4 x64. Мне эта система нравится, всё просто, информации много. Да и на большинстве наших сервисов (небольшая хостинговая компания) установлена именно она.

На рабочем серваке не делайте сборки пакетов, зачем вам лишние пакеты? Я создал виртуалку, там и делаю.

Будем мы сегодня собирать PHP-5.5.4 которая вышла буквально день назад. Почему PHP? Потому что с его сборкой я намучился больше всего: то не было нормального spec-файла, то ошибки в нём были (когда сам что-то дополнял/исправлял). Короче, горя я хлебал с ним больше недели. И в муках было рождено решение как же всё таки правильно собирать пакет для PHP.

Ну, что ж, уважаемые, к делу!

1. Установили ОС. Примем во внимание, что все действия с установкой и обновлением выполняются от root, поэтому sudo мы не используем. Теперь давайте обновимся и перезагрузимся:
yum update -y && shutdown -r now


2. Подключаем дополнительные репозитории. Я несколько использую, это:

rpm -ivh --nosignature http://rpm.axivo.com/redhat/axivo-release-6-1.noarch.rpm && rpm -ihv http://centos.alt.ru/repository/centos/6/x86_64/centalt-release-6-1.noarch.rpm


Делаем
yum update -y


3. Теперь устанавливаем всё добро, без чего мы никогда не соберём PHP.
Из CentALT сперва:
yum install -y libcurl-devel pam-devel sqlite-devel libedit-devel libtool-ltdl-devel libc-client-devel --enablerepo=CentALT


Потом из Axivo:

yum -y install postgresql-devel unixODBC-devel net-snmp-devel libxslt-devel libxml2-devel aspell-devel enchant-devel libicu-devel mariadb-server mariadb-devel t1lib-devel libjpeg-devel libpng-devel freetype-devel libXpm-devel libvpx-devel gmp-devel tokyocabinet-devel libmcrypt-devel libtidy-devel  freetds-devel recode-devel --enablerepo=axivo


Так, давайте проверим версию openssl:

openssl version


Если не 1.0.1e, то делаем так:

yum install -y openssl openssl-devel--enablerepo=axivo


Теперь устанавливаем необходимое для непосредственной сборки:

yum groupinstall -y "Development Tools" && yum install rpmdevtools


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

Это сделаем вот так:
rpmdev-setuptree


Эта команда создаст каталог со следующими подкаталогами:
+ rpmbuild
        -BUILD  
        -BUILDROOT  
        -RPMS  
        -SOURCES  
        -SPECS  
        -SRPM


Сюда BUILD будут распаковываться файлы из архива с исходниками. В RPMS будут Ваши rpm-пакеты. Здесь SOURCES располагайте все исходники с конфигами. SPECS — содержит spec-файл у которого есть инструкции для сборки. Это самая важная часть для сборки пакета. SRPM — содержит файл *.src.rpm — исходники rpm-пакета. Его мы можем распространять вместе с rpm-пакетами, это кому нужно что-то дополнить/удалить из будущего пакета. Содержит spec-файл, исходники для сборки.

Весь spec-файл сюда выкладывать не буду, ибо аж 1200 с лишним строк, поэтому предлагаю скачать архив скачать тут
Я думал что можно просто переделать spec-файл из исходников rpm-пакета php-5.4, но не тут-то было! Очень много подводных камней, которые решить самому сложно. Нашел в репозиториях Remi нужный src.rpm версии 5.5, и переделывал под новую версию. И всё получилось.

Итак, предположим, что все исходники вы скачали, распаковали в свой домашний каталог. Затем переходим в каталог SPEC и выполняем такую команду для сборки rpm-пакета вместе с src.rpm:
rpmbuild -ba php55.spec


Пошла сборка. Будет идти долго, в зависимости от мощности компьютера. У меня ушло где-то 40 минут.

Если выйдет новая версия PHP (допустим 5.5.*), то скачиваем bz2-архив в папку с исходниками (напомню, это SOURCES), редактируем файл SPECS/php55.spec. Меняем «Version: 5.5.4» на нужную версию. И можно собирать новую.

Уже собранные пакеты можно скачать тут

P.S. Обновив на одном из серверов с версии 5.4 до 5.5.4, ничего страшного не случилось. Единственно, у клиента возникло «Depraceted: preg_replace() /e», которое починилось легко заменив preg_replace() /e на preg_replace_callback().

Всем творческих узбеков :)
Tags:
Hubs:
+1
Comments 5
Comments Comments 5

Articles