Сборка RPM-пакета для RHEL/CentOS

c754bf9bcdfaf3f845f61cdfbd8960a3.png

Общий процесс сборки RPM-пакета:

  1. установка программы из исходников во временную директорию;

  2. подготовка среды для сборки;

  3. сборка и финальная корректировка rpm-пакета.

Данные о лабораторном стенде

Данные о собираемой программе

NAME=«Red Hat Enterprise Linux»

VERSION=»8.7 (Ootpa)»

ID_LIKE=«fedora»

VERSION_ID=»8.7»

PRETTY_NAME=«Red Hat Enterprise Linux 8.7 (Ootpa)»

Python-3.11.4

Исходники:  https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz

This is the fourth maintenance release of Python 3.11

Python 3.11.4 is the newest major release of the Python programming language, and it contains many new features and optimizations.

Установка программы из исходников во временную директорию

Скачиваем архив с исходниками программы c официального сайта и переносим в домашнюю директорию vm:

ls -l
-rw-rw-r--. 1 smirnov-nk smirnov-nk 26526163 Jul 27 20:29 Python-3.11.4.tgz

Создадим временную директорию ~/tmp:

mkdir ~/tmp
ls -l
-rw-rw-r--. 1 smirnov-nk smirnov-nk 26526163 Jul 27 20:29 Python-3.11.4.tgz
drwxrwxr-x. 2 smirnov-nk smirnov-nk 6 Jul 27 20:35 tmp

Установим все необходимые инструменты для компиляции программы:

sudo yum install -y make gcc python3-devel

Установим все необходимые зависимости для работы программы:

sudo yum install -y openssl-devel libffi-devel bzip2-devel

Распакуем ранее загруженный архив и выполним установку программы во временную директорию:

tar -xvf Python-3.11.4.tgz
cd Python-3.11.4
./configure --enable-optimizations && make && make install DESTDIR=~/tmp

После успешной установки программы, можно модифицировать ее — например, как в случае с интерпретатором python, обновить или дополнительно установить пакеты через pip.

Перед сборкой rpm-пакета python на данном этапе, для последующей корректной работы модуля pip, необходимо внести правки в исполняемый файл ~/tmp/usr/local/bin/pip3.11:

#!/usr/local/bin/python3.11
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub (r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit (main ())

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

Установим необходимые инструменты для сборки:

sudo yum install -y ./rpmrebuild-2.16-3.el8.noarch.rpm rpmdevtools rpmlint tree
sudo yum group install -y "Development Tools"

* пакет rpmrebuild-2.16–3.el8.noarch.rpm был скачан из открытого источника и загружен в домашнюю директорию vm

Создадим среду для сборки:

rpmdev-setuptree
cd rpmbuild/
mkdir -p BUILDROOT/python-3.11.4-3.11.4-stable.x86_64

В результате мы получим директорию ~/rpmbuild со следующей внутренней структурой:

tree
.
├── BUILD
├── BUILDROOT
│   └── python-3.11.4-3.11.4-stable.x86_64
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS

Создадим и подготовим SPEC-файл:

vi SPECS/python-3.11.4.spec

Содержание SPEC-файла следующее:

Name: python-3.11.4
Version: 3.11.4
Release: stable
Summary: This is the stable release of Python 3.11.0
License: GPL
URL: https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz
Requires: openssl-devel >= 1.1.1, libffi-devel bzip2-devel
%description
python-3.11.4 made by Nikolay
%files
%defattr(-,root,root)
%{_prefix}
%changelog
* Thu May 18 2023 nikolay

Проверим SPEC-файл на корректность:

rpmlint ~/rpmbuild/SPECS/python-3.11.4.spec

Результаты проверки:

/home/smirnov-nk/rpmbuild/SPECS/python-3.11.4.spec: W: no-%prep-section
/home/smirnov-nk/rpmbuild/SPECS/python-3.11.4.spec: W: no-%build-section
/home/smirnov-nk/rpmbuild/SPECS/python-3.11.4.spec: W: no-%install-section
0 packages and 1 specfiles checked; 0 errors, 3 warnings.

Перенесем содержание временной директории ~/tmp в директорию ~/rpmbuild/BUILDROOT/python-3.11.4–3.11.4-stable.x86_64:

cp -rv ~/tmp/* ~/rpmbuild/BUILDROOT/python-3.11.4-3.11.4-stable.x86_64/

Сборка и финальная корректировка rpm-пакета

Выполним сборку пакета:

rpmbuild -bb ~/rpmbuild/SPECS/python-3.11.4.spec

Переместим пакет в домашнюю директорию и выполним корректировку автоматически сгенерированного в процессе сборки SPEC-файла:

mv ~/rpmbuild/RPMS/x86_64/python-3.11.4-3.11.4-stable.x86_64.rpm ~/python-3.11.4-3.11.4-stable.x86_64_tmp.rpm
rpmrebuild -enp ~/python-3.11.4-3.11.4-stable.x86_64_tmp.rpm

Во избежание ошибок при последующей установке нового пакета, в SPEC-файле необходимо удалить несколько строк:

# rpmrebuild autogenerated specfile

BuildRoot: /home/smirnov-nk/.tmp/rpmrebuild.68368/work/root
AutoProv: no
%undefine __find_provides
AutoReq: no
%undefine __find_requires
# Do not try autogenerate prereq/conflicts/obsoletes and check files
%undefine __check_files
%undefine __find_prereq
%undefine __find_conflicts
%undefine __find_obsoletes
# Be sure buildpolicy set to do nothing
%define __spec_install_post %{nil}
# Something that need for rpm-4.1
%define _missing_doc_files_terminate_build 0
#dummy
#dummy
#BUILDHOST: rhel.ouvp
#BUILDTIME: Thu Jul 27 21:43:33 2023
#SOURCERPM: python-3.11.4–3.11.4-stable.src.rpm

#RPMVERSION: 4.14.3

#OS: linux
#SIZE: 417771749
#ARCHIVESIZE: 419630472
#ARCH: x86_64
BuildArch: x86_64
Name: python-3.11.4
Version: 3.11.4
Release: stable
License: GPL
Group: Unspecified
Summary: This is the stable release of Python 3.11.0

URL: https://www.python.org/ftp/python/3.11.4/Python-3.11.4.tgz

Provides: python-3.11.4 = 3.11.4-stable
Provides: python-3.11.4(x86–64) = 3.11.4-stable
Requires: /bin/bash
Requires: /bin/sh
Requires: /home/smirnov-nk/tmp/usr/local/bin/python3.11
Requires: /usr/bin/env
Requires: /usr/local/bin/python
Requires: /usr/local/bin/python3.11
Requires: bzip2-devel
Requires: libbz2.so.1()(64bit)
Requires: libc.so.6()(64bit)

Финальная версия rpm-пакета расположена по пути ~/rpmbuild/RPMS/x86_64/python-3.11.4–3.11.4-stable.x86_64.rpm

© Habrahabr.ru