TypicalPackagingErrors/PatchesVsFiles: различия между версиями

Материал из ALT Linux Wiki
мНет описания правки
 
Строка 16: Строка 16:
  > собственных патчей?
  > собственных патчей?


=== Краткая инструкция для "начинающих". ===
=== Краткая инструкция для «начинающих». ===


Распаковать апстримные сырцы. Допустим что они распакованы в папку {{path|name-1.0/}}
Распаковать апстримные исходники. Допустим, что они распакованы в папку {{path|name-1.0/}}


Далее надо зайти в эту папку. Перед изменением каждого файла надо создать его копию с расширением {{term|.orig}}
Далее надо зайти в эту папку. Перед изменением каждого файла надо создать его копию с расширением {{term|.orig}}


То есть например если собираешься менять {{term|Makefile.am}} - надо
То есть например если собираешься менять {{term|Makefile.am}} — надо скопировать его как {{term|Makefile.am.orig}}.
скопировать его как {{term|Makefile.am.orig}}
Я обычно делаю это командой:
Я обычно делаю это командой:


Строка 30: Строка 29:
После чего надо внести во все файлы необходимые изменения.
После чего надо внести во все файлы необходимые изменения.
Можно даже собирать из этой директории, вносить дополнительные
Можно даже собирать из этой директории, вносить дополнительные
изменения по результатам пересборки, и т.д.
изменения по результатам пересборки, и т. д.


Когда изменения будут готовы, наступает самое тяжелое - надо придумать имя для патча.
Когда изменения будут готовы, наступает самое тяжелое — надо придумать имя для патча.


ALT Packaging policy
[[ALT Packaging HOWTO]] рекомендует давать патчам имена, состоящие из имени пакета, версии, «происхождения» и причины патча. Например, имя патча для нашего гипотетического пакета может быть {{term|name-1.0-alt-link-fixes.patch}}
([http://docs.altlinux.ru/alt/devel/ch01.html#id2865952 http://docs.altlinux.ru/alt/devel/ch01.html#id2865952]) рекомендует давать патчам имена, состоящие из имени пакета, версии, "происхождения" и причины патча.


Например, имя патча для нашего гипотетического пакета может быть {{term|name-1.0-alt-link-fixes.patch}}
Тогда надо выйти в «родительскую» директорию (где находится каталог с исходниками {{path|name-1.0/}}) и сказать
 
Тогда надо выйти в "родительскую" директорию (где находится каталог с исходниками {{path|name-1.0/}}) и сказать


  gendiff name-1.0 .orig
  gendiff name-1.0 .orig
Строка 46: Строка 42:
сохраненными ранее файлами {{term|.orig}} и измененными файлами без {{term|.orig}}.
сохраненными ранее файлами {{term|.orig}} и измененными файлами без {{term|.orig}}.


Если нравится что получилось - надо сохранить этот патч как отдельный файл.
Если нравится — надо сохранить этот патч как отдельный файл.


  gendiff name-1.0 .orig > /RPM/SOURCES/name-1.0-alt-link-fixes.patch
  gendiff name-1.0 .orig > /RPM/SOURCES/name-1.0-alt-link-fixes.patch
Строка 60: Строка 56:
2) Собственно, применение патча. Это надо делать в секции {{term|%prep}} после макроса {{term|%setup}}. Желательно скопировать комментарий для патча из верхней части, чтобы было понятно что патч делает и было легко его отключать.
2) Собственно, применение патча. Это надо делать в секции {{term|%prep}} после макроса {{term|%setup}}. Желательно скопировать комментарий для патча из верхней части, чтобы было понятно что патч делает и было легко его отключать.


Для патча, созданного через gendiff - надо написать следующее:
Для патча, созданного через gendiff — надо написать следующее:


  # Name's upsteam don't want my patch, so I place it here.
  # Name's upsteam don't want my patch, so I place it here.
Строка 68: Строка 64:
Где номер 0 соответствует патчу номер 0.
Где номер 0 соответствует патчу номер 0.


Вот собственно и все. Если надо отключить патч, просто замените символ процента в {{term|%patch0}} на символ решетки({{term|#}}). Тогда он станет комментарием.
Вот собственно и все. Если надо отключить патч, просто замените символ процента в {{term|%patch0}} на символ решетки({{term|#}}). Тогда он станет комментарием.


Надеюсь, это маленькое хауту поможет в благородном деле уменьшения количества обработанных напильником программ в вашем многострадальном {{path|/usr/local}}.
Надеюсь, это маленькое хауту поможет в благородном деле уменьшения количества обработанных напильником программ в вашем многострадальном {{path|/usr/local}}.

Текущая версия от 12:07, 12 апреля 2011


Типичные ошибки: почему патчи лучше переписывания файлов

Иногда в пакете возникает необходимость заменить один или несколько файлов на более новые или лучшие версии. Иногда это делают, добавляя в пакет нужный файл целиком и копируя на место оригинала. Лучше так не делать, а изготовить патч, по следующим причинам:

  1. Патчи обычно меньше по размеру, чем целые файлы, потому что содержат только измененные строки и небольшой контекст.
  2. Важные изменения оригинального файла в upstream труднее пропустить, используя патч, т.к. патчи формата diff проверяются на соответствие контекста.

Как делать патчи

Для получения патчей над деревом исходников удобно воспользоваться утилитой gendiff из пакета rpm-build. Сделайте копии оригинальных файлов с выделяющимся суффиксом, например, .orig-gcc34 для патча на сборку с GCC 3.4. Произведя изменения, смените каталог на уровень выше дерева, к которому будет применяться патч, и воспользуйтесь утилитой, указав использованный суффикс:

gendiff mysoftware-0.1.2 .orig-gcc34
> Что лучше почитать перед тем как заниматься изготовлением
> собственных патчей?

Краткая инструкция для «начинающих».

Распаковать апстримные исходники. Допустим, что они распакованы в папку name-1.0/

Далее надо зайти в эту папку. Перед изменением каждого файла надо создать его копию с расширением .orig

То есть например если собираешься менять Makefile.am — надо скопировать его как Makefile.am.orig. Я обычно делаю это командой:

cp src/Makefile.am{,.orig}

После чего надо внести во все файлы необходимые изменения. Можно даже собирать из этой директории, вносить дополнительные изменения по результатам пересборки, и т. д.

Когда изменения будут готовы, наступает самое тяжелое — надо придумать имя для патча.

ALT Packaging HOWTO рекомендует давать патчам имена, состоящие из имени пакета, версии, «происхождения» и причины патча. Например, имя патча для нашего гипотетического пакета может быть name-1.0-alt-link-fixes.patch

Тогда надо выйти в «родительскую» директорию (где находится каталог с исходниками name-1.0/) и сказать

gendiff name-1.0 .orig

На экран будет выведен патч, сгенерированный как разница между сохраненными ранее файлами .orig и измененными файлами без .orig.

Если нравится — надо сохранить этот патч как отдельный файл.

gendiff name-1.0 .orig > /RPM/SOURCES/name-1.0-alt-link-fixes.patch

Затем в спеке надо будет подключить этот патч в двух местах:

1) Запись о патче. Рекомендую расположить ее рядом с тегом Source. Перед патчем желательно поместить какой-нибудь комментарий типа для чего этот патч.

# Name's upsteam don't want my patch, so I place it here.
# This make all plugins properly linked.
Patch0: name-1.0-alt-link-fixes.patch

2) Собственно, применение патча. Это надо делать в секции %prep после макроса %setup. Желательно скопировать комментарий для патча из верхней части, чтобы было понятно что патч делает и было легко его отключать.

Для патча, созданного через gendiff — надо написать следующее:

# Name's upsteam don't want my patch, so I place it here.
# This make all plugins properly linked.
%patch0 -p1

Где номер 0 соответствует патчу номер 0.

Вот собственно и все. Если надо отключить патч, просто замените символ процента в %patch0 на символ решетки(#). Тогда он станет комментарием.

Надеюсь, это маленькое хауту поможет в благородном деле уменьшения количества обработанных напильником программ в вашем многострадальном /usr/local.

Ссылки