🧩 Патчи, исходники и версии
🎯 Цель раздела
После изучения этого раздела вы:
- научитесь работать с исходным кодом пакета;
- поймёте, как создавать и применять патчи;
- освоите правила обновления версии и релиза;
- узнаете, как поддерживать пакет в актуальном состоянии.
📦 Исходники и их хранение
Исходники пакета (обычно .tar.gz или .tar.xz) лежат в директории:
~/rpmbuild/SOURCES/
Они загружаются в Automated Build Farm (ABF) вместе с .spec и патчами.
При сборке rpmbuild автоматически распаковывает указанный архив в секции %prep:
Source0: hello-1.0.tar.gz
Проверка исходников
Чтобы убедиться, что исходники корректны:
tar tzf ~/rpmbuild/SOURCES/hello-1.0.tar.gz
🧵 Что такое патч
Патч (diff) — это файл, описывающий изменения в исходном коде.
Он создаётся командой diff и применяется в секции %prep.
Пример:
diff -u old/hello.c new/hello.c > hello-fix-greeting.patch
Содержимое:
--- old/hello.c
+++ new/hello.c
@@ -1,5 +1,5 @@
#include <stdio.h>
int main() {
- printf("Hello, ROSA!\n");
+ printf("Hello, World from ROSA Linux!\n");
return 0;
}
🧱 Применение патча в SPEC-файле
Добавьте патч в заголовок SPEC:
Patch0: hello-fix-greeting.patch
А затем примените его в секции %prep:
%prep
%setup -q
%patch0 -p1
💡 Флаг
-p1указывает, сколько уровней каталогов нужно отбросить при применении патча. Обычно используется-p1.
🧰 Проверка патча вручную
Перед сборкой можно проверить, применится ли патч корректно:
cd ~/rpmbuild/BUILD/hello-1.0
patch -p1 < ~/rpmbuild/SOURCES/hello-fix-greeting.patch
Если вывод содержит patching file ... без ошибок — всё хорошо.
🔄 Обновление версии и релиза
При обновлении версии программы:
- Измените
Version:в SPEC-файле; - Обновите архив в
SOURCES; - Обновите запись в
%changelog.
Пример:
Version: 1.1
Release: 1%{?dist}
%changelog
* Thu Oct 30 2025 Sergey Braumann <sergeybraumann@gmail.com> 1.1-1
- Updated to upstream version 1.1
⚠️ Release увеличивается при каждом изменении SPEC или патчей, а Version — только при обновлении исходного ПО.
🧩 Пример: исправляем ошибку в пакете
Допустим, в hello.c опечатка — напечатано Helloo.
1. Измените код
tar xf hello-1.0.tar.gz
cd hello-1.0
sed -i 's/Helloo/Hello/g' hello.c
2. Создайте патч
diff -u ../hello-1.0.orig/hello.c hello.c > ../hello-fix-typo.patch
3. Добавьте патч в SPEC
Patch1: hello-fix-typo.patch
...
%patch1 -p1
4. Соберите заново
rpmbuild -ba SPECS/hello.spec
🧱 Поддержка нескольких патчей
Порядок важен — патчи применяются в том порядке, как они перечислены в SPEC.
Patch0: fix-path.patch
Patch1: fix-typo.patch
Patch2: remove-debug.patch
%prep
%setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
📘 Рекомендуется именовать патчи осмысленно, например:
fix-crash-gtk.patch,add-systemd-service.patch,update-license.patch.
🧩 Пример типового обновления версии
Было:
Version: 1.0
Release: 2%{?dist}
Source0: hello-1.0.tar.gz
Стало:
Version: 1.1
Release: 1%{?dist}
Source0: hello-1.1.tar.gz
Проверяем, что новый архив совпадает:
ls ~/rpmbuild/SOURCES/hello-1.1.tar.gz
🧠 Мини-тест для самопроверки
| Вопрос | Ответ |
|---|---|
Что делает %patch0 -p1? | Применяет первый патч к исходникам |
| Где хранятся исходники пакета? | В ~/rpmbuild/SOURCES/ |
Когда нужно увеличивать Release? | При изменении SPEC или патчей |
| Как создаётся патч? | diff -u старый новый > файл.patch |
| Зачем патчи в ABF? | Для адаптации исходников под ROSA без изменения апстрима |
🧭 Итого
Теперь вы:
- умеете создавать и применять патчи;
- понимаете структуру и назначение секции
%prep; - знаете, как обновлять версии и релизы;
- готовы к следующему шагу — управлению зависимостями и оптимизацией SPEC-файла.
Следующий документ — “Зависимости и улучшение SPEC” — покажет, как описывать зависимости, управлять скриптами установки и писать “чистый” SPEC-файл.