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

ROSARIUM

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

Создание патчей

На этой странице

Шаг 1: Подготовка окружения

sudo dnf install rpm-build rpmdevtools rpmlint gcc make \
    autoconf automake libtool git \
    ncurses-devel libsensors-devel
rpmdev-setuptree

Пакеты ncurses-devel и libsensors-devel — зависимости htop для сборки. git нужен для создания патчей. autoconf, automake, libtool — для перегенерации Autotools-файлов, если мы правим configure.ac.

Шаг 2: Скачивание исходников

cd ~/rpmbuild/SOURCES

export VER=3.3.0

curl -L -o htop-${VER}.tar.gz \
  https://github.com/htop-dev/htop/archive/refs/tags/${VER}.tar.gz

Проверьте:

tar tzf htop-${VER}.tar.gz | head -10

Ожидаемый вывод:

htop-3.3.0/
htop-3.3.0/.github/
htop-3.3.0/AUTHORS
htop-3.3.0/COPYING
htop-3.3.0/ChangeLog
htop-3.3.0/Makefile.am
htop-3.3.0/README
htop-3.3.0/configure.ac
htop-3.3.0/htop.c
...

Шаг 3: Воспроизведение проблемы

Допустим, наша задача: htop использует -Werror, и на новой версии GCC сборка падает из-за нового предупреждения. Найдём -Werror:

cd /tmp
tar xzf ~/rpmbuild/SOURCES/htop-${VER}.tar.gz
cd htop-${VER}

grep -rn '\-Werror' .

Возможный вывод:

./configure.ac:52:  [AC_DEFINE(...)]
./Makefile.am:15:AM_CFLAGS = -Werror

Или -Werror может быть в configure.ac внутри AC_CHECK-макросов. Если -Werror не найден в данной версии, мы создадим учебный патч с другим полезным изменением (например, изменим дефолтный файл конфигурации).

Шаг 4: Создание патча через git

Это рекомендуемый рабочий процесс создания патча:

cd /tmp/htop-${VER}

# Шаг 4.1: Инициализируем git-репозиторий с «чистыми» исходниками
git init
git add .
git commit -m "Import htop ${VER} pristine sources"

Ожидаемый вывод:

Initialized empty Git repository in /tmp/htop-3.3.0/.git/
[master (root-commit) abc1234] Import htop 3.3.0 pristine sources
 185 files changed, 52431 insertions(+)

Теперь у нас есть «точка отсчёта» — чистые исходники, как в архиве.

# Шаг 4.2: Вносим изменения
# Например, убираем -Werror из Makefile.am (если он есть):
sed -i 's/-Werror//g' Makefile.am

# Или правим configure.ac:
sed -i 's/-Werror//g' configure.ac

Важное правило: правьте исходные файлы (configure.ac, Makefile.am), а не сгенерированные (configure, Makefile.in). Сгенерированные файлы будут пересозданы через autoreconf.

# Шаг 4.3: Просмотрите изменения перед коммитом
git diff

Ожидаемый вывод (примерный):

diff --git a/configure.ac b/configure.ac
index a1b2c3d..e4f5g6h 100644
--- a/configure.ac
+++ b/configure.ac
@@ -50,7 +50,7 @@
-AM_CFLAGS="$AM_CFLAGS -Werror"
+AM_CFLAGS="$AM_CFLAGS"

Убедитесь, что изменения минимальны и правильны.

# Шаг 4.4: Коммитим изменение
git add -A
git commit -m "Disable -Werror for distribution builds

-Werror causes build failures with newer GCC versions due to
new warnings. This is not appropriate for distribution packages
where compiler versions may vary."

Описание коммита войдёт в патч-файл — пишите понятно.

# Шаг 4.5: Генерируем патч
git format-patch -1 --stdout > ~/rpmbuild/SOURCES/0001-Disable-Werror-for-distribution-builds.patch

Проверьте содержимое патча:

cat ~/rpmbuild/SOURCES/0001-Disable-Werror-for-distribution-builds.patch

Ожидаемый вывод:

From abc1234def5678 Mon Sep 17 00:00:00 2001
From: Your Name <your@email.com>
Date: Sat, 8 Feb 2026 12:00:00 +0300
Subject: [PATCH] Disable -Werror for distribution builds

-Werror causes build failures with newer GCC versions due to
new warnings. This is not appropriate for distribution packages
where compiler versions may vary.
---
 configure.ac | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/configure.ac b/configure.ac
index a1b2c3d..e4f5g6h 100644
--- a/configure.ac
+++ b/configure.ac
@@ -50,7 +50,7 @@
...

Обратите внимание на структуру:

  • Метаданные (From, Date, Subject)
  • Описание
  • Статистика изменений
  • Собственно diff

Шаг 5: Именование патчей

Соглашения об именовании

0001-Disable-Werror-for-distribution-builds.patch    ← git format-patch стиль
0002-Fix-build-with-gcc14.patch                       ← следующий патч
0003-Backport-fix-for-CVE-2025-12345.patch           ← бэкпорт безопасности

Нумерация важна: патчи применяются в порядке номеров Patch0, Patch1, … Совпадение нумерации в имени файла и тегах SPEC упрощает навигацию.

Другие распространённые стили именования:

htop-3.3.0-disable-werror.patch          ← с именем пакета и версией
htop-rosa-default-config.patch           ← дистрибутив-специфичный
htop-backport-abc1234.patch              ← с хешом коммита upstream