05 марта 2026 № 1 (2026)

ROSARIUM

газета советского программиста

Создание SPEC-файла

SPEC-файл — это рецепт сборки пакета. Он описывает: из чего собирать, как собирать, какие файлы включить в пакет, кто автор, какая лицензия и т.д.

Создайте файл ~/rpmbuild/SPECS/hello.spec в любом текстовом редакторе:

# ============================================================
# Преамбула — метаданные пакета
# ============================================================

# Имя пакета. Должно совпадать с именем SPEC-файла (hello.spec → Name: hello).
# По соглашению — строчные буквы, без пробелов.
Name:           hello

# Версия upstream-проекта. Берется из релиза на сайте проекта.
# НЕ придумывайте свою — используйте ту, что на сайте.
Version:        2.12.1

# Номер сборки пакетировщика. Начинается с 1. Увеличивается,
# когда вы меняете SPEC-файл, но upstream-версия остается той же.
# %{?dist} автоматически добавляет суффикс дистрибутива (например, .rosa13.1).
Release:        1%{?dist}

# Краткое описание (одна строка, без точки в конце).
# Показывается в dnf search и в менеджерах пакетов.
Summary:        The classic greeting program from GNU

# Лицензия в формате SPDX. Посмотрите файл COPYING в исходниках.
# GNU Hello распространяется под GPL-3.0 или более поздней.
License:        GPL-3.0-or-later

# Домашняя страница проекта.
URL:            https://www.gnu.org/software/hello/

# Откуда скачать исходный код. rpmbuild НЕ скачивает по этой ссылке —
# он ищет файл по имени в ~/rpmbuild/SOURCES/. Но URL полезен для
# документации и инструментов вроде spectool.
# %{version} автоматически подставляется из тега Version.
Source0:        https://ftp.gnu.org/gnu/hello/hello-%{version}.tar.gz

# Зависимости, необходимые ТОЛЬКО для сборки (не для запуска).
# gcc — компилятор C
# make — система сборки
# gettext — нужен для обработки переводов (файлы .po → .mo)
BuildRequires:  gcc
BuildRequires:  make
BuildRequires:  gettext

# ============================================================
# Полное описание пакета (многострочное)
# ============================================================
%description
The GNU Hello program produces a familiar, friendly greeting.
It allows non-programmers to use a classic computer science tool
which would otherwise be unavailable to them.

This is an example package for learning RPM packaging.

# ============================================================
# %prep — подготовка к сборке
# ============================================================
# Выполняется первой. %autosetup делает три вещи:
# 1. Распаковывает Source0 в ~/rpmbuild/BUILD/hello-2.12.1/
# 2. Переходит (cd) в этот каталог
# 3. Применяет все патчи (Patch0, Patch1 и т.д.), если есть
%prep
%autosetup

# ============================================================
# %build — компиляция
# ============================================================
# %configure запускает ./configure с правильными путями для ROSA:
#   --prefix=/usr --libdir=/usr/lib64 и т.д.
# Это гарантирует, что программа установится в стандартные пути.
#
# %make_build запускает make с флагом параллельной сборки:
#   make -j$(nproc)  (использует все ядра процессора)
%build
%configure
%make_build

# ============================================================
# %install — установка в buildroot
# ============================================================
# ВАЖНО: %make_install НЕ устанавливает в реальную систему!
# Он запускает: make install DESTDIR=%{buildroot}
# Все файлы попадают в ~/rpmbuild/BUILDROOT/hello-2.12.1-1.rosa13.1.x86_64/
# Это «фальшивый корень» — файлы лежат как будто в /, но на самом деле
# в отдельном каталоге. Из него rpmbuild потом собирает RPM.
#
# %find_lang ищет все файлы переводов (.mo) для программы «hello»
# и записывает их пути в файл hello.lang. Потом в %files мы используем
# -f hello.lang, чтобы включить все найденные переводы.
%install
%make_install
%find_lang %{name}

# ============================================================
# %check — запуск тестов
# ============================================================
# Необязательная, но рекомендуемая секция.
# Запускает тесты проекта. Если тесты упадут, сборка остановится.
%check
make check

# ============================================================
# %files — какие файлы включить в RPM
# ============================================================
# Перечисляем ВСЕ файлы, которые %install поставил в buildroot.
# Если что-то забудем — rpmbuild выдаст ошибку.
# Если укажем лишнее — тоже ошибка.
#
# -f %{name}.lang подключает список переводов, сгенерированный %find_lang.
#
# %license — помечает файл как лицензию (устанавливается в /usr/share/licenses/hello/)
# %doc — помечает файлы как документацию (устанавливается в /usr/share/doc/hello/)
# %{_bindir} — макрос, раскрывается в /usr/bin
# %{_mandir} — /usr/share/man
# %{_infodir} — /usr/share/info
%files -f %{name}.lang
%license COPYING
%doc README NEWS AUTHORS ChangeLog THANKS
%{_bindir}/hello
%{_mandir}/man1/hello.1*
%{_infodir}/hello.info*

# ============================================================
# %changelog — история изменений пакета
# ============================================================
# Формат СТРОГИЙ: * день_недели месяц число год Имя <email> - версия-релиз
# Если формат нарушен, rpmbuild откажется собирать.
%changelog
* Mon Feb 03 2025 Your Name <your@email.com> - 2.12.1-1
- Initial package for ROSA Linux

Совет: вы можете сгенерировать заготовку SPEC-файла командой rpmdev-newspec hello — она создаст шаблон с основными секциями. Но для обучения полезнее написать SPEC вручную, понимая каждую строку.