Сборка rpm пакета с помощью rpmbuild — различия между версиями
Kalivv (обсуждение | вклад) |
|||
Строка 1: | Строка 1: | ||
− | + | ==Подготовка к сборке rpm-пакетов== | |
− | Подготовка к сборке | ||
− | + | RPM-пакет — это просто файл, содержащий другие файлы и информацию о них, необходимую для системы. Менеджер пакетов rpm использует эти метаданные для определения зависимостей, места установки файлов и другой информации. | |
− | + | Существует два типа rpm-пакетов: | |
+ | * SRPM (исходники с расширением .src.rpm) | ||
+ | * RPM (бинарный файл с расширением .rpm) | ||
− | + | Они имеют разное содержимое и служат для разных целей. | |
− | + | SRPM обязательно содержит исходный код, опционально — патчи и spec-файл, который описывает, как собрать исходный код в бинарный RPM. Бинарный RPM содержит бинарные файлы, созданные из исходников и патчей, если таковые имелись. | |
+ | |||
+ | ''Сборку rpm-пакетов крайне нежелательно проводить с правами суперпользователя (root). Настоятельно рекомендуется все манипуляции производить с правами непривилегированного пользователя, поскольку при сборке с правами root имеется высокая вероятность повреждения системы.'' | ||
+ | |||
+ | Для сборки rpm-пакета в системе должен быть установлен rpm-build. Проверить его наличие можно следующей командой: | ||
+ | |||
+ | # rpmbuild --version | ||
+ | |||
+ | Если система возвращает: rpmbuild: команда не найдена, значит rpm-build не установлен. | ||
+ | Для установки необходимо выполнить следующую команду: | ||
+ | |||
+ | # sudo yum install rpm-build | ||
+ | |||
+ | Также вам могут понадобиться пакеты gcc/gcc++ и make (если они ещё не установлен), поэтому сразу же прописываем команду: | ||
+ | |||
+ | # sudo yum install gcc make | ||
+ | |||
+ | ==Подготовка древа каталогов== | ||
+ | |||
+ | Для сборки пакетов в домашнем каталоге пользователя необходимо создать каталог rpmbuild, в которой должны быть следующие подкаталоги: BUILD, RPMS, SOURCES, SPECS, SRPMS. Это можно сделать вручную или командой: | ||
+ | |||
+ | # rpmdev-setuptree | ||
+ | |||
+ | В итоге должна получиться следующая структура: | ||
+ | |||
+ | /home/user/rpmbuild/ | ||
+ | |||
+ | |-- BUILD<br> | ||
+ | |-- RPMS<br> | ||
+ | |-- SOURCES<br> | ||
+ | |-- SPECS<br> | ||
+ | `-- SRPMS | ||
+ | |||
+ | ==Подготовка spec-файла== | ||
+ | |||
+ | Следующий необходимый элемент — это spec-файл, своего рода инструкция, по которой rpm-build производит сборку пакета. | ||
+ | |||
+ | Структура spec-файла подразделяется на заголовки и секции тела. | ||
+ | |||
+ | '''Name''' — базовое имя собираемого пакета, которое должно совпадать с именем spec-файла.<br> | ||
+ | '''Version''' — номер версии пакета.<br> | ||
+ | '''Release''' — релиз-номер пакета. Обычно устанавливают начальное значение в 1% {? Dist} и увеличивают его с каждым новым выпуском пакета.<br> | ||
+ | '''Summary''' — краткое однострочное описание пакета.<br> | ||
+ | '''License''' — лицензия, согласно которой распространяется пакет.<br> | ||
+ | '''URL''' — полный URL для получения дополнительной информации о программе. Чаще всего это веб-сайт исходного проекта.<br> | ||
+ | '''Source0''' — путь или URL-адрес заархивированных файлов исходного кода (тарболов). При необходимости можно добавить дополнительные источники SourceX, увеличивая число каждый раз, например: Source1, Source2, Source3 и т.д.<br> | ||
+ | '''Patch0''' — патчи и исправления для исходного кода. Патчей может быть несколько, как и исходников. Patch1, Patch2, Patch3 и т.д.<br> | ||
+ | '''BuildArch''' — архитектура, под которую будет собран пакет. Если пакет не зависит от архитектуры, например, он написан полностью на интерпретируемом языке программирования, необходимо установить значение BuildArch: noarch. Если значение не установлено, то пакет наследует архитектуру системы, на которой он собирается.<br> | ||
+ | '''BuildRequires''' — раздел, в котором через пробелы или запятые перечисляются все зависимые пакеты, необходимые для сборки нашего пакета. | ||
+ | |||
+ | '''%description''' — полное описание собираемого пакета. Может занимать несколько строк и может быть разбито на абзацы.<br> | ||
+ | '''%prep''' — команда или серия команд для подготовки исходного кода к сборке, например, распаковка архива в Source0. Здесь могут находиться bash-скрипты.<br> | ||
+ | '''%build''' — команды или серия команд из данной секции отвечают за непосредственную сборку пакета.<br> | ||
+ | '''%install''' — команда или серия команд из данной секции отвечают за то, чтобы сделать собранный пакет полностью готовым к установке на пользовательскую систему.<br> | ||
+ | '''%files''' — список файлов, необходимых для сборки пакета.<br> | ||
+ | '''%changelog''' — журнал изменений, произошедших с пакетом от релиза к релизу. | ||
+ | |||
+ | После того, как spec-файл будет готов, его необходимо переместить в каталог SPECS, а исходные коды собираемого пакета, тарболы, в каталог SOURCES. | ||
+ | |||
+ | '''Пример spec-файла''' | ||
+ | |||
+ | Name: example | ||
+ | Version: 1.0 | ||
+ | Release: 1%{?dist} | ||
+ | Summary: Example projeckt | ||
+ | |||
+ | License: GPLv3+ | ||
+ | URL: https://www.example.com/%{name} | ||
+ | Source0: https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz | ||
+ | |||
+ | Patch0: example.patch | ||
+ | |||
+ | BuildRequires: gcc | ||
+ | BuildRequires: make | ||
+ | |||
+ | %description | ||
+ | The long-tail description for our Example projeckt | ||
+ | |||
+ | %prep | ||
+ | %setup -q | ||
+ | |||
+ | %patch0 | ||
+ | |||
+ | %build | ||
+ | make %{?_smp_mflags} | ||
+ | |||
+ | %install | ||
+ | %make_install | ||
+ | |||
+ | %files | ||
+ | %license LICENSE | ||
+ | %{_bindir}/%{name} | ||
+ | %changelog | ||
+ | * Tue Jan 13 2020 User Name <example@example.org> - 1.0-1 | ||
+ | - First example package | ||
+ | |||
+ | ==Сборка пакета== | ||
+ | |||
+ | Теперь можно приступать непосредственно к сборке пакета. Находясь в каталоге SPECS необходимо выполнить следующую команду: | ||
+ | # rpmbuild -ba ваш_spec_файл.spec | ||
+ | Результатом выполнения данной команды (если на предыдущих этапах всё было сделано правильно) будет собранный пакет, и в каталоге RPMS появятся бинарный пакет (ваш_пакет.rpm), а в каталоге SRPMS — исходник (ваш_пакет.src.rpm). | ||
− | + | Если на выходе нужно получить только .rpm файл или только .src.rpm, то '''-ba''' необходимо заменить на '''-bb''' или '''-bs''' соответственно. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Версия 10:37, 13 января 2020
Содержание
Подготовка к сборке rpm-пакетов
RPM-пакет — это просто файл, содержащий другие файлы и информацию о них, необходимую для системы. Менеджер пакетов rpm использует эти метаданные для определения зависимостей, места установки файлов и другой информации.
Существует два типа rpm-пакетов:
- SRPM (исходники с расширением .src.rpm)
- RPM (бинарный файл с расширением .rpm)
Они имеют разное содержимое и служат для разных целей.
SRPM обязательно содержит исходный код, опционально — патчи и spec-файл, который описывает, как собрать исходный код в бинарный RPM. Бинарный RPM содержит бинарные файлы, созданные из исходников и патчей, если таковые имелись.
Сборку rpm-пакетов крайне нежелательно проводить с правами суперпользователя (root). Настоятельно рекомендуется все манипуляции производить с правами непривилегированного пользователя, поскольку при сборке с правами root имеется высокая вероятность повреждения системы.
Для сборки rpm-пакета в системе должен быть установлен rpm-build. Проверить его наличие можно следующей командой:
# rpmbuild --version
Если система возвращает: rpmbuild: команда не найдена, значит rpm-build не установлен. Для установки необходимо выполнить следующую команду:
# sudo yum install rpm-build
Также вам могут понадобиться пакеты gcc/gcc++ и make (если они ещё не установлен), поэтому сразу же прописываем команду:
# sudo yum install gcc make
Подготовка древа каталогов
Для сборки пакетов в домашнем каталоге пользователя необходимо создать каталог rpmbuild, в которой должны быть следующие подкаталоги: BUILD, RPMS, SOURCES, SPECS, SRPMS. Это можно сделать вручную или командой:
# rpmdev-setuptree
В итоге должна получиться следующая структура:
/home/user/rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
Подготовка spec-файла
Следующий необходимый элемент — это spec-файл, своего рода инструкция, по которой rpm-build производит сборку пакета.
Структура spec-файла подразделяется на заголовки и секции тела.
Name — базовое имя собираемого пакета, которое должно совпадать с именем spec-файла.
Version — номер версии пакета.
Release — релиз-номер пакета. Обычно устанавливают начальное значение в 1% {? Dist} и увеличивают его с каждым новым выпуском пакета.
Summary — краткое однострочное описание пакета.
License — лицензия, согласно которой распространяется пакет.
URL — полный URL для получения дополнительной информации о программе. Чаще всего это веб-сайт исходного проекта.
Source0 — путь или URL-адрес заархивированных файлов исходного кода (тарболов). При необходимости можно добавить дополнительные источники SourceX, увеличивая число каждый раз, например: Source1, Source2, Source3 и т.д.
Patch0 — патчи и исправления для исходного кода. Патчей может быть несколько, как и исходников. Patch1, Patch2, Patch3 и т.д.
BuildArch — архитектура, под которую будет собран пакет. Если пакет не зависит от архитектуры, например, он написан полностью на интерпретируемом языке программирования, необходимо установить значение BuildArch: noarch. Если значение не установлено, то пакет наследует архитектуру системы, на которой он собирается.
BuildRequires — раздел, в котором через пробелы или запятые перечисляются все зависимые пакеты, необходимые для сборки нашего пакета.
%description — полное описание собираемого пакета. Может занимать несколько строк и может быть разбито на абзацы.
%prep — команда или серия команд для подготовки исходного кода к сборке, например, распаковка архива в Source0. Здесь могут находиться bash-скрипты.
%build — команды или серия команд из данной секции отвечают за непосредственную сборку пакета.
%install — команда или серия команд из данной секции отвечают за то, чтобы сделать собранный пакет полностью готовым к установке на пользовательскую систему.
%files — список файлов, необходимых для сборки пакета.
%changelog — журнал изменений, произошедших с пакетом от релиза к релизу.
После того, как spec-файл будет готов, его необходимо переместить в каталог SPECS, а исходные коды собираемого пакета, тарболы, в каталог SOURCES.
Пример spec-файла
Name: example Version: 1.0 Release: 1%{?dist} Summary: Example projeckt License: GPLv3+ URL: https://www.example.com/%{name} Source0: https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz Patch0: example.patch BuildRequires: gcc BuildRequires: make %description The long-tail description for our Example projeckt %prep %setup -q %patch0 %build make %{?_smp_mflags} %install %make_install %files %license LICENSE %{_bindir}/%{name} %changelog * Tue Jan 13 2020 User Name <example@example.org> - 1.0-1 - First example package
Сборка пакета
Теперь можно приступать непосредственно к сборке пакета. Находясь в каталоге SPECS необходимо выполнить следующую команду:
# rpmbuild -ba ваш_spec_файл.spec
Результатом выполнения данной команды (если на предыдущих этапах всё было сделано правильно) будет собранный пакет, и в каталоге RPMS появятся бинарный пакет (ваш_пакет.rpm), а в каталоге SRPMS — исходник (ваш_пакет.src.rpm).
Если на выходе нужно получить только .rpm файл или только .src.rpm, то -ba необходимо заменить на -bb или -bs соответственно.