Практикум 1: Простая C-программа
Пошаговая упаковка GNU Hello — классический пример для изучения основ.
В этом практикуме мы упакуем GNU Hello — простую программу, которая идеально подходит для первого опыта. Мы пройдем весь путь от скачивания исходников до готового RPM-пакета и разберем каждый шаг максимально подробно, чтобы вы понимали не только что делать, но и почему.
Что вы узнаете
- Полный цикл упаковки от начала до конца
- Работу с системой сборки Autotools (configure/make)
- Базовую структуру SPEC-файла — с объяснением каждой строки
- Проверку качества с rpmlint
- Как находить и исправлять типичные ошибки новичков
- Что происходит «за кулисами» при сборке RPM
О проекте
GNU Hello — это «Hello, World!» от GNU Project. Несмотря на простоту, он демонстрирует все стандарты GNU:
- Autotools-сборка (configure/make/make install)
- Интернационализация (i18n) — переводы на десятки языков
- Man и info документация
- Полный набор стандартных файлов (COPYING, README, NEWS, AUTHORS и т.д.)
Именно поэтому GNU Hello используется как эталон для обучения упаковке — он маленький, но «настоящий».
Что такое Autotools и зачем это нужно
Прежде чем собирать пакет, давайте разберемся, что такое Autotools — система сборки, которую использует GNU Hello (и сотни других проектов).
Autotools — это набор инструментов GNU для автоматизации сборки ПО на разных Unix-системах.
Когда вы видите в архиве файл configure, это значит, что проект использует Autotools.
Цикл сборки Autotools-проекта всегда одинаковый:
./configure # Проверяет систему: есть ли нужный компилятор, библиотеки и т.д.
# Создает Makefile, подставляя правильные пути для ВАШЕЙ системы
make # Компилирует программу по правилам из Makefile
make install # Копирует скомпилированные файлы в нужные каталоги системы
Зачем это нужно? Представьте, что программа должна работать и на Debian, и на Fedora,
и на macOS, и на FreeBSD. У каждой системы свои пути, свои версии библиотек, свои особенности.
Скрипт configure автоматически определяет все это и настраивает сборку.
В RPM-упаковке мы не вызываем эти команды напрямую — вместо них используем макросы:
%configureвместо./configure(макрос автоматически подставляет правильные пути ROSA)%make_buildвместоmake(добавляет параллельную сборку-j$(nproc))%make_installвместоmake install(устанавливает в%{buildroot}, а не в реальную систему)