[В ЧаВо] Как создать файл патча
При использовании developer-friendly дистрибутива (в том числе Gentoo) рано или поздно выясняется недостаточность патчей, созданных кем-то где-то.
В ситуации, когда известны необходимые изменения, но нет патча:
Делай раз:
Фиксация исходной точки (дистрибутив, нуждающийся в наложении патча)
tar zxf source.tgz cp -r source source.orig
Делай два:
Внение необходимых исправлений в дистрибутив
cd source vim …
И делай три — промышление собственно патча:
cd .. diff -Naur source.orig source > my-patch.patch
Подробности на русском: http://www.cpqlinux.com/patch.html
И на всякий случай пару слов о наложении патчей.
Начиная с EAPI=5
в portage
появилась функция epatch_user()
.
За подробностями к офф. Вике уже в HandBook: https://wiki.gentoo.org/wiki/Handbook:AMD64/Portage/Advanced#Applying_non-standard_patches
Вкратце: для наложения патча достаточно просто в предварительно созданный каталог /etc/portage/patches/${CATEGORY}/${PN}
(в качестве имени пакета также можно использовать ${P}
или ${PF}
) положить файл (или файлы) патчей. И пересобрать пакет.
Но даже если ебилд не поддерживает epatch_user()
(EAPI < 5
), задача сохраняет свойство решаемости.
Для этого используется другая фича: per-package bashrc. Претендующее на достаточность описание — http://megabaks.blogspot.co.uk/2012/10/portage.html
Вкратце: в каталоге /etc/portage/env/
создаётся файл /etc/portage/env/${CATEGORY}/${PN}
примерно следующего содержания:
pre_src_prepare () { EPATCH_SOURCE="/etc/portage/patches.rc/${CATEGORY}/${PN}/" \ EPATCH_SUFFIX="patch" \ EPATCH_FORCE="yes" epatch }
После чего, как нетрудно догадаться, создаётся каталог /etc/portage/patches.rc/${CATEGORY}/${PN}/
(имя patches.rc
выбрано из соображений отсутствия коллизии с стандартным путём epatch_user()
), в который кладутся файл(ы) патча(ей). После чего пакет очевидным образом пересобирается.
В результате получаем profit в форме наложения практически пользовательских патчей в ебилде, данную фичу не поддерживающем.
ЗЫ: Описанное работает в sys-apps/portage-2.2.8-r1
.
- Для комментирования войдите или зарегистрируйтесь
А мне нравится вариант с git:
Фиксация исходной точки:
Внение необходимых исправлений в дистрибутив:
Собственно патч:
С git всё это удобно проделывать прямо в /var/tmp/portage/…, добиваясь, например, через ebuild … compile отсутствия ошибок при сборке пакета, без лишних копирований исходного кода.
1. Скобки надо закрывать2.
1. Скобки надо закрывать
2. Для одного патча достаточно pre_src_prepare () { epatch wherever/my.patch }
3. Рекомендованный -Naur часто недостаточен, особенно если редактор производит обрезку пробелов в конце, переформатирование tab/whitespace. Поэтому можно уверенно рекомендовать -Z, --ignore-trailing-space (ignore white space at line end), а также в большинстве случаев и -E, --ignore-tab-expansion (ignore changes due to tab expansion).
P.S. а почему именно vim? :D
.
Да, спасибо.
Можно.
Но в ситуации, когда одного патча внезапно оказывается недостаточно вариант с «положить недостающий патч в каталог» проще.
А ещё лично мне не очень нравится жёсткая завязка на имя файла патча.
Возможная ситуация.
Но не помешало бы конкретики: предлагаемые варианты дополняют приведённую строку опций? Или заменяют? Полностью альбо частично (в последнем случае: что именно)?
Потому что стандарт! ☺
Но лично тебе разрешаю использовать
sys-apps/ed
.:wq
--
Live free or die
Возможная ситуация. Но не
Не могу не поддаться искушению отправить читать ман и думать головой. Но все же поясню: дополняют. Ибо в противном случае можно получить патч огромного размера, все отличие которого будет в пробелах до и после значимой части строки.
Дай догадаюсь… Это стандарт тов. Кропоткина? :D
/
В тырпрайсе предлагают следующий вариант:
openldap-slapd-conf.patch
::wq
--
Live free or die
Начиная с EAPI=5 в portage
Вы всё врёти. epatch_user был с волосатых времен, только раньше в eutils.eclass
и его надо было специально в
и его надо было специально в ебилде вызывать, для использования.